summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller2019-02-21 22:58:05 +0100
committerDavid S. Miller2019-02-21 22:58:05 +0100
commit06cd1702eeb0a79de03f3088ccf4c65f6dfeeaf5 (patch)
tree2ebebb66de46f9d47e2a65ce00b93da76c7a69d9
parentbonding: fix PACKET_ORIGDEV regression (diff)
parenttipc: improve function tipc_wait_for_rcvmsg() (diff)
downloadkernel-qcow2-linux-06cd1702eeb0a79de03f3088ccf4c65f6dfeeaf5.tar.gz
kernel-qcow2-linux-06cd1702eeb0a79de03f3088ccf4c65f6dfeeaf5.tar.xz
kernel-qcow2-linux-06cd1702eeb0a79de03f3088ccf4c65f6dfeeaf5.zip
Merge branch 'tipc-improvement-for-wait-and-wakeup'
Tung Nguyen says: ==================== tipc: improvement for wait and wakeup Some improvements for tipc_wait_for_xzy(). ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/tipc/socket.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index 1217c90a363b..684f2125fc6b 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -388,7 +388,7 @@ static int tipc_sk_sock_err(struct socket *sock, long *timeout)
rc_ = tipc_sk_sock_err((sock_), timeo_); \
if (rc_) \
break; \
- prepare_to_wait(sk_sleep(sk_), &wait_, TASK_INTERRUPTIBLE); \
+ add_wait_queue(sk_sleep(sk_), &wait_); \
release_sock(sk_); \
*(timeo_) = wait_woken(&wait_, TASK_INTERRUPTIBLE, *(timeo_)); \
sched_annotate_sleep(); \
@@ -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;
}