tipc: wake up all waiting threads at socket shutdown
authorYing Xue <ying.xue@windriver.com>
Mon, 29 Oct 2012 13:38:15 +0000 (09:38 -0400)
committerPaul Gortmaker <paul.gortmaker@windriver.com>
Thu, 22 Nov 2012 01:06:29 +0000 (20:06 -0500)
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: Ying Xue <ying.xue@windriver.com>
Signed-off-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
net/tipc/socket.c

index 59adc76905e0d022211f68056175041fde326c4d..1a720c86e80a2e3a698b9d95ea7c7539a7a2f02a 100644 (file)
@@ -1595,10 +1595,11 @@ restart:
 
        case SS_DISCONNECTING:
 
-               /* Discard any unreceived messages; wake up sleeping tasks */
+               /* Discard any unreceived messages */
                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;
                break;