[PATCH v2 1/4] net/af_packet: fix thread safety and frame calculations
Scott Mitchell
scott.k.mitch1 at gmail.com
Wed Jan 28 19:00:16 CET 2026
On Wed, Jan 28, 2026 at 8:59 AM Stephen Hemminger
<stephen at networkplumber.org> wrote:
>
> On Wed, 28 Jan 2026 01:36:04 -0800
> scott.k.mitch1 at gmail.com wrote:
>
> > +/**
> > + * Read tp_status from packet mmap ring. Matches kernel's READ_ONCE() with smp_rmb()
> > + * ordering in af_packet.c __packet_get_status.
> > + */
> > +static inline uint32_t
> > +tpacket_read_status(const volatile void *tp_status)
> > +{
> > + rte_smp_rmb();
> > + return *((const volatile unaligned_uint32_t *)tp_status);
> > +}
>
> Wouldn't rte_compiler_barrier() be better choice here.
> You are really only trying to keep compiler from optimzing the access.
>
> And tp_status is aligned in ring isn't it?
The current approach replicates __packet_set_status and
__packet_get_status [1] in the kernel which use the same barriers
(WRITE_ONCE calls __write_once_size [2] which does a volatile cast).
dpdk's rte_smp_rmb and rte_smp_wmb on x86 are just
rte_compiler_barrier [3] but on arm it's different [4].
[1] https://github.com/torvalds/linux/blob/v6.18/net/packet/af_packet.c#L399-L451
[2] https://github.com/torvalds/linux/blob/v6.18/tools/include/linux/compiler.h#L194
[3] https://github.com/DPDK/dpdk/blob/v25.11/lib/eal/x86/include/rte_atomic.h#L26-L28
[4] https://github.com/DPDK/dpdk/blob/v25.11/lib/eal/arm/include/rte_atomic_64.h#L29-L31
More information about the stable
mailing list