gro: a couple of minor optimization
Subsystems (2)
Paolo Abeni
maintainercover gro: a couple of minor optimization
This series collects a couple of small optimizations for the GRO engine, reducing slightly the number of cycles for dev_gro_receive(). The delta is within noise range in tput tests, but with big TCP coming every cycle saved from the GRO engine will count - I hope ;)
v1 -> v2:
- a few cleanup suggested from Alexander(s)
- moved away the more controversial 3rd patch
Paolo Abeni (2):
net: gro: avoid re-computing truesize twice on recycle
net: gro: minor optimization for dev_gro_receive()
include/net/gro.h | 52 +++++++++++++++++++++++++---------------------- net/core/gro.c | 16 ++++----------- 2 files changed, 32 insertions(+), 36 deletions(-)
Signature · 1 line
2.34.1
Paolo Abeni
maintainerPATCH 1/2 net: gro: avoid re-computing truesize twice on recycle
After commit 5e10da5385d2 ("skbuff: allow 'slow_gro' for skb carring sock reference") and commit af352460b465 ("net: fix GRO skb truesize update") the truesize of the skb with stolen head is properly updated by the GRO engine, we don't need anymore resetting it at recycle time.
v1 -> v2:
- clarify the commit message (Alexander)
--- net/core/gro.c | 1 - 1 file changed, 1 deletion(-)
net/core/gro.c +0 -1
@@ -634,7 +634,6 @@ static void napi_reuse_skb(struct napi_struct *napi, struct sk_buff *skb) skb->encapsulation =0 ;skb_shinfo (skb)->gso_type =0 ; - skb->truesize =SKB_TRUESIZE (skb_end_offset (skb));if (unlikely (skb->slow_gro)) {skb_orphan (skb);skb_ext_reset (skb);
Signature · 1 line
2.34.1
Re: [PATCH net-next 1/2] net: gro: avoid re-computing truesize twice on recycle
Quoted 7 lines · Paolo Abeni
After commit
5e10da5385d2("skbuff: allow 'slow_gro' for skb carring sock reference") and commitaf352460b465("net: fix GRO skb truesize update") the truesize of the skb with stolen head is properly updated by the GRO engine, we don't need anymore resetting it at recycle time.
Quoted 5 lines
v1 -> v2:
- clarify the commit message (Alexander)Signed-off-by Paolo Abeni <[email protected]>---
Paolo Abeni
maintainerPATCH 2/2 net: gro: minor optimization for dev_gro_receive()
In reply to Paolo AbeniWhile inspecting some perf report, I noticed that the compiler emits suboptimal code for the napi CB initialization, fetching and storing multiple times the memory for flags bitfield. This is with gcc 10.3.1, but I observed the same with older compiler versions.
We can help the compiler to do a nicer work clearing several fields at once using an u32 alias. The generated code is quite smaller, with the same number of conditional.
Before:
objdump -t net/core/gro.o | grep " F .text"0000000000000bb0 l F .text 0000000000000357 dev_gro_receive
After:0000000000000bb0 l F .text 000000000000033c dev_gro_receive
v1 -> v2:
- use struct_group (Alexander and Alex)
RFC -> v1:
- use __struct_group to delimit the zeroed area (Alexander)
--- include/net/gro.h | 52 +++++++++++++++++++++++++---------------------- net/core/gro.c | 15 ++++---------- 2 files changed, 32 insertions(+), 35 deletions(-)
include/net/gro.h +28 -24
@@ -29,46 +29,50 @@ struct napi_gro_cb {/* Number of segments aggregated. */ u16 count; -/* Start offset for remote checksum offload */ -u16 gro_remcsum_start; +/* Used in ipv6_gro_receive() and foo-over-udp */ +u16 proto;/* jiffies when first packet was created/queued */ unsigned long age; -/* Used in ipv6_gro_receive() and foo-over-udp */ -u16 proto; +/* portion of the cb set to zero at every gro iteration */ +struct_group (zeroed, + +/* Start offset for remote checksum offload */ + u16 gro_remcsum_start; -/* This is non-zero if the packet may be of the same flow. */ - u8 same_flow:1; +/* This is non-zero if the packet may be of the same flow. */ + u8 same_flow:1; -/* Used in tunnel GRO receive */ - u8 encap_mark:1; +/* Used in tunnel GRO receive */ + u8 encap_mark:1; -/* GRO checksum is valid */ - u8 csum_valid:1; +/* GRO checksum is valid */ + u8 csum_valid:1; -/* Number of checksums via CHECKSUM_UNNECESSARY */ - u8 csum_cnt:3; +/* Number of checksums via CHECKSUM_UNNECESSARY */ + u8 csum_cnt:3; -/* Free the skb? */ - u8 free:2; +/* Free the skb? */ + u8 free:2; #define NAPI_GRO_FREE 1 #define NAPI_GRO_FREE_STOLEN_HEAD 2 -/* Used in foo-over-udp, set in udp[46]_gro_receive */ - u8 is_ipv6:1; + /* Used in foo-over-udp, set in udp[46]_gro_receive */ + u8 is_ipv6:1; -/* Used in GRE, set in fou/gue_gro_receive */ - u8 is_fou:1; +/* Used in GRE, set in fou/gue_gro_receive */ + u8 is_fou:1; -/* Used to determine if flush_id can be ignored */ - u8 is_atomic:1; +/* Used to determine if flush_id can be ignored */ + u8 is_atomic:1; -/* Number of gro_receive callbacks this packet already went through */ - u8 recursion_counter:4; +/* Number of gro_receive callbacks this packet already went through */ + u8 recursion_counter:4; -/* GRO is done by frag_list pointer chaining. */ - u8 is_flist:1; +/* GRO is done by frag_list pointer chaining. */ + u8 is_flist:1; + );/* used to support CHECKSUM_COMPLETE for tunneling protocols */ __wsum csum;
net/core/gro.c +4 -11
@@ -459,29 +459,22 @@ static enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buffskb_set_network_header (skb,skb_gro_offset (skb));skb_reset_mac_len (skb); -NAPI_GRO_CB (skb)->same_flow =0 ; + BUILD_BUG_ON(sizeof_field(struct napi_gro_cb, zeroed) != sizeof(u32)); +BUILD_BUG_ON (!IS_ALIGNED (offsetof(struct napi_gro_cb , zeroed), +sizeof (u32)));/* Avoid slow unaligned acc */ + *(u32 *)&NAPI_GRO_CB (skb)->zeroed =0 ;NAPI_GRO_CB (skb)->flush =skb_is_gso (skb) ||skb_has_frag_list (skb); -NAPI_GRO_CB (skb)->free =0 ; -NAPI_GRO_CB (skb)->encap_mark =0 ; -NAPI_GRO_CB (skb)->recursion_counter =0 ; -NAPI_GRO_CB (skb)->is_fou =0 ;NAPI_GRO_CB (skb)->is_atomic =1 ; -NAPI_GRO_CB (skb)->gro_remcsum_start =0 ;/* Setup for GRO checksum validation */ switch (skb->ip_summed) {case CHECKSUM_COMPLETE :NAPI_GRO_CB (skb)->csum = skb->csum;NAPI_GRO_CB (skb)->csum_valid =1 ; -NAPI_GRO_CB (skb)->csum_cnt =0 ;break ;case CHECKSUM_UNNECESSARY :NAPI_GRO_CB (skb)->csum_cnt = skb->csum_level +1 ; -NAPI_GRO_CB (skb)->csum_valid =0 ;break ; -default : -NAPI_GRO_CB (skb)->csum_cnt =0 ; -NAPI_GRO_CB (skb)->csum_valid =0 ; } pp = INDIRECT_CALL_INET(ptype->callbacks.gro_receive,
Signature · 1 line
2.34.1
Paolo Abeni
maintainerQuoted 9 lines · Paolo Abeni
This series collects a couple of small optimizations for the GRO engine, reducing slightly the number of cycles for
dev_gro_receive(). The delta is within noise range in tput tests, but with big TCP coming every cycle saved from the GRO engine will count - I hope ;)v1 -> v2:
- a few cleanup suggested from Alexander(s)
- moved away the more controversial 3rd patch
Quoted 7 lines
Paolo Abeni (2):
net: gro: avoid re-computing truesize twice on recycle
net: gro: minor optimization fordev_gro_receive()include/net/gro.h | 52 +++++++++++++++++++++++++---------------------- net/core/gro.c | 16 ++++----------- 2 files changed, 32 insertions(+), 36 deletions(-)
This is really a v2. Please let me know if you prefer a formal repost.
Thanks!
Paolo
David Miller
maintainerFrom: Paolo Abeni <[email protected]>
Date: Fri, 04 Feb 2022 12:34:03 +0100
Quoted 14 lines · Paolo Abeni
Quoted 13 lines
This series collects a couple of small optimizations for the GRO engine, reducing slightly the number of cycles for
dev_gro_receive(). The delta is within noise range in tput tests, but with big TCP coming every cycle saved from the GRO engine will count - I hope ;)v1 -> v2:
- a few cleanup suggested from Alexander(s)
- moved away the more controversial 3rd patchPaolo Abeni (2):
net: gro: avoid re-computing truesize twice on recycle
net: gro: minor optimization fordev_gro_receive()
Quoted 5 lines
Quoted 3 lines
include/net/gro.h | 52 +++++++++++++++++++++++++---------------------- net/core/gro.c | 16 ++++----------- 2 files changed, 32 insertions(+), 36 deletions(-)This is really a v2. Please let me know if you prefer a formal repost.
Not necessary.
Thank you.
From: Paolo Abeni <[email protected]>
Date: Fri, 4 Feb 2022 12:28:35 +0100
Quoted 5 lines
This series collects a couple of small optimizations for the GRO engine, reducing slightly the number of cycles for
dev_gro_receive(). The delta is within noise range in tput tests, but with big TCP coming every cycle saved from the GRO engine will count - I hope ;)
Quoted 7 lines
v1 -> v2:
- a few cleanup suggested from Alexander(s)
- moved away the more controversial 3rd patchPaolo Abeni (2):
net: gro: avoid re-computing truesize twice on recycle
net: gro: minor optimization fordev_gro_receive()
Looks nice to me now, thanks!
For the series:
Quoted 7 lines
include/net/gro.h | 52 +++++++++++++++++++++++++---------------------- net/core/gro.c | 16 ++++----------- 2 files changed, 32 insertions(+), 36 deletions(-)Signature · 1 line
2.34.1
Al
Quoted 10 lines · Paolo Abeni
This series collects a couple of small optimizations for the GRO engine, reducing slightly the number of cycles for
dev_gro_receive(). The delta is within noise range in tput tests, but with big TCP coming every cycle saved from the GRO engine will count - I hope ;)v1 -> v2:
- a few cleanup suggested from Alexander(s)
- moved away the more controversial 3rd patch
Quoted 7 lines
Paolo Abeni (2):
net: gro: avoid re-computing truesize twice on recycle
net: gro: minor optimization fordev_gro_receive()include/net/gro.h | 52 +++++++++++++++++++++++++---------------------- net/core/gro.c | 16 ++++----------- 2 files changed, 32 insertions(+), 36 deletions(-)
This addresses the concern I had.
This series was applied to netdev/net-next.git (master) by David S. Miller <[email protected]>:
Hello:
This series was applied to netdev/net-next.git (master) by David S. Miller <[email protected]>:
Quoted 10 lines · On Fri, 4 Feb 2022 12:28:35 +0100 you wrote:
This series collects a couple of small optimizations for the GRO engine, reducing slightly the number of cycles for
dev_gro_receive(). The delta is within noise range in tput tests, but with big TCP coming every cycle saved from the GRO engine will count - I hope ;)v1 -> v2:
- a few cleanup suggested from Alexander(s)
- moved away the more controversial 3rd patch[...]
Here is the summary with links:
- [net-next,1/2] net: gro: avoid re-computing truesize twice on recycle
https://git.kernel.org/netdev/net-next/c/7881453e4adf - [net-next,2/2] net: gro: minor optimization for dev_gro_receive() https://git.kernel.org/netdev/net-next/c/de5a1f3ce4c8
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html