This two-patch series introduces load-acquire/store-release barriers
for the AF_XDP rings.
For most contemporary architectures, this is more effective than a
SPSC ring based on smp_{r,w,}mb() barriers. More importantly,
load-acquire/store-release semantics make the ring code easier to
follow.
This is effectively the change done in commit 6c43c091bdc5
("documentation: Update circular buffer for
load-acquire/store-release"), but for the AF_XDP rings.
Both libbpf and the kernel-side are updated.
Full details are outlined in the commits!
Thanks to the LKMM-folks (Paul/Alan/Will) for helping me out in this
complicated matter!
@Andrii I kept the barriers in libbpf_util.h to separate userfacing
APIs (xsk.h) from internals.
@Toke I kept "barriers" but reworded. Acquire/release are also
barriers.
@Will I'd really appreciate if you could take a look this change.
Changelog
v1[1]->v2:
* Expanded the commit message for patch 1, and included the LKMM
litmus tests. Hopefully this clear things up. (Daniel)
* Clarified why the smp_mb()/smp_load_acquire() is not needed in (A);
control dependency with load to store. (Toke)
[1] https://lore.kernel.org/bpf/[email protected]/
Thanks,
Björn
Björn Töpel (2):
xsk: update rings for load-acquire/store-release barriers
libbpf, xsk: add libbpf_smp_store_release libbpf_smp_load_acquire
net/xdp/xsk_queue.h | 30 +++++++---------
tools/lib/bpf/libbpf_util.h | 72 +++++++++++++++++++++++++------------
tools/lib/bpf/xsk.h | 17 +++------
3 files changed, 68 insertions(+), 51 deletions(-)
base-commit: bce8623135fbe54bd86797df72cb85bfe4118b6e
--
2.27.0