diff options
author | WANG Cong <xiyou.wangcong@gmail.com> | 2016-11-11 13:20:50 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-11-14 13:17:21 -0500 |
commit | d9dc8b0f8b4ec8cdc48ad5a20a3105387138be82 (patch) | |
tree | a28c86da1c3ba7fef0f3fa82a5c7fc5bbb6fe2bf /net/tipc/socket.c | |
parent | 7d384846b9987f7b611357adf3cdfecfdcf0c402 (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.c | 24 |
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 | ||
877 | static int tipc_wait_for_sndmsg(struct socket *sock, long *timeo_p) | 877 | static 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 | ||
1032 | static int tipc_wait_for_sndpkt(struct socket *sock, long *timeo_p) | 1032 | static 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 | ||
1930 | static int tipc_wait_for_connect(struct socket *sock, long *timeo_p) | 1930 | static 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 | } |