Line data Source code
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 0 : 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 : }