Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

xdp: Adjust xdp_frame layout to avoid using bitfields

Practical experience (and advice from Alexei) tell us that bitfields in
structs lead to un-optimized assembly code. I've verified this change
does lead to better x86_64 assembly, both via objdump and playing with
code snippets in godbolt.org.

Using scripts/bloat-o-meter shows the code size is reduced with 24
bytes for xdp_convert_buff_to_frame() that gets inlined e.g. in
i40e_xmit_xdp_tx_ring() which were used for microbenchmarking.

Microbenchmarking results do show improvements, but very small and
varying between 0.5 to 2 nanosec improvement per packet.

The member @metasize is changed from u8 to u32. Future users of this
area could split this into two u16 fields. I've also benchmarked with
two u16 fields showing equal performance gains and code size reduction.

The moved member @frame_sz doesn't change sizeof struct due to existing
padding. Like xdp_buff member @frame_sz is placed next to @flags, which
allows compiler to optimize assignment of these.

Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
Link: https://lore.kernel.org/r/166393728005.2213882.4162674859542409548.stgit@firesoul
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Jesper Dangaard Brouer and committed by
Jakub Kicinski
b860a1b9 49919312

+2 -2
+2 -2
include/net/xdp.h
··· 164 164 void *data; 165 165 u16 len; 166 166 u16 headroom; 167 - u32 metasize:8; 168 - u32 frame_sz:24; 167 + u32 metasize; /* uses lower 8-bits */ 169 168 /* Lifetime of xdp_rxq_info is limited to NAPI/enqueue time, 170 169 * while mem info is valid on remote CPU. 171 170 */ 172 171 struct xdp_mem_info mem; 173 172 struct net_device *dev_rx; /* used by cpumap */ 173 + u32 frame_sz; 174 174 u32 flags; /* supported values defined in xdp_buff_flags */ 175 175 }; 176 176