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