-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
xsk: Introduce AF_XDP buffer allocation API
In order to simplify AF_XDP zero-copy enablement for NIC driver developers, a new AF_XDP buffer allocation API is added. The implementation is based on a single core (single producer/consumer) buffer pool for the AF_XDP UMEM. A buffer is allocated using the xsk_buff_alloc() function, and returned using xsk_buff_free(). If a buffer is disassociated with the pool, e.g. when a buffer is passed to an AF_XDP socket, a buffer is said to be released. Currently, the release function is only used by the AF_XDP internals and not visible to the driver. Drivers using this API should register the XDP memory model with the new MEM_TYPE_XSK_BUFF_POOL type. The API is defined in net/xdp_sock_drv.h. The buffer type is struct xdp_buff, and follows the lifetime of regular xdp_buffs, i.e. the lifetime of an xdp_buff is restricted to a NAPI context. In other words, the API is not replacing xdp_frames. In addition to introducing the API and implementations, the AF_XDP core is migrated to use the new APIs. rfc->v1: Fixed build errors/warnings for m68k and riscv. (kbuild test robot) Added headroom/chunk size getter. (Maxim/Björn) v1->v2: Swapped SoBs. (Maxim) v2->v3: Initialize struct xdp_buff member frame_sz. (Björn) Add API to query the DMA address of a frame. (Maxim) Do DMA sync for CPU till the end of the frame to handle possible growth (frame_sz). (Maxim) Signed-off-by: Björn Töpel <bjorn.topel@intel.com> Signed-off-by: Maxim Mikityanskiy <maximmi@mellanox.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/20200520192103.355233-6-bjorn.topel@gmail.com
- Loading branch information
Björn Töpel
authored and
Alexei Starovoitov
committed
May 22, 2020
1 parent
89e4a37
commit 2b43470
Showing
12 changed files
with
819 additions
and
119 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
/* Copyright(c) 2020 Intel Corporation. */ | ||
|
||
#ifndef XSK_BUFF_POOL_H_ | ||
#define XSK_BUFF_POOL_H_ | ||
|
||
#include <linux/types.h> | ||
#include <linux/dma-mapping.h> | ||
#include <net/xdp.h> | ||
|
||
struct xsk_buff_pool; | ||
struct xdp_rxq_info; | ||
struct xsk_queue; | ||
struct xdp_desc; | ||
struct device; | ||
struct page; | ||
|
||
struct xdp_buff_xsk { | ||
struct xdp_buff xdp; | ||
dma_addr_t dma; | ||
dma_addr_t frame_dma; | ||
struct xsk_buff_pool *pool; | ||
bool unaligned; | ||
u64 orig_addr; | ||
struct list_head free_list_node; | ||
}; | ||
|
||
/* AF_XDP core. */ | ||
struct xsk_buff_pool *xp_create(struct page **pages, u32 nr_pages, u32 chunks, | ||
u32 chunk_size, u32 headroom, u64 size, | ||
bool unaligned); | ||
void xp_set_fq(struct xsk_buff_pool *pool, struct xsk_queue *fq); | ||
void xp_destroy(struct xsk_buff_pool *pool); | ||
void xp_release(struct xdp_buff_xsk *xskb); | ||
u64 xp_get_handle(struct xdp_buff_xsk *xskb); | ||
bool xp_validate_desc(struct xsk_buff_pool *pool, struct xdp_desc *desc); | ||
|
||
/* AF_XDP, and XDP core. */ | ||
void xp_free(struct xdp_buff_xsk *xskb); | ||
|
||
/* AF_XDP ZC drivers, via xdp_sock_buff.h */ | ||
void xp_set_rxq_info(struct xsk_buff_pool *pool, struct xdp_rxq_info *rxq); | ||
int xp_dma_map(struct xsk_buff_pool *pool, struct device *dev, | ||
unsigned long attrs, struct page **pages, u32 nr_pages); | ||
void xp_dma_unmap(struct xsk_buff_pool *pool, unsigned long attrs); | ||
struct xdp_buff *xp_alloc(struct xsk_buff_pool *pool); | ||
bool xp_can_alloc(struct xsk_buff_pool *pool, u32 count); | ||
void *xp_raw_get_data(struct xsk_buff_pool *pool, u64 addr); | ||
dma_addr_t xp_raw_get_dma(struct xsk_buff_pool *pool, u64 addr); | ||
dma_addr_t xp_get_dma(struct xdp_buff_xsk *xskb); | ||
dma_addr_t xp_get_frame_dma(struct xdp_buff_xsk *xskb); | ||
void xp_dma_sync_for_cpu(struct xdp_buff_xsk *xskb); | ||
void xp_dma_sync_for_device(struct xsk_buff_pool *pool, dma_addr_t dma, | ||
size_t size); | ||
|
||
#endif /* XSK_BUFF_POOL_H_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
# SPDX-License-Identifier: GPL-2.0-only | ||
obj-$(CONFIG_XDP_SOCKETS) += xsk.o xdp_umem.o xsk_queue.o xskmap.o | ||
obj-$(CONFIG_XDP_SOCKETS) += xsk_buff_pool.o | ||
obj-$(CONFIG_XDP_SOCKETS_DIAG) += xsk_diag.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.