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_SPLICE_BATCH 32 11 12 struct io_notif_data { 13 struct file *file; 14 struct ubuf_info uarg; 15 unsigned long account_pages; 16 bool zc_report; 17 bool zc_used; 18 bool zc_copied; 19 }; 20 21 struct io_kiocb *io_alloc_notif(struct io_ring_ctx *ctx); 22 void io_notif_set_extended(struct io_kiocb *notif); 23 24 static inline struct io_notif_data *io_notif_to_data(struct io_kiocb *notif) 25 { 26 return io_kiocb_to_cmd(notif, struct io_notif_data); 27 } 28 29 static inline void io_notif_flush(struct io_kiocb *notif) 30 __must_hold(¬if->ctx->uring_lock) 31 { 32 struct io_notif_data *nd = io_notif_to_data(notif); 33 34 /* drop slot's master ref */ 35 if (refcount_dec_and_test(&nd->uarg.refcnt)) 36 io_req_task_work_add(notif); 37 } 38 39 static inline int io_notif_account_mem(struct io_kiocb *notif, unsigned len) 40 { 41 struct io_ring_ctx *ctx = notif->ctx; 42 struct io_notif_data *nd = io_notif_to_data(notif); 43 unsigned nr_pages = (len >> PAGE_SHIFT) + 2; 44 int ret; 45 46 if (ctx->user) { 47 ret = __io_account_mem(ctx->user, nr_pages); 48 if (ret) 49 return ret; 50 nd->account_pages += nr_pages; 51 } 52 return 0; 53 } 54