Commit 75031151 authored by Ying Xue's avatar Ying Xue Committed by Paul Gortmaker

tipc: wake up all waiting threads at socket shutdown

When a socket is shut down, we should wake up all thread sleeping on
it, instead of just one of them. Otherwise, when several threads are
polling the same socket, and one of them does shutdown(), the
remaining threads may end up sleeping forever.

Also, to align socket usage with common practice in other stacks, we
use one of the common socket callback handlers, sk_state_change(),
to wake up pending users. This is similar to the usage in e.g.
inet_shutdown(). [net/ipv4/af_inet.c].
Signed-off-by: default avatarYing Xue <ying.xue@windriver.com>
Signed-off-by: default avatarJon Maloy <jon.maloy@ericsson.com>
Signed-off-by: default avatarPaul Gortmaker <paul.gortmaker@windriver.com>
parent c4fc298a
...@@ -1595,10 +1595,11 @@ static int shutdown(struct socket *sock, int how) ...@@ -1595,10 +1595,11 @@ static int shutdown(struct socket *sock, int how)
case SS_DISCONNECTING: case SS_DISCONNECTING:
/* Discard any unreceived messages; wake up sleeping tasks */ /* Discard any unreceived messages */
discard_rx_queue(sk); discard_rx_queue(sk);
if (waitqueue_active(sk_sleep(sk)))
wake_up_interruptible(sk_sleep(sk)); /* Wake up anyone sleeping in poll */
sk->sk_state_change(sk);
res = 0; res = 0;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment