]> www.infradead.org Git - users/jedix/linux-maple.git/commit
xsk: add helper to get &xdp_desc's DMA and meta pointer in one go
authorAlexander Lobakin <aleksander.lobakin@intel.com>
Thu, 6 Feb 2025 18:26:29 +0000 (19:26 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 11 Feb 2025 01:54:43 +0000 (17:54 -0800)
commit23d9324a27a48858cfdd7f0342f52328e8595c6d
tree7fa21de685ce2a7c51b8cb5602306a09a4450024
parent2fc6b26ac8aecd5f53164b00fe5d32417e1fbfc9
xsk: add helper to get &xdp_desc's DMA and meta pointer in one go

Currently, when your driver supports XSk Tx metadata and you want to
send an XSk frame, you need to do the following:

* call external xsk_buff_raw_get_dma();
* call inline xsk_buff_get_metadata(), which calls external
  xsk_buff_raw_get_data() and then do some inline checks.

This effectively means that the following piece:

addr = pool->unaligned ? xp_unaligned_add_offset_to_addr(addr) : addr;

is done twice per frame, plus you have 2 external calls per frame, plus
this:

meta = pool->addrs + addr - pool->tx_metadata_len;
if (unlikely(!xsk_buff_valid_tx_metadata(meta)))

is always inlined, even if there's no meta or it's invalid.

Add xsk_buff_raw_get_ctx() (xp_raw_get_ctx() to be precise) to do that
in one go. It returns a small structure with 2 fields: DMA address,
filled unconditionally, and metadata pointer, non-NULL only if it's
present and valid. The address correction is performed only once and
you also have only 1 external call per XSk frame, which does all the
calculations and checks outside of your hotpath. You only need to
check `if (ctx.meta)` for the metadata presence.
To not copy any existing code, derive address correction and getting
virtual and DMA address into small helpers. bloat-o-meter reports no
object code changes for the existing functionality.

Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com>
Link: https://patch.msgid.link/20250206182630.3914318-5-aleksander.lobakin@intel.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/xdp_sock_drv.h
include/net/xsk_buff_pool.h
net/xdp/xsk_buff_pool.c