]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.15-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 21 Aug 2023 18:57:16 +0000 (20:57 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 21 Aug 2023 18:57:16 +0000 (20:57 +0200)
added patches:
net-fix-the-rto-timer-retransmitting-skb-every-1ms-if-linear-option-is-enabled.patch
virtio-net-set-queues-after-driver_ok.patch

queue-5.15/net-fix-the-rto-timer-retransmitting-skb-every-1ms-if-linear-option-is-enabled.patch [new file with mode: 0644]
queue-5.15/series
queue-5.15/virtio-net-set-queues-after-driver_ok.patch [new file with mode: 0644]

diff --git a/queue-5.15/net-fix-the-rto-timer-retransmitting-skb-every-1ms-if-linear-option-is-enabled.patch b/queue-5.15/net-fix-the-rto-timer-retransmitting-skb-every-1ms-if-linear-option-is-enabled.patch
new file mode 100644 (file)
index 0000000..008fbd9
--- /dev/null
@@ -0,0 +1,51 @@
+From e4dd0d3a2f64b8bd8029ec70f52bdbebd0644408 Mon Sep 17 00:00:00 2001
+From: Jason Xing <kernelxing@tencent.com>
+Date: Fri, 11 Aug 2023 10:37:47 +0800
+Subject: net: fix the RTO timer retransmitting skb every 1ms if linear option is enabled
+
+From: Jason Xing <kernelxing@tencent.com>
+
+commit e4dd0d3a2f64b8bd8029ec70f52bdbebd0644408 upstream.
+
+In the real workload, I encountered an issue which could cause the RTO
+timer to retransmit the skb per 1ms with linear option enabled. The amount
+of lost-retransmitted skbs can go up to 1000+ instantly.
+
+The root cause is that if the icsk_rto happens to be zero in the 6th round
+(which is the TCP_THIN_LINEAR_RETRIES value), then it will always be zero
+due to the changed calculation method in tcp_retransmit_timer() as follows:
+
+icsk->icsk_rto = min(icsk->icsk_rto << 1, TCP_RTO_MAX);
+
+Above line could be converted to
+icsk->icsk_rto = min(0 << 1, TCP_RTO_MAX) = 0
+
+Therefore, the timer expires so quickly without any doubt.
+
+I read through the RFC 6298 and found that the RTO value can be rounded
+up to a certain value, in Linux, say TCP_RTO_MIN as default, which is
+regarded as the lower bound in this patch as suggested by Eric.
+
+Fixes: 36e31b0af587 ("net: TCP thin linear timeouts")
+Suggested-by: Eric Dumazet <edumazet@google.com>
+Signed-off-by: Jason Xing <kernelxing@tencent.com>
+Reviewed-by: Eric Dumazet <edumazet@google.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ net/ipv4/tcp_timer.c |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/net/ipv4/tcp_timer.c
++++ b/net/ipv4/tcp_timer.c
+@@ -582,7 +582,9 @@ out_reset_timer:
+           tcp_stream_is_thin(tp) &&
+           icsk->icsk_retransmits <= TCP_THIN_LINEAR_RETRIES) {
+               icsk->icsk_backoff = 0;
+-              icsk->icsk_rto = min(__tcp_set_rto(tp), TCP_RTO_MAX);
++              icsk->icsk_rto = clamp(__tcp_set_rto(tp),
++                                     tcp_rto_min(sk),
++                                     TCP_RTO_MAX);
+       } else {
+               /* Use normal (exponential) backoff */
+               icsk->icsk_rto = min(icsk->icsk_rto << 1, TCP_RTO_MAX);
index aacc44f2ed8b60f3ee9aeeb7863527c182e44642..6d7a913e26dab455aca71759b4aa269ceb191e29 100644 (file)
@@ -125,3 +125,5 @@ netfilter-set-default-timeout-to-3-secs-for-sctp-shutdown-send-and-recv-state.pa
 exfat-check-if-filename-entries-exceeds-max-filename-length.patch
 arm64-dts-rockchip-disable-hs400-for-emmc-on-rock-pi-4.patch
 af_unix-fix-null-ptr-deref-in-unix_stream_sendpage.patch
+virtio-net-set-queues-after-driver_ok.patch
+net-fix-the-rto-timer-retransmitting-skb-every-1ms-if-linear-option-is-enabled.patch
diff --git a/queue-5.15/virtio-net-set-queues-after-driver_ok.patch b/queue-5.15/virtio-net-set-queues-after-driver_ok.patch
new file mode 100644 (file)
index 0000000..90edce6
--- /dev/null
@@ -0,0 +1,47 @@
+From 51b813176f098ff61bd2833f627f5319ead098a5 Mon Sep 17 00:00:00 2001
+From: Jason Wang <jasowang@redhat.com>
+Date: Wed, 9 Aug 2023 23:12:56 -0400
+Subject: virtio-net: set queues after driver_ok
+
+From: Jason Wang <jasowang@redhat.com>
+
+commit 51b813176f098ff61bd2833f627f5319ead098a5 upstream.
+
+Commit 25266128fe16 ("virtio-net: fix race between set queues and
+probe") tries to fix the race between set queues and probe by calling
+_virtnet_set_queues() before DRIVER_OK is set. This violates virtio
+spec. Fixing this by setting queues after virtio_device_ready().
+
+Note that rtnl needs to be held for userspace requests to change the
+number of queues. So we are serialized in this way.
+
+Fixes: 25266128fe16 ("virtio-net: fix race between set queues and probe")
+Reported-by: Dragos Tatulea <dtatulea@nvidia.com>
+Acked-by: Michael S. Tsirkin <mst@redhat.com>
+Signed-off-by: Jason Wang <jasowang@redhat.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/virtio_net.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/virtio_net.c
++++ b/drivers/net/virtio_net.c
+@@ -3319,8 +3319,6 @@ static int virtnet_probe(struct virtio_d
+               }
+       }
+-      _virtnet_set_queues(vi, vi->curr_queue_pairs);
+-
+       /* serialize netdev register + virtio_device_ready() with ndo_open() */
+       rtnl_lock();
+@@ -3333,6 +3331,8 @@ static int virtnet_probe(struct virtio_d
+       virtio_device_ready(vdev);
++      _virtnet_set_queues(vi, vi->curr_queue_pairs);
++
+       rtnl_unlock();
+       err = virtnet_cpu_notif_add(vi);