aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/socket.c
diff options
context:
space:
mode:
authorWANG Cong <xiyou.wangcong@gmail.com>2016-11-11 13:20:50 -0500
committerDavid S. Miller <davem@davemloft.net>2016-11-14 13:17:21 -0500
commitd9dc8b0f8b4ec8cdc48ad5a20a3105387138be82 (patch)
treea28c86da1c3ba7fef0f3fa82a5c7fc5bbb6fe2bf /net/tipc/socket.c
parent7d384846b9987f7b611357adf3cdfecfdcf0c402 (diff)
net: fix sleeping for sk_wait_event()
Similar to commit 14135f30e33c ("inet: fix sleeping inside inet_wait_for_connect()"), sk_wait_event() needs to fix too, because release_sock() is blocking, it changes the process state back to running after sleep, which breaks the previous prepare_to_wait(). Switch to the new wait API. Cc: Eric Dumazet <eric.dumazet@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/socket.c')
-rw-r--r--net/tipc/socket.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index 149396366e80..22d92f0ec5ac 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -876,9 +876,9 @@ exit:
876 876
877static int tipc_wait_for_sndmsg(struct socket *sock, long *timeo_p) 877static int tipc_wait_for_sndmsg(struct socket *sock, long *timeo_p)
878{ 878{
879 DEFINE_WAIT_FUNC(wait, woken_wake_function);
879 struct sock *sk = sock->sk; 880 struct sock *sk = sock->sk;
880 struct tipc_sock *tsk = tipc_sk(sk); 881 struct tipc_sock *tsk = tipc_sk(sk);
881 DEFINE_WAIT(wait);
882 int done; 882 int done;
883 883
884 do { 884 do {
@@ -892,9 +892,9 @@ static int tipc_wait_for_sndmsg(struct socket *sock, long *timeo_p)
892 if (signal_pending(current)) 892 if (signal_pending(current))
893 return sock_intr_errno(*timeo_p); 893 return sock_intr_errno(*timeo_p);
894 894
895 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); 895 add_wait_queue(sk_sleep(sk), &wait);
896 done = sk_wait_event(sk, timeo_p, !tsk->link_cong); 896 done = sk_wait_event(sk, timeo_p, !tsk->link_cong, &wait);
897 finish_wait(sk_sleep(sk), &wait); 897 remove_wait_queue(sk_sleep(sk), &wait);
898 } while (!done); 898 } while (!done);
899 return 0; 899 return 0;
900} 900}
@@ -1031,9 +1031,9 @@ new_mtu:
1031 1031
1032static int tipc_wait_for_sndpkt(struct socket *sock, long *timeo_p) 1032static int tipc_wait_for_sndpkt(struct socket *sock, long *timeo_p)
1033{ 1033{
1034 DEFINE_WAIT_FUNC(wait, woken_wake_function);
1034 struct sock *sk = sock->sk; 1035 struct sock *sk = sock->sk;
1035 struct tipc_sock *tsk = tipc_sk(sk); 1036 struct tipc_sock *tsk = tipc_sk(sk);
1036 DEFINE_WAIT(wait);
1037 int done; 1037 int done;
1038 1038
1039 do { 1039 do {
@@ -1049,12 +1049,12 @@ static int tipc_wait_for_sndpkt(struct socket *sock, long *timeo_p)
1049 if (signal_pending(current)) 1049 if (signal_pending(current))
1050 return sock_intr_errno(*timeo_p); 1050 return sock_intr_errno(*timeo_p);
1051 1051
1052 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); 1052 add_wait_queue(sk_sleep(sk), &wait);
1053 done = sk_wait_event(sk, timeo_p, 1053 done = sk_wait_event(sk, timeo_p,
1054 (!tsk->link_cong && 1054 (!tsk->link_cong &&
1055 !tsk_conn_cong(tsk)) || 1055 !tsk_conn_cong(tsk)) ||
1056 !tipc_sk_connected(sk)); 1056 !tipc_sk_connected(sk), &wait);
1057 finish_wait(sk_sleep(sk), &wait); 1057 remove_wait_queue(sk_sleep(sk), &wait);
1058 } while (!done); 1058 } while (!done);
1059 return 0; 1059 return 0;
1060} 1060}
@@ -1929,8 +1929,8 @@ xmit:
1929 1929
1930static int tipc_wait_for_connect(struct socket *sock, long *timeo_p) 1930static int tipc_wait_for_connect(struct socket *sock, long *timeo_p)
1931{ 1931{
1932 DEFINE_WAIT_FUNC(wait, woken_wake_function);
1932 struct sock *sk = sock->sk; 1933 struct sock *sk = sock->sk;
1933 DEFINE_WAIT(wait);
1934 int done; 1934 int done;
1935 1935
1936 do { 1936 do {
@@ -1942,10 +1942,10 @@ static int tipc_wait_for_connect(struct socket *sock, long *timeo_p)
1942 if (signal_pending(current)) 1942 if (signal_pending(current))
1943 return sock_intr_errno(*timeo_p); 1943 return sock_intr_errno(*timeo_p);
1944 1944
1945 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); 1945 add_wait_queue(sk_sleep(sk), &wait);
1946 done = sk_wait_event(sk, timeo_p, 1946 done = sk_wait_event(sk, timeo_p,
1947 sk->sk_state != TIPC_CONNECTING); 1947 sk->sk_state != TIPC_CONNECTING, &wait);
1948 finish_wait(sk_sleep(sk), &wait); 1948 remove_wait_queue(sk_sleep(sk), &wait);
1949 } while (!done); 1949 } while (!done);
1950 return 0; 1950 return 0;
1951} 1951}