From: Ying X. <yin...@wi...> - 2019-02-18 09:09:23
|
On 2/13/19 4:18 PM, Tung Nguyen wrote: > This commit replaces schedule_timeout() with wait_woken() > in function tipc_wait_for_rcvmsg(). wait_woken() uses > memory barriers in its implementation to avoid potential > race condition when putting a process into sleeping state > and then waking it up. > > Signed-off-by: Tung Nguyen <tun...@de...> Acked-by: Ying Xue <yin...@wi...> > --- > net/tipc/socket.c | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > > diff --git a/net/tipc/socket.c b/net/tipc/socket.c > index 81b87916a0eb..684f2125fc6b 100644 > --- a/net/tipc/socket.c > +++ b/net/tipc/socket.c > @@ -1677,7 +1677,7 @@ static void tipc_sk_send_ack(struct tipc_sock *tsk) > static int tipc_wait_for_rcvmsg(struct socket *sock, long *timeop) > { > struct sock *sk = sock->sk; > - DEFINE_WAIT(wait); > + DEFINE_WAIT_FUNC(wait, woken_wake_function); > long timeo = *timeop; > int err = sock_error(sk); > > @@ -1685,15 +1685,17 @@ static int tipc_wait_for_rcvmsg(struct socket *sock, long *timeop) > return err; > > for (;;) { > - prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); > if (timeo && skb_queue_empty(&sk->sk_receive_queue)) { > if (sk->sk_shutdown & RCV_SHUTDOWN) { > err = -ENOTCONN; > break; > } > + add_wait_queue(sk_sleep(sk), &wait); > release_sock(sk); > - timeo = schedule_timeout(timeo); > + timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo); > + sched_annotate_sleep(); > lock_sock(sk); > + remove_wait_queue(sk_sleep(sk), &wait); > } > err = 0; > if (!skb_queue_empty(&sk->sk_receive_queue)) > @@ -1709,7 +1711,6 @@ static int tipc_wait_for_rcvmsg(struct socket *sock, long *timeop) > if (err) > break; > } > - finish_wait(sk_sleep(sk), &wait); > *timeop = timeo; > return err; > } > |