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 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 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); 23 int io_napi_sqpoll_busy_poll(struct io_ring_ctx *ctx); 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 } 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 } 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 } 98 static inline int io_napi_sqpoll_busy_poll(struct io_ring_ctx *ctx) 99 { 100 return 0; 101 } 102 #endif /* CONFIG_NET_RX_BUSY_POLL */ 103 104 #endif 105