]>
Commit | Line | Data |
---|---|---|
eb42cebb PB |
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 | ||
6a9ce66f PB |
8 | #include "rsrc.h" |
9 | ||
519760df | 10 | #define IO_NOTIF_UBUF_FLAGS (SKBFL_ZEROCOPY_FRAG | SKBFL_DONT_ORPHAN) |
eb4a299b PB |
11 | #define IO_NOTIF_SPLICE_BATCH 32 |
12 | ||
14b146b6 PB |
13 | struct io_notif_data { |
14 | struct file *file; | |
eb42cebb | 15 | struct ubuf_info uarg; |
d6e29506 | 16 | |
6fe42209 PB |
17 | struct io_notif_data *next; |
18 | struct io_notif_data *head; | |
19 | ||
d6e29506 | 20 | unsigned account_pages; |
e307e669 SM |
21 | bool zc_report; |
22 | bool zc_used; | |
23 | bool zc_copied; | |
eb42cebb PB |
24 | }; |
25 | ||
b48c312b | 26 | struct io_kiocb *io_alloc_notif(struct io_ring_ctx *ctx); |
5a569469 PB |
27 | void io_tx_ubuf_complete(struct sk_buff *skb, struct ubuf_info *uarg, |
28 | bool success); | |
eb42cebb | 29 | |
14b146b6 PB |
30 | static inline struct io_notif_data *io_notif_to_data(struct io_kiocb *notif) |
31 | { | |
f2ccb5ae | 32 | return io_kiocb_to_cmd(notif, struct io_notif_data); |
14b146b6 PB |
33 | } |
34 | ||
bedd20bc PB |
35 | static 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 | ||
5a569469 | 40 | io_tx_ubuf_complete(NULL, &nd->uarg, true); |
bedd20bc PB |
41 | } |
42 | ||
14b146b6 | 43 | static inline int io_notif_account_mem(struct io_kiocb *notif, unsigned len) |
6a9ce66f PB |
44 | { |
45 | struct io_ring_ctx *ctx = notif->ctx; | |
14b146b6 | 46 | struct io_notif_data *nd = io_notif_to_data(notif); |
6a9ce66f PB |
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; | |
14b146b6 | 54 | nd->account_pages += nr_pages; |
6a9ce66f PB |
55 | } |
56 | return 0; | |
57 | } |