Skip to content

Commit

Permalink
xsk: Move addrs from buffer pool to umem
Browse files Browse the repository at this point in the history
Replicate the addrs pointer in the buffer pool to the umem. This mapping
will be the same for all buffer pools sharing the same umem. In the
buffer pool we leave the addrs pointer for performance reasons.

Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Björn Töpel <bjorn.topel@intel.com>
Link: https://lore.kernel.org/bpf/1598603189-32145-8-git-send-email-magnus.karlsson@intel.com
  • Loading branch information
Magnus Karlsson authored and Daniel Borkmann committed Aug 31, 2020
1 parent a5aa8e5 commit 7f7ffa4
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 19 deletions.
1 change: 1 addition & 0 deletions include/net/xdp_sock.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ struct xsk_queue;
struct xdp_buff;

struct xdp_umem {
void *addrs;
u64 size;
u32 headroom;
u32 chunk_size;
Expand Down
22 changes: 22 additions & 0 deletions net/xdp/xdp_umem.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,27 @@ static void xdp_umem_unaccount_pages(struct xdp_umem *umem)
}
}

static void xdp_umem_addr_unmap(struct xdp_umem *umem)
{
vunmap(umem->addrs);
umem->addrs = NULL;
}

static int xdp_umem_addr_map(struct xdp_umem *umem, struct page **pages,
u32 nr_pages)
{
umem->addrs = vmap(pages, nr_pages, VM_MAP, PAGE_KERNEL);
if (!umem->addrs)
return -ENOMEM;
return 0;
}

static void xdp_umem_release(struct xdp_umem *umem)
{
umem->zc = false;
ida_simple_remove(&umem_ida, umem->id);

xdp_umem_addr_unmap(umem);
xdp_umem_unpin_pages(umem);

xdp_umem_unaccount_pages(umem);
Expand Down Expand Up @@ -192,8 +208,14 @@ static int xdp_umem_reg(struct xdp_umem *umem, struct xdp_umem_reg *mr)
if (err)
goto out_account;

err = xdp_umem_addr_map(umem, umem->pgs, umem->npgs);
if (err)
goto out_unpin;

return 0;

out_unpin:
xdp_umem_unpin_pages(umem);
out_account:
xdp_umem_unaccount_pages(umem);
return err;
Expand Down
21 changes: 2 additions & 19 deletions net/xdp/xsk_buff_pool.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,26 +35,11 @@ void xp_del_xsk(struct xsk_buff_pool *pool, struct xdp_sock *xs)
spin_unlock_irqrestore(&pool->xsk_tx_list_lock, flags);
}

static void xp_addr_unmap(struct xsk_buff_pool *pool)
{
vunmap(pool->addrs);
}

static int xp_addr_map(struct xsk_buff_pool *pool,
struct page **pages, u32 nr_pages)
{
pool->addrs = vmap(pages, nr_pages, VM_MAP, PAGE_KERNEL);
if (!pool->addrs)
return -ENOMEM;
return 0;
}

void xp_destroy(struct xsk_buff_pool *pool)
{
if (!pool)
return;

xp_addr_unmap(pool);
kvfree(pool->heads);
kvfree(pool);
}
Expand All @@ -64,7 +49,6 @@ struct xsk_buff_pool *xp_create_and_assign_umem(struct xdp_sock *xs,
{
struct xsk_buff_pool *pool;
struct xdp_buff_xsk *xskb;
int err;
u32 i;

pool = kvzalloc(struct_size(pool, free_heads, umem->chunks),
Expand All @@ -86,6 +70,7 @@ struct xsk_buff_pool *xp_create_and_assign_umem(struct xdp_sock *xs,
pool->frame_len = umem->chunk_size - umem->headroom -
XDP_PACKET_HEADROOM;
pool->umem = umem;
pool->addrs = umem->addrs;
INIT_LIST_HEAD(&pool->free_list);
INIT_LIST_HEAD(&pool->xsk_tx_list);
spin_lock_init(&pool->xsk_tx_list_lock);
Expand All @@ -103,9 +88,7 @@ struct xsk_buff_pool *xp_create_and_assign_umem(struct xdp_sock *xs,
pool->free_heads[i] = xskb;
}

err = xp_addr_map(pool, umem->pgs, umem->npgs);
if (!err)
return pool;
return pool;

out:
xp_destroy(pool);
Expand Down

0 comments on commit 7f7ffa4

Please sign in to comment.