49 lines
1.6 KiB
Diff
49 lines
1.6 KiB
Diff
From: Richard Gobert <richardbgobert@gmail.com>
|
|
Date: Tue, 30 Apr 2024 16:35:55 +0200
|
|
Subject: [PATCH] net: gro: add flush check in udp_gro_receive_segment
|
|
|
|
GRO-GSO path is supposed to be transparent and as such L3 flush checks are
|
|
relevant to all UDP flows merging in GRO. This patch uses the same logic
|
|
and code from tcp_gro_receive, terminating merge if flush is non zero.
|
|
|
|
Fixes: e20cf8d3f1f7 ("udp: implement GRO for plain UDP sockets.")
|
|
Signed-off-by: Richard Gobert <richardbgobert@gmail.com>
|
|
Reviewed-by: Willem de Bruijn <willemb@google.com>
|
|
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
|
---
|
|
|
|
--- a/net/ipv4/udp_offload.c
|
|
+++ b/net/ipv4/udp_offload.c
|
|
@@ -463,6 +463,7 @@ static struct sk_buff *udp_gro_receive_s
|
|
struct sk_buff *p;
|
|
unsigned int ulen;
|
|
int ret = 0;
|
|
+ int flush;
|
|
|
|
/* requires non zero csum, for symmetry with GSO */
|
|
if (!uh->check) {
|
|
@@ -496,13 +497,22 @@ static struct sk_buff *udp_gro_receive_s
|
|
return p;
|
|
}
|
|
|
|
+ flush = NAPI_GRO_CB(p)->flush;
|
|
+
|
|
+ if (NAPI_GRO_CB(p)->flush_id != 1 ||
|
|
+ NAPI_GRO_CB(p)->count != 1 ||
|
|
+ !NAPI_GRO_CB(p)->is_atomic)
|
|
+ flush |= NAPI_GRO_CB(p)->flush_id;
|
|
+ else
|
|
+ NAPI_GRO_CB(p)->is_atomic = false;
|
|
+
|
|
/* Terminate the flow on len mismatch or if it grow "too much".
|
|
* Under small packet flood GRO count could elsewhere grow a lot
|
|
* leading to excessive truesize values.
|
|
* On len mismatch merge the first packet shorter than gso_size,
|
|
* otherwise complete the GRO packet.
|
|
*/
|
|
- if (ulen > ntohs(uh2->len)) {
|
|
+ if (ulen > ntohs(uh2->len) || flush) {
|
|
pp = p;
|
|
} else {
|
|
if (NAPI_GRO_CB(skb)->is_flist) {
|