]>
Commit | Line | Data |
---|---|---|
8d0c12a8 SR |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | ||
3 | #ifndef IOU_NAPI_H | |
4 | #define IOU_NAPI_H | |
5 | ||
6 | #include <linux/kernel.h> | |
7 | #include <linux/io_uring.h> | |
8 | #include <net/busy_poll.h> | |
9 | ||
10 | #ifdef CONFIG_NET_RX_BUSY_POLL | |
11 | ||
12 | void io_napi_init(struct io_ring_ctx *ctx); | |
13 | void io_napi_free(struct io_ring_ctx *ctx); | |
14 | ||
ef1186c1 SR |
15 | int io_register_napi(struct io_ring_ctx *ctx, void __user *arg); |
16 | int io_unregister_napi(struct io_ring_ctx *ctx, void __user *arg); | |
17 | ||
8d0c12a8 SR |
18 | void __io_napi_add(struct io_ring_ctx *ctx, struct socket *sock); |
19 | ||
20 | void __io_napi_adjust_timeout(struct io_ring_ctx *ctx, | |
21 | struct io_wait_queue *iowq, struct timespec64 *ts); | |
22 | void __io_napi_busy_loop(struct io_ring_ctx *ctx, struct io_wait_queue *iowq); | |
ff183d42 | 23 | int io_napi_sqpoll_busy_poll(struct io_ring_ctx *ctx); |
8d0c12a8 SR |
24 | |
25 | static inline bool io_napi(struct io_ring_ctx *ctx) | |
26 | { | |
27 | return !list_empty(&ctx->napi_list); | |
28 | } | |
29 | ||
30 | static inline void io_napi_adjust_timeout(struct io_ring_ctx *ctx, | |
31 | struct io_wait_queue *iowq, | |
32 | struct timespec64 *ts) | |
33 | { | |
34 | if (!io_napi(ctx)) | |
35 | return; | |
36 | __io_napi_adjust_timeout(ctx, iowq, ts); | |
37 | } | |
38 | ||
39 | static inline void io_napi_busy_loop(struct io_ring_ctx *ctx, | |
40 | struct io_wait_queue *iowq) | |
41 | { | |
42 | if (!io_napi(ctx)) | |
43 | return; | |
44 | __io_napi_busy_loop(ctx, iowq); | |
45 | } | |
46 | ||
47 | /* | |
48 | * io_napi_add() - Add napi id to the busy poll list | |
49 | * @req: pointer to io_kiocb request | |
50 | * | |
51 | * Add the napi id of the socket to the napi busy poll list and hash table. | |
52 | */ | |
53 | static inline void io_napi_add(struct io_kiocb *req) | |
54 | { | |
55 | struct io_ring_ctx *ctx = req->ctx; | |
56 | struct socket *sock; | |
57 | ||
58 | if (!READ_ONCE(ctx->napi_busy_poll_to)) | |
59 | return; | |
60 | ||
61 | sock = sock_from_file(req->file); | |
62 | if (sock) | |
63 | __io_napi_add(ctx, sock); | |
64 | } | |
65 | ||
66 | #else | |
67 | ||
68 | static inline void io_napi_init(struct io_ring_ctx *ctx) | |
69 | { | |
70 | } | |
71 | static inline void io_napi_free(struct io_ring_ctx *ctx) | |
72 | { | |
73 | } | |
ef1186c1 SR |
74 | static inline int io_register_napi(struct io_ring_ctx *ctx, void __user *arg) |
75 | { | |
76 | return -EOPNOTSUPP; | |
77 | } | |
78 | static inline int io_unregister_napi(struct io_ring_ctx *ctx, void __user *arg) | |
79 | { | |
80 | return -EOPNOTSUPP; | |
81 | } | |
8d0c12a8 SR |
82 | static inline bool io_napi(struct io_ring_ctx *ctx) |
83 | { | |
84 | return false; | |
85 | } | |
86 | static inline void io_napi_add(struct io_kiocb *req) | |
87 | { | |
88 | } | |
89 | static inline void io_napi_adjust_timeout(struct io_ring_ctx *ctx, | |
90 | struct io_wait_queue *iowq, | |
91 | struct timespec64 *ts) | |
92 | { | |
93 | } | |
94 | static inline void io_napi_busy_loop(struct io_ring_ctx *ctx, | |
95 | struct io_wait_queue *iowq) | |
96 | { | |
97 | } | |
ff183d42 SR |
98 | static inline int io_napi_sqpoll_busy_poll(struct io_ring_ctx *ctx) |
99 | { | |
100 | return 0; | |
101 | } | |
8d0c12a8 SR |
102 | #endif /* CONFIG_NET_RX_BUSY_POLL */ |
103 | ||
104 | #endif |