xref: /openbmc/linux/net/xdp/xdp_umem.h (revision dac09149)
1dac09149SBjörn Töpel /* SPDX-License-Identifier: GPL-2.0 */
2dac09149SBjörn Töpel /* XDP user-space packet buffer
3c0c77d8fSBjörn Töpel  * Copyright(c) 2018 Intel Corporation.
4c0c77d8fSBjörn Töpel  */
5c0c77d8fSBjörn Töpel 
6c0c77d8fSBjörn Töpel #ifndef XDP_UMEM_H_
7c0c77d8fSBjörn Töpel #define XDP_UMEM_H_
8c0c77d8fSBjörn Töpel 
9c0c77d8fSBjörn Töpel #include <linux/mm.h>
10c0c77d8fSBjörn Töpel #include <linux/if_xdp.h>
11c0c77d8fSBjörn Töpel #include <linux/workqueue.h>
12c0c77d8fSBjörn Töpel 
13423f3832SMagnus Karlsson #include "xsk_queue.h"
14c0c77d8fSBjörn Töpel #include "xdp_umem_props.h"
15c0c77d8fSBjörn Töpel 
16c0c77d8fSBjörn Töpel struct xdp_umem {
17423f3832SMagnus Karlsson 	struct xsk_queue *fq;
18fe230832SMagnus Karlsson 	struct xsk_queue *cq;
19c0c77d8fSBjörn Töpel 	struct page **pgs;
20c0c77d8fSBjörn Töpel 	struct xdp_umem_props props;
21c0c77d8fSBjörn Töpel 	u32 npgs;
22c0c77d8fSBjörn Töpel 	u32 frame_headroom;
23c0c77d8fSBjörn Töpel 	u32 nfpp_mask;
24c0c77d8fSBjörn Töpel 	u32 nfpplog2;
25c0c77d8fSBjörn Töpel 	u32 frame_size_log2;
26c0c77d8fSBjörn Töpel 	struct user_struct *user;
27c0c77d8fSBjörn Töpel 	struct pid *pid;
28c0c77d8fSBjörn Töpel 	unsigned long address;
29c0c77d8fSBjörn Töpel 	size_t size;
30c0c77d8fSBjörn Töpel 	atomic_t users;
31c0c77d8fSBjörn Töpel 	struct work_struct work;
32c0c77d8fSBjörn Töpel };
33c0c77d8fSBjörn Töpel 
34c497176cSBjörn Töpel static inline char *xdp_umem_get_data(struct xdp_umem *umem, u32 idx)
35c497176cSBjörn Töpel {
36c497176cSBjörn Töpel 	u64 pg, off;
37c497176cSBjörn Töpel 	char *data;
38c497176cSBjörn Töpel 
39c497176cSBjörn Töpel 	pg = idx >> umem->nfpplog2;
40c497176cSBjörn Töpel 	off = (idx & umem->nfpp_mask) << umem->frame_size_log2;
41c497176cSBjörn Töpel 
42c497176cSBjörn Töpel 	data = page_address(umem->pgs[pg]);
43c497176cSBjörn Töpel 	return data + off;
44c497176cSBjörn Töpel }
45c497176cSBjörn Töpel 
46c497176cSBjörn Töpel static inline char *xdp_umem_get_data_with_headroom(struct xdp_umem *umem,
47c497176cSBjörn Töpel 						    u32 idx)
48c497176cSBjörn Töpel {
49c497176cSBjörn Töpel 	return xdp_umem_get_data(umem, idx) + umem->frame_headroom;
50c497176cSBjörn Töpel }
51c497176cSBjörn Töpel 
52965a9909SMagnus Karlsson bool xdp_umem_validate_queues(struct xdp_umem *umem);
53c0c77d8fSBjörn Töpel int xdp_umem_reg(struct xdp_umem *umem, struct xdp_umem_reg *mr);
54c0c77d8fSBjörn Töpel void xdp_get_umem(struct xdp_umem *umem);
55c0c77d8fSBjörn Töpel void xdp_put_umem(struct xdp_umem *umem);
56c0c77d8fSBjörn Töpel int xdp_umem_create(struct xdp_umem **umem);
57c0c77d8fSBjörn Töpel 
58c0c77d8fSBjörn Töpel #endif /* XDP_UMEM_H_ */
59