Message ID | 20240424163045.123528-3-richardbgobert@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net: gro: add flush/flush_id checks and fix wrong offset in udp | expand |
Richard Gobert wrote: > 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: 36707061d6ba ("udp: allow forwarding of plain (non-fraglisted) UDP GRO packets") Should this be Fixes: e20cf8d3f1f7 ("udp: implement GRO for plain UDP sockets.") > net/ipv4/udp_offload.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c > index fd29d21d579c..8721fe5beca2 100644 > --- a/net/ipv4/udp_offload.c > +++ b/net/ipv4/udp_offload.c > @@ -471,6 +471,7 @@ static struct sk_buff *udp_gro_receive_segment(struct list_head *head, > struct sk_buff *p; > unsigned int ulen; > int ret = 0; > + int flush; > > /* requires non zero csum, for symmetry with GSO */ > if (!uh->check) { > @@ -504,13 +505,22 @@ static struct sk_buff *udp_gro_receive_segment(struct list_head *head, > 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; I suppose this branch already could immediately return p. And avoid a level of indentation below. But agreed to not change that in this bug fix.
diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c index fd29d21d579c..8721fe5beca2 100644 --- a/net/ipv4/udp_offload.c +++ b/net/ipv4/udp_offload.c @@ -471,6 +471,7 @@ static struct sk_buff *udp_gro_receive_segment(struct list_head *head, struct sk_buff *p; unsigned int ulen; int ret = 0; + int flush; /* requires non zero csum, for symmetry with GSO */ if (!uh->check) { @@ -504,13 +505,22 @@ static struct sk_buff *udp_gro_receive_segment(struct list_head *head, 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) {
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: 36707061d6ba ("udp: allow forwarding of plain (non-fraglisted) UDP GRO packets") Signed-off-by: Richard Gobert <richardbgobert@gmail.com> --- net/ipv4/udp_offload.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)