]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xsk: Get rid of xdp_buff_xsk::orig_addr
authorMaciej Fijalkowski <maciej.fijalkowski@intel.com>
Mon, 7 Oct 2024 12:24:55 +0000 (14:24 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Mon, 14 Oct 2024 15:23:17 +0000 (17:23 +0200)
Continue the process of dieting xdp_buff_xsk by removing orig_addr
member. It can be calculated from xdp->data_hard_start where it was
previously used, so it is not anything that has to be carried around in
struct used widely in hot path.

This has been used for initializing xdp_buff_xsk::frame_dma during pool
setup and as a shortcut in xp_get_handle() to retrieve address provided
to xsk Rx queue.

Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Magnus Karlsson <magnus.karlsson@intel.com>
Link: https://lore.kernel.org/bpf/20241007122458.282590-4-maciej.fijalkowski@intel.com
include/net/xsk_buff_pool.h
net/xdp/xsk.c
net/xdp/xsk_buff_pool.c

index af8b6f776f8693e0346a10e967322921cce2f658..468a23b1b4c555123fc07155703bed450cf185f0 100644 (file)
@@ -28,7 +28,6 @@ struct xdp_buff_xsk {
        dma_addr_t dma;
        dma_addr_t frame_dma;
        struct xsk_buff_pool *pool;
-       u64 orig_addr;
        struct list_head list_node;
 };
 
@@ -119,7 +118,6 @@ void xp_free(struct xdp_buff_xsk *xskb);
 static inline void xp_init_xskb_addr(struct xdp_buff_xsk *xskb, struct xsk_buff_pool *pool,
                                     u64 addr)
 {
-       xskb->orig_addr = addr;
        xskb->xdp.data_hard_start = pool->addrs + addr + pool->headroom;
 }
 
@@ -221,14 +219,19 @@ static inline void xp_release(struct xdp_buff_xsk *xskb)
                xskb->pool->free_heads[xskb->pool->free_heads_cnt++] = xskb;
 }
 
-static inline u64 xp_get_handle(struct xdp_buff_xsk *xskb)
+static inline u64 xp_get_handle(struct xdp_buff_xsk *xskb,
+                               struct xsk_buff_pool *pool)
 {
-       u64 offset = xskb->xdp.data - xskb->xdp.data_hard_start;
+       u64 orig_addr = xskb->xdp.data - pool->addrs;
+       u64 offset;
 
-       offset += xskb->pool->headroom;
-       if (!xskb->pool->unaligned)
-               return xskb->orig_addr + offset;
-       return xskb->orig_addr + (offset << XSK_UNALIGNED_BUF_OFFSET_SHIFT);
+       if (!pool->unaligned)
+               return orig_addr;
+
+       offset = xskb->xdp.data - xskb->xdp.data_hard_start;
+       orig_addr -= offset;
+       offset += pool->headroom;
+       return orig_addr + (offset << XSK_UNALIGNED_BUF_OFFSET_SHIFT);
 }
 
 static inline bool xp_tx_metadata_enabled(const struct xsk_buff_pool *pool)
index 520023405908867f5201e82fe1263f4a7aef9ba1..6c31c1de16197c27251f024be6af4091f0ca6e49 100644 (file)
@@ -141,7 +141,7 @@ static int __xsk_rcv_zc(struct xdp_sock *xs, struct xdp_buff_xsk *xskb, u32 len,
        u64 addr;
        int err;
 
-       addr = xp_get_handle(xskb);
+       addr = xp_get_handle(xskb, xskb->pool);
        err = xskq_prod_reserve_desc(xs->rx, addr, len, flags);
        if (err) {
                xs->rx_queue_full++;
index 973557d5e4f762a1df1090ddf37e4c1326b933b3..7ecd4ccd24735da2f9af3b9665a835a4fde36fdb 100644 (file)
@@ -416,8 +416,10 @@ static int xp_init_dma_info(struct xsk_buff_pool *pool, struct xsk_dma_map *dma_
 
                for (i = 0; i < pool->heads_cnt; i++) {
                        struct xdp_buff_xsk *xskb = &pool->heads[i];
+                       u64 orig_addr;
 
-                       xp_init_xskb_dma(xskb, pool, dma_map->dma_pages, xskb->orig_addr);
+                       orig_addr = xskb->xdp.data_hard_start - pool->addrs - pool->headroom;
+                       xp_init_xskb_dma(xskb, pool, dma_map->dma_pages, orig_addr);
                }
        }