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