: Fix unicast timeouts
Subsystems (2)
[NETLINK]: Fix unicast timeouts
Commit ed6dcf4a in the history.git tree broke netlink_unicast timeouts by moving the schedule_timeout() call to a new function that doesn't propagate the remaining timeout back to the caller. This means on each retry we start with the full timeout again.
ipc/mqueue.c seems to actually want to wait indefinitely so this behaviour is retained.
---
commit 251299cd3683f06b5b690e6a3bdd14133303ab2a
tree 3fd85bdae19d5f29efe09c328fa2defac9facd6b
parent b4f555081fdd27d13e6ff39d455d5aefae9d2c0c
author Patrick McHardy <[email protected]> Sun, 04 Nov 2007 17:52:19 +0100 committer Patrick McHardy <[email protected]> Sun, 04 Nov 2007 17:52:19 +0100
include/linux/netlink.h | 2 +- ipc/mqueue.c | 6 ++++-- net/netlink/af_netlink.c | 10 +++++----- 3 files changed, 10 insertions(+), 8 deletions(-)
include/linux/netlink.h +1 -1
@@ -192,7 +192,7 @@ extern int netlink_unregister_notifier(struct notifier_block *nb);/* finegrained unicast helpers: */ struct sock *netlink_getsockbyfilp (struct file *filp);int netlink_attachskb (struct sock *sk,struct sk_buff *skb,int nonblock, -long timeo,struct sock *ssk); +long *timeo,struct sock *ssk);void netlink_detachskb (struct sock *sk,struct sk_buff *skb);int netlink_sendskb (struct sock *sk,struct sk_buff *skb);
ipc/mqueue.c +4 -2
@@ -1010,6 +1010,8 @@ asmlinkage long sys_mq_notify(mqd_t mqdes,return -EINVAL ; }if (notification.sigev_notify ==SIGEV_THREAD ) { +long timeo; +/* create the notify skb */ nc =alloc_skb (NOTIFY_COOKIE_LEN ,GFP_KERNEL ); ret = -ENOMEM ;
@@ -1038,8 +1040,8 @@ retry: goto out; } - ret =netlink_attachskb (sock, nc,0 , -MAX_SCHEDULE_TIMEOUT ,NULL ); + timeo =MAX_SCHEDULE_TIMEOUT ; + ret =netlink_attachskb (sock, nc,0 , &timeo,NULL );if (ret ==1 ) goto retry;if (ret) {
net/netlink/af_netlink.c +5 -5
@@ -752,7 +752,7 @@ struct sock *netlink_getsockbyfilp(struct file *filp)* 1: repeat lookup - reference dropped while waiting for socket memory. */ int netlink_attachskb (struct sock *sk,struct sk_buff *skb,int nonblock, -long timeo,struct sock *ssk) +long *timeo,struct sock *ssk) {struct netlink_sock *nlk;
@@ -761,7 +761,7 @@ int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock,if (atomic_read (&sk->sk_rmem_alloc) > sk->sk_rcvbuf ||test_bit (0 , &nlk->state)) {DECLARE_WAITQUEUE (wait, current); -if (!timeo) { +if (!*timeo) {if (!ssk ||netlink_is_kernel (ssk))netlink_overrun (sk);sock_put (sk);
@@ -775,7 +775,7 @@ int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock,if ((atomic_read (&sk->sk_rmem_alloc) > sk->sk_rcvbuf ||test_bit (0 , &nlk->state)) && !sock_flag (sk,SOCK_DEAD )) - timeo =schedule_timeout (timeo); + *timeo =schedule_timeout (*timeo);__set_current_state (TASK_RUNNING );remove_wait_queue (&nlk->wait, &wait);
@@ -783,7 +783,7 @@ int netlink_attachskb(struct sock *sk, struct sk_buff *skb, int nonblock,if (signal_pending (current)) {kfree_skb (skb); -return sock_intr_errno (timeo); +return sock_intr_errno (*timeo); }return 1 ; }
@@ -877,7 +877,7 @@ retry:if (netlink_is_kernel (sk))return netlink_unicast_kernel (sk, skb); - err =netlink_attachskb (sk, skb, nonblock, timeo, ssk); + err =netlink_attachskb (sk, skb, nonblock, &timeo, ssk);if (err ==1 ) goto retry;if (err)
From: Patrick McHardy <[email protected]>
Date: Sun, 04 Nov 2007 17:52:56 +0100
Quoted 7 lines
[NETLINK]: Fix unicast timeouts
Commit
ed6dcf4ain the history.git tree brokenetlink_unicasttimeouts by moving theschedule_timeout()call to a new function that doesn't propagate the remaining timeout back to the caller. This means on each retry we start with the full timeout again.
Quoted 5 lines
ipc/mqueue.cseems to actually want to wait indefinitely so this behaviour is retained.Cc Manfred Spraul <[email protected]>Signed-off-by Patrick McHardy <[email protected]>
Applied, and I'll queue this up for -stable, thanks Patrick!