aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
authorYing Xue <ying.xue@windriver.com>2012-10-29 09:38:15 -0400
committerPaul Gortmaker <paul.gortmaker@windriver.com>2012-11-21 20:06:29 -0500
commit7503115107e5862870eaf5133627051b2e23ac0a (patch)
tree162b06a086e3adffc182da349179b9a69de89f21 /net/tipc
parentc4fc298ab44011a7f7a391bf00350acf481eeaeb (diff)
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: Ying Xue <ying.xue@windriver.com> Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/socket.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index 59adc76905e0..1a720c86e80a 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -1595,10 +1595,11 @@ restart:
1595 1595
1596 case SS_DISCONNECTING: 1596 case SS_DISCONNECTING:
1597 1597
1598 /* Discard any unreceived messages; wake up sleeping tasks */ 1598 /* Discard any unreceived messages */
1599 discard_rx_queue(sk); 1599 discard_rx_queue(sk);
1600 if (waitqueue_active(sk_sleep(sk))) 1600
1601 wake_up_interruptible(sk_sleep(sk)); 1601 /* Wake up anyone sleeping in poll */
1602 sk->sk_state_change(sk);
1602 res = 0; 1603 res = 0;
1603 break; 1604 break;
1604 1605