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 void io_notif_flush(struct io_kiocb *notif); 22 struct io_kiocb *io_alloc_notif(struct io_ring_ctx *ctx); 23 io_notif_to_data(struct io_kiocb * notif)24static 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 io_notif_account_mem(struct io_kiocb * notif,unsigned len)29static inline int io_notif_account_mem(struct io_kiocb *notif, unsigned len) 30 { 31 struct io_ring_ctx *ctx = notif->ctx; 32 struct io_notif_data *nd = io_notif_to_data(notif); 33 unsigned nr_pages = (len >> PAGE_SHIFT) + 2; 34 int ret; 35 36 if (ctx->user) { 37 ret = __io_account_mem(ctx->user, nr_pages); 38 if (ret) 39 return ret; 40 nd->account_pages += nr_pages; 41 } 42 return 0; 43 } 44