Patch "tuntap: correctly wake up process during uninit" has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
tuntap: correctly wake up process during uninit
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
tuntap-correctly-wake-up-process-during-uninit.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Fri Jun 17 11:18:18 PDT 2016
From: Jason Wang <[email protected]>
Date: Thu, 19 May 2016 13:36:51 +0800
Subject: tuntap: correctly wake up process during uninit
From: Jason Wang <[email protected]>
[ Upstream commit addf8fc4acb1cf79492ac64966f07178793cb3d7 ]
We used to check dev->reg_state against NETREG_REGISTERED after each time we are woke up. But after commit 9e641bdcfa4e ("net-tun:
restructure tun_do_read for better sleep/wakeup efficiency"), it uses skb_recv_datagram() which does not check dev->reg_state. This will result if we delete a tun/tap device after a process is blocked in the reading. The device will wait for the reference count which was held by that process for ever.
Fixes this by using RCV_SHUTDOWN which will be checked during sk_recv_datagram() before trying to wake up the process during uninit.
sleep/wakeup efficiency")
--- drivers/net/tun.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/tun.c +3 -3
@@ -567,11 +567,13 @@ static void tun_detach_all(struct net_defor (i =0 ; i < n; i++) { tfile =rtnl_dereference (tun->tfiles[i]);BUG_ON (!tfile); + tfile->socket.sk->sk_shutdown =RCV_SHUTDOWN ; tfile->socket.sk->sk_data_ready (tfile->socket.sk);RCU_INIT_POINTER (tfile->tun,NULL ); --tun->numqueues; }list_for_each_entry (tfile, &tun->disabled, next) { + tfile->socket.sk->sk_shutdown =RCV_SHUTDOWN ; tfile->socket.sk->sk_data_ready (tfile->socket.sk);RCU_INIT_POINTER (tfile->tun,NULL ); }
@@ -627,6 +629,7 @@ static int tun_attach(struct tun_struct goto out; } tfile->queue_index = tun->numqueues; + tfile->socket.sk->sk_shutdown &= ~RCV_SHUTDOWN ;rcu_assign_pointer (tfile->tun, tun);rcu_assign_pointer (tun->tfiles[tun->numqueues], tfile); tun->numqueues++;
@@ -1408,9 +1411,6 @@ static ssize_t tun_do_read(struct tun_stif (!iov_iter_count (to))return 0 ; -if (tun->dev->reg_state !=NETREG_REGISTERED ) -return -EIO ; -/* Read frames from queue */ skb =__skb_recv_datagram (tfile->socket.sk, noblock ?MSG_DONTWAIT :0 , &peeked, &off, &err);
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/tuntap-correctly-wake-up-process-during-uninit.patch