xref: /linux/io_uring/zcrx.h (revision a3d14d1602ca11429d242d230c31af8f822f614f)
16f377873SDavid Wei // SPDX-License-Identifier: GPL-2.0
26f377873SDavid Wei #ifndef IOU_ZC_RX_H
36f377873SDavid Wei #define IOU_ZC_RX_H
46f377873SDavid Wei 
56f377873SDavid Wei #include <linux/io_uring_types.h>
611ed914bSDavid Wei #include <linux/dma-buf.h>
7cf96310cSDavid Wei #include <linux/socket.h>
8035af94bSPavel Begunkov #include <net/page_pool/types.h>
9cf96310cSDavid Wei #include <net/net_trackers.h>
10cf96310cSDavid Wei 
11cf96310cSDavid Wei struct io_zcrx_mem {
12cf96310cSDavid Wei 	unsigned long			size;
1334a3e608SPavel Begunkov 	bool				is_dmabuf;
14cf96310cSDavid Wei 
15db070446SPavel Begunkov 	struct page			**pages;
16cf96310cSDavid Wei 	unsigned long			nr_folios;
17cf96310cSDavid Wei 
185a17131aSPavel Begunkov 	struct dma_buf_attachment	*attach;
19cf96310cSDavid Wei 	struct dma_buf			*dmabuf;
20cf96310cSDavid Wei 	struct sg_table			*sgt;
21cf96310cSDavid Wei 	unsigned long			dmabuf_offset;
22cf96310cSDavid Wei };
23cf96310cSDavid Wei 
24cf96310cSDavid Wei struct io_zcrx_area {
256f377873SDavid Wei 	struct net_iov_area	nia;
266f377873SDavid Wei 	struct io_zcrx_ifq	*ifq;
276f377873SDavid Wei 	atomic_t		*user_refs;
28cf96310cSDavid Wei 
29cf96310cSDavid Wei 	bool			is_mapped;
309b58440aSPavel Begunkov 	u16			area_id;
316f377873SDavid Wei 
326f377873SDavid Wei 	/* freelist */
3334a3e608SPavel Begunkov 	spinlock_t		freelist_lock ____cacheline_aligned_in_smp;
349b58440aSPavel Begunkov 	u32			free_count;
356f377873SDavid Wei 	u32			*freelist;
366f377873SDavid Wei 
37035af94bSPavel Begunkov 	struct io_zcrx_mem	mem;
38035af94bSPavel Begunkov };
39035af94bSPavel Begunkov 
40035af94bSPavel Begunkov struct io_zcrx_ifq {
41*f12ecf5eSPavel Begunkov 	struct io_ring_ctx		*ctx;
426f377873SDavid Wei 	struct io_zcrx_area		*area;
436f377873SDavid Wei 
446f377873SDavid Wei 	spinlock_t			rq_lock ____cacheline_aligned_in_smp;
456f377873SDavid Wei 	struct io_uring			*rq_ring;
466f377873SDavid Wei 	struct io_uring_zcrx_rqe	*rqes;
476f377873SDavid Wei 	u32				cached_rq_head;
486f377873SDavid Wei 	u32				rq_entries;
4911ed914bSDavid Wei 
5011ed914bSDavid Wei 	u32				if_rxq;
516699ec9aSDavid Wei 	struct device			*dev;
526f377873SDavid Wei 	struct net_device		*netdev;
536f377873SDavid Wei 	netdevice_tracker		netdev_tracker;
546f377873SDavid Wei 	spinlock_t			lock;
556f377873SDavid Wei 	struct mutex			dma_lock;
566f377873SDavid Wei 	struct io_mapped_region		region;
576f377873SDavid Wei };
586f377873SDavid Wei 
596f377873SDavid Wei #if defined(CONFIG_IO_URING_ZCRX)
606f377873SDavid Wei int io_register_zcrx_ifq(struct io_ring_ctx *ctx,
616f377873SDavid Wei 			 struct io_uring_zcrx_ifq_reg __user *arg);
626f377873SDavid Wei void io_unregister_zcrx_ifqs(struct io_ring_ctx *ctx);
636f377873SDavid Wei void io_shutdown_zcrx_ifqs(struct io_ring_ctx *ctx);
6411ed914bSDavid Wei int io_zcrx_recv(struct io_kiocb *req, struct io_zcrx_ifq *ifq,
6511ed914bSDavid Wei 		 struct socket *sock, unsigned int flags,
666699ec9aSDavid Wei 		 unsigned issue_flags, unsigned int *len);
6711ed914bSDavid Wei struct io_mapped_region *io_zcrx_get_region(struct io_ring_ctx *ctx,
6811ed914bSDavid Wei 					    unsigned int id);
6911ed914bSDavid Wei #else
io_register_zcrx_ifq(struct io_ring_ctx * ctx,struct io_uring_zcrx_ifq_reg __user * arg)706f377873SDavid Wei static inline int io_register_zcrx_ifq(struct io_ring_ctx *ctx,
716f377873SDavid Wei 					struct io_uring_zcrx_ifq_reg __user *arg)
7211ed914bSDavid Wei {
7311ed914bSDavid Wei 	return -EOPNOTSUPP;
7411ed914bSDavid Wei }
io_unregister_zcrx_ifqs(struct io_ring_ctx * ctx)756f377873SDavid Wei static inline void io_unregister_zcrx_ifqs(struct io_ring_ctx *ctx)
76 {
77 }
io_shutdown_zcrx_ifqs(struct io_ring_ctx * ctx)78 static inline void io_shutdown_zcrx_ifqs(struct io_ring_ctx *ctx)
79 {
80 }
io_zcrx_recv(struct io_kiocb * req,struct io_zcrx_ifq * ifq,struct socket * sock,unsigned int flags,unsigned issue_flags,unsigned int * len)81 static inline int io_zcrx_recv(struct io_kiocb *req, struct io_zcrx_ifq *ifq,
82 			       struct socket *sock, unsigned int flags,
83 			       unsigned issue_flags, unsigned int *len)
84 {
85 	return -EOPNOTSUPP;
86 }
io_zcrx_get_region(struct io_ring_ctx * ctx,unsigned int id)87 static inline struct io_mapped_region *io_zcrx_get_region(struct io_ring_ctx *ctx,
88 							  unsigned int id)
89 {
90 	return NULL;
91 }
92 #endif
93 
94 int io_recvzc(struct io_kiocb *req, unsigned int issue_flags);
95 int io_recvzc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe);
96 
97 #endif
98