From: Greg Kroah-Hartman Date: Tue, 3 Mar 2020 15:54:48 +0000 (+0100) Subject: add 4.9 tuntap patch X-Git-Tag: v4.19.108~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=612a33f1564ec4b41d06bf09f087bfdfcc86cd5f;p=thirdparty%2Fkernel%2Fstable-queue.git add 4.9 tuntap patch script died previous attempt :( --- diff --git a/queue-4.9/series b/queue-4.9/series index d4d3d579130..6c7b664e8c7 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -43,3 +43,4 @@ net-ena-make-ena-rxfh-support-eth_rss_hash_no_change.patch namei-only-return-echild-from-follow_dotdot_rcu.patch kvm-check-for-a-bad-hva-before-dropping-into-the-ghc-slow-path.patch slip-stop-double-free-sl-dev-in-slip_open.patch +tuntap-correctly-set-sockwq_async_nospace.patch diff --git a/queue-4.9/tuntap-correctly-set-sockwq_async_nospace.patch b/queue-4.9/tuntap-correctly-set-sockwq_async_nospace.patch new file mode 100644 index 00000000000..44b723119aa --- /dev/null +++ b/queue-4.9/tuntap-correctly-set-sockwq_async_nospace.patch @@ -0,0 +1,68 @@ +From 2f3ab6221e4c87960347d65c7cab9bd917d1f637 Mon Sep 17 00:00:00 2001 +From: Jason Wang +Date: Tue, 22 May 2018 14:21:04 +0800 +Subject: tuntap: correctly set SOCKWQ_ASYNC_NOSPACE + +From: Jason Wang + +commit 2f3ab6221e4c87960347d65c7cab9bd917d1f637 upstream. + +When link is down, writes to the device might fail with +-EIO. Userspace needs an indication when the status is resolved. As a +fix, tun_net_open() attempts to wake up writers - but that is only +effective if SOCKWQ_ASYNC_NOSPACE has been set in the past. This is +not the case of vhost_net which only poll for EPOLLOUT after it meets +errors during sendmsg(). + +This patch fixes this by making sure SOCKWQ_ASYNC_NOSPACE is set when +socket is not writable or device is down to guarantee EPOLLOUT will be +raised in either tun_chr_poll() or tun_sock_write_space() after device +is up. + +Cc: Hannes Frederic Sowa +Cc: Eric Dumazet +Fixes: 1bd4978a88ac2 ("tun: honor IFF_UP in tun_get_user()") +Signed-off-by: Jason Wang +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Tommi Rantala + +--- + drivers/net/tun.c | 19 +++++++++++++++---- + 1 file changed, 15 insertions(+), 4 deletions(-) + +--- a/drivers/net/tun.c ++++ b/drivers/net/tun.c +@@ -1106,6 +1106,13 @@ static void tun_net_init(struct net_devi + } + } + ++static bool tun_sock_writeable(struct tun_struct *tun, struct tun_file *tfile) ++{ ++ struct sock *sk = tfile->socket.sk; ++ ++ return (tun->dev->flags & IFF_UP) && sock_writeable(sk); ++} ++ + /* Character device part */ + + /* Poll */ +@@ -1128,10 +1135,14 @@ static unsigned int tun_chr_poll(struct + if (!skb_array_empty(&tfile->tx_array)) + mask |= POLLIN | POLLRDNORM; + +- if (tun->dev->flags & IFF_UP && +- (sock_writeable(sk) || +- (!test_and_set_bit(SOCKWQ_ASYNC_NOSPACE, &sk->sk_socket->flags) && +- sock_writeable(sk)))) ++ /* Make sure SOCKWQ_ASYNC_NOSPACE is set if not writable to ++ * guarantee EPOLLOUT to be raised by either here or ++ * tun_sock_write_space(). Then process could get notification ++ * after it writes to a down device and meets -EIO. ++ */ ++ if (tun_sock_writeable(tun, tfile) || ++ (!test_and_set_bit(SOCKWQ_ASYNC_NOSPACE, &sk->sk_socket->flags) && ++ tun_sock_writeable(tun, tfile))) + mask |= POLLOUT | POLLWRNORM; + + if (tun->dev->reg_state != NETREG_REGISTERED)