[TIPC]: Cosmetic cleanup of TIPC polling logic
This patch eliminates an unnecessary poll-related routine by merging it into TIPC's main polling routine, and updates the comments associated with this code. Signed-off-by: Allan Stephens <allan.stephens@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
67727184f2
commit
9b674e82b7
@@ -101,44 +101,6 @@ static void sock_unlock(struct tipc_sock* tsock)
|
|||||||
spin_unlock_bh(tsock->p->lock);
|
spin_unlock_bh(tsock->p->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* pollmask - determine the current set of poll() events for a socket
|
|
||||||
* @sock: socket structure
|
|
||||||
*
|
|
||||||
* TIPC sets the returned events as follows:
|
|
||||||
* a) POLLRDNORM and POLLIN are set if the socket's receive queue is non-empty
|
|
||||||
* or if a connection-oriented socket is does not have an active connection
|
|
||||||
* (i.e. a read operation will not block).
|
|
||||||
* b) POLLOUT is set except when a socket's connection has been terminated
|
|
||||||
* (i.e. a write operation will not block).
|
|
||||||
* c) POLLHUP is set when a socket's connection has been terminated.
|
|
||||||
*
|
|
||||||
* IMPORTANT: The fact that a read or write operation will not block does NOT
|
|
||||||
* imply that the operation will succeed!
|
|
||||||
*
|
|
||||||
* Returns pollmask value
|
|
||||||
*/
|
|
||||||
|
|
||||||
static u32 pollmask(struct socket *sock)
|
|
||||||
{
|
|
||||||
u32 mask;
|
|
||||||
|
|
||||||
if ((skb_queue_len(&sock->sk->sk_receive_queue) != 0) ||
|
|
||||||
(sock->state == SS_UNCONNECTED) ||
|
|
||||||
(sock->state == SS_DISCONNECTING))
|
|
||||||
mask = (POLLRDNORM | POLLIN);
|
|
||||||
else
|
|
||||||
mask = 0;
|
|
||||||
|
|
||||||
if (sock->state == SS_DISCONNECTING)
|
|
||||||
mask |= POLLHUP;
|
|
||||||
else
|
|
||||||
mask |= POLLOUT;
|
|
||||||
|
|
||||||
return mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* advance_queue - discard first buffer in queue
|
* advance_queue - discard first buffer in queue
|
||||||
* @tsock: TIPC socket
|
* @tsock: TIPC socket
|
||||||
@@ -390,15 +352,47 @@ static int get_name(struct socket *sock, struct sockaddr *uaddr,
|
|||||||
* @sock: socket for which to calculate the poll bits
|
* @sock: socket for which to calculate the poll bits
|
||||||
* @wait: ???
|
* @wait: ???
|
||||||
*
|
*
|
||||||
* Returns the pollmask
|
* Returns pollmask value
|
||||||
|
*
|
||||||
|
* COMMENTARY:
|
||||||
|
* It appears that the usual socket locking mechanisms are not useful here
|
||||||
|
* since the pollmask info is potentially out-of-date the moment this routine
|
||||||
|
* exits. TCP and other protocols seem to rely on higher level poll routines
|
||||||
|
* to handle any preventable race conditions, so TIPC will do the same ...
|
||||||
|
*
|
||||||
|
* TIPC sets the returned events as follows:
|
||||||
|
* a) POLLRDNORM and POLLIN are set if the socket's receive queue is non-empty
|
||||||
|
* or if a connection-oriented socket is does not have an active connection
|
||||||
|
* (i.e. a read operation will not block).
|
||||||
|
* b) POLLOUT is set except when a socket's connection has been terminated
|
||||||
|
* (i.e. a write operation will not block).
|
||||||
|
* c) POLLHUP is set when a socket's connection has been terminated.
|
||||||
|
*
|
||||||
|
* IMPORTANT: The fact that a read or write operation will not block does NOT
|
||||||
|
* imply that the operation will succeed!
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static unsigned int poll(struct file *file, struct socket *sock,
|
static unsigned int poll(struct file *file, struct socket *sock,
|
||||||
poll_table *wait)
|
poll_table *wait)
|
||||||
{
|
{
|
||||||
poll_wait(file, sock->sk->sk_sleep, wait);
|
struct sock *sk = sock->sk;
|
||||||
/* NEED LOCK HERE? */
|
u32 mask;
|
||||||
return pollmask(sock);
|
|
||||||
|
poll_wait(file, sk->sk_sleep, wait);
|
||||||
|
|
||||||
|
if (!skb_queue_empty(&sk->sk_receive_queue) ||
|
||||||
|
(sock->state == SS_UNCONNECTED) ||
|
||||||
|
(sock->state == SS_DISCONNECTING))
|
||||||
|
mask = (POLLRDNORM | POLLIN);
|
||||||
|
else
|
||||||
|
mask = 0;
|
||||||
|
|
||||||
|
if (sock->state == SS_DISCONNECTING)
|
||||||
|
mask |= POLLHUP;
|
||||||
|
else
|
||||||
|
mask |= POLLOUT;
|
||||||
|
|
||||||
|
return mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user