1 // SPDX-License-Identifier: GPL-2.0 2 3 #include <linux/net.h> 4 #include <linux/uio.h> 5 #include <net/sock.h> 6 #include <linux/nospec.h> 7 8 #include "rsrc.h" 9 10 #define IO_NOTIF_UBUF_FLAGS (SKBFL_ZEROCOPY_FRAG | SKBFL_DONT_ORPHAN) 11 #define IO_NOTIF_SPLICE_BATCH 32 12 13 struct io_notif_data { 14 struct file *file; 15 struct ubuf_info uarg; 16 17 struct io_notif_data *next; 18 struct io_notif_data *head; 19 20 unsigned account_pages; 21 bool zc_report; 22 bool zc_used; 23 bool zc_copied; 24 }; 25 26 struct io_kiocb *io_alloc_notif(struct io_ring_ctx *ctx); 27 void io_tx_ubuf_complete(struct sk_buff *skb, struct ubuf_info *uarg, 28 bool success); 29 io_notif_to_data(struct io_kiocb * notif)30static inline struct io_notif_data *io_notif_to_data(struct io_kiocb *notif) 31 { 32 return io_kiocb_to_cmd(notif, struct io_notif_data); 33 } 34 io_notif_flush(struct io_kiocb * notif)35static inline void io_notif_flush(struct io_kiocb *notif) 36 __must_hold(¬if->ctx->uring_lock) 37 { 38 struct io_notif_data *nd = io_notif_to_data(notif); 39 40 io_tx_ubuf_complete(NULL, &nd->uarg, true); 41 } 42 io_notif_account_mem(struct io_kiocb * notif,unsigned len)43static inline int io_notif_account_mem(struct io_kiocb *notif, unsigned len) 44 { 45 struct io_ring_ctx *ctx = notif->ctx; 46 struct io_notif_data *nd = io_notif_to_data(notif); 47 unsigned nr_pages = (len >> PAGE_SHIFT) + 2; 48 int ret; 49 50 if (ctx->user) { 51 ret = __io_account_mem(ctx->user, nr_pages); 52 if (ret) 53 return ret; 54 nd->account_pages += nr_pages; 55 } 56 return 0; 57 } 58