Skip to content

Commit 35ffb66

Browse files
Richard GobertPaolo Abeni
authored andcommitted
net: gro: skb_gro_header helper function
Introduce a simple helper function to replace a common pattern. When accessing the GRO header, we fetch the pointer from frag0, then test its validity and fetch it from the skb when necessary. This leads to the pattern skb_gro_header_fast -> skb_gro_header_hard -> skb_gro_header_slow recurring many times throughout GRO code. This patch replaces these patterns with a single inlined function call, improving code readability. Signed-off-by: Richard Gobert <[email protected]> Reviewed-by: Eric Dumazet <[email protected]> Link: https://lore.kernel.org/r/20220823071034.GA56142@debian Signed-off-by: Paolo Abeni <[email protected]>
1 parent 77a70f9 commit 35ffb66

File tree

10 files changed

+45
-69
lines changed

10 files changed

+45
-69
lines changed

drivers/net/geneve.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -503,12 +503,9 @@ static struct sk_buff *geneve_gro_receive(struct sock *sk,
503503

504504
off_gnv = skb_gro_offset(skb);
505505
hlen = off_gnv + sizeof(*gh);
506-
gh = skb_gro_header_fast(skb, off_gnv);
507-
if (skb_gro_header_hard(skb, hlen)) {
508-
gh = skb_gro_header_slow(skb, hlen, off_gnv);
509-
if (unlikely(!gh))
510-
goto out;
511-
}
506+
gh = skb_gro_header(skb, hlen, off_gnv);
507+
if (unlikely(!gh))
508+
goto out;
512509

513510
if (gh->ver != GENEVE_VER || gh->oam)
514511
goto out;

drivers/net/vxlan/vxlan_core.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -713,12 +713,9 @@ static struct sk_buff *vxlan_gro_receive(struct sock *sk,
713713

714714
off_vx = skb_gro_offset(skb);
715715
hlen = off_vx + sizeof(*vh);
716-
vh = skb_gro_header_fast(skb, off_vx);
717-
if (skb_gro_header_hard(skb, hlen)) {
718-
vh = skb_gro_header_slow(skb, hlen, off_vx);
719-
if (unlikely(!vh))
720-
goto out;
721-
}
716+
vh = skb_gro_header(skb, hlen, off_vx);
717+
if (unlikely(!vh))
718+
goto out;
722719

723720
skb_gro_postpull_rcsum(skb, vh, sizeof(struct vxlanhdr));
724721

include/net/gro.h

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,17 @@ static inline void *skb_gro_header_slow(struct sk_buff *skb, unsigned int hlen,
160160
return skb->data + offset;
161161
}
162162

163+
static inline void *skb_gro_header(struct sk_buff *skb,
164+
unsigned int hlen, unsigned int offset)
165+
{
166+
void *ptr;
167+
168+
ptr = skb_gro_header_fast(skb, offset);
169+
if (skb_gro_header_hard(skb, hlen))
170+
ptr = skb_gro_header_slow(skb, hlen, offset);
171+
return ptr;
172+
}
173+
163174
static inline void *skb_gro_network_header(struct sk_buff *skb)
164175
{
165176
return (NAPI_GRO_CB(skb)->frag0 ?: skb->data) +
@@ -301,12 +312,9 @@ static inline void *skb_gro_remcsum_process(struct sk_buff *skb, void *ptr,
301312
return ptr;
302313
}
303314

304-
ptr = skb_gro_header_fast(skb, off);
305-
if (skb_gro_header_hard(skb, off + plen)) {
306-
ptr = skb_gro_header_slow(skb, off + plen, off);
307-
if (!ptr)
308-
return NULL;
309-
}
315+
ptr = skb_gro_header(skb, off + plen, off);
316+
if (!ptr)
317+
return NULL;
310318

311319
delta = remcsum_adjust(ptr + hdrlen, NAPI_GRO_CB(skb)->csum,
312320
start, offset);
@@ -329,12 +337,9 @@ static inline void skb_gro_remcsum_cleanup(struct sk_buff *skb,
329337
if (!grc->delta)
330338
return;
331339

332-
ptr = skb_gro_header_fast(skb, grc->offset);
333-
if (skb_gro_header_hard(skb, grc->offset + sizeof(u16))) {
334-
ptr = skb_gro_header_slow(skb, plen, grc->offset);
335-
if (!ptr)
336-
return;
337-
}
340+
ptr = skb_gro_header(skb, plen, grc->offset);
341+
if (!ptr)
342+
return;
338343

339344
remcsum_unadjust((__sum16 *)ptr, grc->delta);
340345
}
@@ -405,9 +410,7 @@ static inline struct udphdr *udp_gro_udphdr(struct sk_buff *skb)
405410

406411
off = skb_gro_offset(skb);
407412
hlen = off + sizeof(*uh);
408-
uh = skb_gro_header_fast(skb, off);
409-
if (skb_gro_header_hard(skb, hlen))
410-
uh = skb_gro_header_slow(skb, hlen, off);
413+
uh = skb_gro_header(skb, hlen, off);
411414

412415
return uh;
413416
}

net/8021q/vlan_core.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -467,12 +467,9 @@ static struct sk_buff *vlan_gro_receive(struct list_head *head,
467467

468468
off_vlan = skb_gro_offset(skb);
469469
hlen = off_vlan + sizeof(*vhdr);
470-
vhdr = skb_gro_header_fast(skb, off_vlan);
471-
if (skb_gro_header_hard(skb, hlen)) {
472-
vhdr = skb_gro_header_slow(skb, hlen, off_vlan);
473-
if (unlikely(!vhdr))
474-
goto out;
475-
}
470+
vhdr = skb_gro_header(skb, hlen, off_vlan);
471+
if (unlikely(!vhdr))
472+
goto out;
476473

477474
type = vhdr->h_vlan_encapsulated_proto;
478475

net/ethernet/eth.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -414,12 +414,9 @@ struct sk_buff *eth_gro_receive(struct list_head *head, struct sk_buff *skb)
414414

415415
off_eth = skb_gro_offset(skb);
416416
hlen = off_eth + sizeof(*eh);
417-
eh = skb_gro_header_fast(skb, off_eth);
418-
if (skb_gro_header_hard(skb, hlen)) {
419-
eh = skb_gro_header_slow(skb, hlen, off_eth);
420-
if (unlikely(!eh))
421-
goto out;
422-
}
417+
eh = skb_gro_header(skb, hlen, off_eth);
418+
if (unlikely(!eh))
419+
goto out;
423420

424421
flush = 0;
425422

net/ipv4/af_inet.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1464,12 +1464,9 @@ struct sk_buff *inet_gro_receive(struct list_head *head, struct sk_buff *skb)
14641464

14651465
off = skb_gro_offset(skb);
14661466
hlen = off + sizeof(*iph);
1467-
iph = skb_gro_header_fast(skb, off);
1468-
if (skb_gro_header_hard(skb, hlen)) {
1469-
iph = skb_gro_header_slow(skb, hlen, off);
1470-
if (unlikely(!iph))
1471-
goto out;
1472-
}
1467+
iph = skb_gro_header(skb, hlen, off);
1468+
if (unlikely(!iph))
1469+
goto out;
14731470

14741471
proto = iph->protocol;
14751472

net/ipv4/fou.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -323,12 +323,9 @@ static struct sk_buff *gue_gro_receive(struct sock *sk,
323323
off = skb_gro_offset(skb);
324324
len = off + sizeof(*guehdr);
325325

326-
guehdr = skb_gro_header_fast(skb, off);
327-
if (skb_gro_header_hard(skb, len)) {
328-
guehdr = skb_gro_header_slow(skb, len, off);
329-
if (unlikely(!guehdr))
330-
goto out;
331-
}
326+
guehdr = skb_gro_header(skb, len, off);
327+
if (unlikely(!guehdr))
328+
goto out;
332329

333330
switch (guehdr->version) {
334331
case 0:

net/ipv4/gre_offload.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,9 @@ static struct sk_buff *gre_gro_receive(struct list_head *head,
137137

138138
off = skb_gro_offset(skb);
139139
hlen = off + sizeof(*greh);
140-
greh = skb_gro_header_fast(skb, off);
141-
if (skb_gro_header_hard(skb, hlen)) {
142-
greh = skb_gro_header_slow(skb, hlen, off);
143-
if (unlikely(!greh))
144-
goto out;
145-
}
140+
greh = skb_gro_header(skb, hlen, off);
141+
if (unlikely(!greh))
142+
goto out;
146143

147144
/* Only support version 0 and K (key), C (csum) flags. Note that
148145
* although the support for the S (seq#) flag can be added easily

net/ipv4/tcp_offload.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -195,12 +195,9 @@ struct sk_buff *tcp_gro_receive(struct list_head *head, struct sk_buff *skb)
195195

196196
off = skb_gro_offset(skb);
197197
hlen = off + sizeof(*th);
198-
th = skb_gro_header_fast(skb, off);
199-
if (skb_gro_header_hard(skb, hlen)) {
200-
th = skb_gro_header_slow(skb, hlen, off);
201-
if (unlikely(!th))
202-
goto out;
203-
}
198+
th = skb_gro_header(skb, hlen, off);
199+
if (unlikely(!th))
200+
goto out;
204201

205202
thlen = th->doff * 4;
206203
if (thlen < sizeof(*th))

net/ipv6/ip6_offload.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -219,12 +219,9 @@ INDIRECT_CALLABLE_SCOPE struct sk_buff *ipv6_gro_receive(struct list_head *head,
219219

220220
off = skb_gro_offset(skb);
221221
hlen = off + sizeof(*iph);
222-
iph = skb_gro_header_fast(skb, off);
223-
if (skb_gro_header_hard(skb, hlen)) {
224-
iph = skb_gro_header_slow(skb, hlen, off);
225-
if (unlikely(!iph))
226-
goto out;
227-
}
222+
iph = skb_gro_header_slow(skb, hlen, off);
223+
if (unlikely(!iph))
224+
goto out;
228225

229226
skb_set_network_header(skb, off);
230227
skb_gro_pull(skb, sizeof(*iph));

0 commit comments

Comments
 (0)