22#define IO_URING_TYPES_H
33
44#include <linux/blkdev.h>
5+ #include <linux/hashtable.h>
56#include <linux/task_work.h>
67#include <linux/bitmap.h>
78#include <linux/llist.h>
@@ -240,12 +241,14 @@ struct io_ring_ctx {
240241 unsigned int poll_activated : 1 ;
241242 unsigned int drain_disabled : 1 ;
242243 unsigned int compat : 1 ;
244+ unsigned int iowq_limits_set : 1 ;
243245
244246 struct task_struct * submitter_task ;
245247 struct io_rings * rings ;
246248 struct percpu_ref refs ;
247249
248250 enum task_work_notify_mode notify_method ;
251+ unsigned sq_thread_idle ;
249252 } ____cacheline_aligned_in_smp ;
250253
251254 /* submission data */
@@ -274,10 +277,20 @@ struct io_ring_ctx {
274277 */
275278 struct io_rsrc_node * rsrc_node ;
276279 atomic_t cancel_seq ;
280+
281+ /*
282+ * ->iopoll_list is protected by the ctx->uring_lock for
283+ * io_uring instances that don't use IORING_SETUP_SQPOLL.
284+ * For SQPOLL, only the single threaded io_sq_thread() will
285+ * manipulate the list, hence no extra locking is needed there.
286+ */
287+ bool poll_multi_queue ;
288+ struct io_wq_work_list iopoll_list ;
289+
277290 struct io_file_table file_table ;
291+ struct io_mapped_ubuf * * user_bufs ;
278292 unsigned nr_user_files ;
279293 unsigned nr_user_bufs ;
280- struct io_mapped_ubuf * * user_bufs ;
281294
282295 struct io_submit_state submit_state ;
283296
@@ -288,15 +301,6 @@ struct io_ring_ctx {
288301 struct io_alloc_cache apoll_cache ;
289302 struct io_alloc_cache netmsg_cache ;
290303
291- /*
292- * ->iopoll_list is protected by the ctx->uring_lock for
293- * io_uring instances that don't use IORING_SETUP_SQPOLL.
294- * For SQPOLL, only the single threaded io_sq_thread() will
295- * manipulate the list, hence no extra locking is needed there.
296- */
297- struct io_wq_work_list iopoll_list ;
298- bool poll_multi_queue ;
299-
300304 /*
301305 * Any cancelable uring_cmd is added to this list in
302306 * ->uring_cmd() by io_uring_cmd_insert_cancelable()
@@ -343,8 +347,8 @@ struct io_ring_ctx {
343347 spinlock_t completion_lock ;
344348
345349 /* IRQ completion list, under ->completion_lock */
346- struct io_wq_work_list locked_free_list ;
347350 unsigned int locked_free_nr ;
351+ struct io_wq_work_list locked_free_list ;
348352
349353 struct list_head io_buffers_comp ;
350354 struct list_head cq_overflow_list ;
@@ -366,9 +370,6 @@ struct io_ring_ctx {
366370 unsigned int file_alloc_start ;
367371 unsigned int file_alloc_end ;
368372
369- struct xarray personalities ;
370- u32 pers_next ;
371-
372373 struct list_head io_buffers_cache ;
373374
374375 /* deferred free list, protected by ->uring_lock */
@@ -389,6 +390,9 @@ struct io_ring_ctx {
389390 struct wait_queue_head rsrc_quiesce_wq ;
390391 unsigned rsrc_quiesce ;
391392
393+ u32 pers_next ;
394+ struct xarray personalities ;
395+
392396 /* hashed buffered write serialization */
393397 struct io_wq_hash * hash_map ;
394398
@@ -405,11 +409,22 @@ struct io_ring_ctx {
405409
406410 /* io-wq management, e.g. thread count */
407411 u32 iowq_limits [2 ];
408- bool iowq_limits_set ;
409412
410413 struct callback_head poll_wq_task_work ;
411414 struct list_head defer_list ;
412- unsigned sq_thread_idle ;
415+
416+ #ifdef CONFIG_NET_RX_BUSY_POLL
417+ struct list_head napi_list ; /* track busy poll napi_id */
418+ spinlock_t napi_lock ; /* napi_list lock */
419+
420+ /* napi busy poll default timeout */
421+ unsigned int napi_busy_poll_to ;
422+ bool napi_prefer_busy_poll ;
423+ bool napi_enabled ;
424+
425+ DECLARE_HASHTABLE (napi_ht , 4 );
426+ #endif
427+
413428 /* protected by ->completion_lock */
414429 unsigned evfd_last_cq_tail ;
415430
@@ -455,83 +470,95 @@ enum {
455470 REQ_F_SKIP_LINK_CQES_BIT ,
456471 REQ_F_SINGLE_POLL_BIT ,
457472 REQ_F_DOUBLE_POLL_BIT ,
458- REQ_F_PARTIAL_IO_BIT ,
459473 REQ_F_APOLL_MULTISHOT_BIT ,
460474 REQ_F_CLEAR_POLLIN_BIT ,
461475 REQ_F_HASH_LOCKED_BIT ,
462476 /* keep async read/write and isreg together and in order */
463477 REQ_F_SUPPORT_NOWAIT_BIT ,
464478 REQ_F_ISREG_BIT ,
465479 REQ_F_POLL_NO_LAZY_BIT ,
480+ REQ_F_CANCEL_SEQ_BIT ,
481+ REQ_F_CAN_POLL_BIT ,
482+ REQ_F_BL_EMPTY_BIT ,
483+ REQ_F_BL_NO_RECYCLE_BIT ,
466484
467485 /* not a real bit, just to check we're not overflowing the space */
468486 __REQ_F_LAST_BIT ,
469487};
470488
489+ typedef u64 __bitwise io_req_flags_t ;
490+ #define IO_REQ_FLAG (bitno ) ((__force io_req_flags_t) BIT_ULL((bitno)))
491+
471492enum {
472493 /* ctx owns file */
473- REQ_F_FIXED_FILE = BIT (REQ_F_FIXED_FILE_BIT ),
494+ REQ_F_FIXED_FILE = IO_REQ_FLAG (REQ_F_FIXED_FILE_BIT ),
474495 /* drain existing IO first */
475- REQ_F_IO_DRAIN = BIT (REQ_F_IO_DRAIN_BIT ),
496+ REQ_F_IO_DRAIN = IO_REQ_FLAG (REQ_F_IO_DRAIN_BIT ),
476497 /* linked sqes */
477- REQ_F_LINK = BIT (REQ_F_LINK_BIT ),
498+ REQ_F_LINK = IO_REQ_FLAG (REQ_F_LINK_BIT ),
478499 /* doesn't sever on completion < 0 */
479- REQ_F_HARDLINK = BIT (REQ_F_HARDLINK_BIT ),
500+ REQ_F_HARDLINK = IO_REQ_FLAG (REQ_F_HARDLINK_BIT ),
480501 /* IOSQE_ASYNC */
481- REQ_F_FORCE_ASYNC = BIT (REQ_F_FORCE_ASYNC_BIT ),
502+ REQ_F_FORCE_ASYNC = IO_REQ_FLAG (REQ_F_FORCE_ASYNC_BIT ),
482503 /* IOSQE_BUFFER_SELECT */
483- REQ_F_BUFFER_SELECT = BIT (REQ_F_BUFFER_SELECT_BIT ),
504+ REQ_F_BUFFER_SELECT = IO_REQ_FLAG (REQ_F_BUFFER_SELECT_BIT ),
484505 /* IOSQE_CQE_SKIP_SUCCESS */
485- REQ_F_CQE_SKIP = BIT (REQ_F_CQE_SKIP_BIT ),
506+ REQ_F_CQE_SKIP = IO_REQ_FLAG (REQ_F_CQE_SKIP_BIT ),
486507
487508 /* fail rest of links */
488- REQ_F_FAIL = BIT (REQ_F_FAIL_BIT ),
509+ REQ_F_FAIL = IO_REQ_FLAG (REQ_F_FAIL_BIT ),
489510 /* on inflight list, should be cancelled and waited on exit reliably */
490- REQ_F_INFLIGHT = BIT (REQ_F_INFLIGHT_BIT ),
511+ REQ_F_INFLIGHT = IO_REQ_FLAG (REQ_F_INFLIGHT_BIT ),
491512 /* read/write uses file position */
492- REQ_F_CUR_POS = BIT (REQ_F_CUR_POS_BIT ),
513+ REQ_F_CUR_POS = IO_REQ_FLAG (REQ_F_CUR_POS_BIT ),
493514 /* must not punt to workers */
494- REQ_F_NOWAIT = BIT (REQ_F_NOWAIT_BIT ),
515+ REQ_F_NOWAIT = IO_REQ_FLAG (REQ_F_NOWAIT_BIT ),
495516 /* has or had linked timeout */
496- REQ_F_LINK_TIMEOUT = BIT (REQ_F_LINK_TIMEOUT_BIT ),
517+ REQ_F_LINK_TIMEOUT = IO_REQ_FLAG (REQ_F_LINK_TIMEOUT_BIT ),
497518 /* needs cleanup */
498- REQ_F_NEED_CLEANUP = BIT (REQ_F_NEED_CLEANUP_BIT ),
519+ REQ_F_NEED_CLEANUP = IO_REQ_FLAG (REQ_F_NEED_CLEANUP_BIT ),
499520 /* already went through poll handler */
500- REQ_F_POLLED = BIT (REQ_F_POLLED_BIT ),
521+ REQ_F_POLLED = IO_REQ_FLAG (REQ_F_POLLED_BIT ),
501522 /* buffer already selected */
502- REQ_F_BUFFER_SELECTED = BIT (REQ_F_BUFFER_SELECTED_BIT ),
523+ REQ_F_BUFFER_SELECTED = IO_REQ_FLAG (REQ_F_BUFFER_SELECTED_BIT ),
503524 /* buffer selected from ring, needs commit */
504- REQ_F_BUFFER_RING = BIT (REQ_F_BUFFER_RING_BIT ),
525+ REQ_F_BUFFER_RING = IO_REQ_FLAG (REQ_F_BUFFER_RING_BIT ),
505526 /* caller should reissue async */
506- REQ_F_REISSUE = BIT (REQ_F_REISSUE_BIT ),
527+ REQ_F_REISSUE = IO_REQ_FLAG (REQ_F_REISSUE_BIT ),
507528 /* supports async reads/writes */
508- REQ_F_SUPPORT_NOWAIT = BIT (REQ_F_SUPPORT_NOWAIT_BIT ),
529+ REQ_F_SUPPORT_NOWAIT = IO_REQ_FLAG (REQ_F_SUPPORT_NOWAIT_BIT ),
509530 /* regular file */
510- REQ_F_ISREG = BIT (REQ_F_ISREG_BIT ),
531+ REQ_F_ISREG = IO_REQ_FLAG (REQ_F_ISREG_BIT ),
511532 /* has creds assigned */
512- REQ_F_CREDS = BIT (REQ_F_CREDS_BIT ),
533+ REQ_F_CREDS = IO_REQ_FLAG (REQ_F_CREDS_BIT ),
513534 /* skip refcounting if not set */
514- REQ_F_REFCOUNT = BIT (REQ_F_REFCOUNT_BIT ),
535+ REQ_F_REFCOUNT = IO_REQ_FLAG (REQ_F_REFCOUNT_BIT ),
515536 /* there is a linked timeout that has to be armed */
516- REQ_F_ARM_LTIMEOUT = BIT (REQ_F_ARM_LTIMEOUT_BIT ),
537+ REQ_F_ARM_LTIMEOUT = IO_REQ_FLAG (REQ_F_ARM_LTIMEOUT_BIT ),
517538 /* ->async_data allocated */
518- REQ_F_ASYNC_DATA = BIT (REQ_F_ASYNC_DATA_BIT ),
539+ REQ_F_ASYNC_DATA = IO_REQ_FLAG (REQ_F_ASYNC_DATA_BIT ),
519540 /* don't post CQEs while failing linked requests */
520- REQ_F_SKIP_LINK_CQES = BIT (REQ_F_SKIP_LINK_CQES_BIT ),
541+ REQ_F_SKIP_LINK_CQES = IO_REQ_FLAG (REQ_F_SKIP_LINK_CQES_BIT ),
521542 /* single poll may be active */
522- REQ_F_SINGLE_POLL = BIT (REQ_F_SINGLE_POLL_BIT ),
543+ REQ_F_SINGLE_POLL = IO_REQ_FLAG (REQ_F_SINGLE_POLL_BIT ),
523544 /* double poll may active */
524- REQ_F_DOUBLE_POLL = BIT (REQ_F_DOUBLE_POLL_BIT ),
525- /* request has already done partial IO */
526- REQ_F_PARTIAL_IO = BIT (REQ_F_PARTIAL_IO_BIT ),
545+ REQ_F_DOUBLE_POLL = IO_REQ_FLAG (REQ_F_DOUBLE_POLL_BIT ),
527546 /* fast poll multishot mode */
528- REQ_F_APOLL_MULTISHOT = BIT (REQ_F_APOLL_MULTISHOT_BIT ),
547+ REQ_F_APOLL_MULTISHOT = IO_REQ_FLAG (REQ_F_APOLL_MULTISHOT_BIT ),
529548 /* recvmsg special flag, clear EPOLLIN */
530- REQ_F_CLEAR_POLLIN = BIT (REQ_F_CLEAR_POLLIN_BIT ),
549+ REQ_F_CLEAR_POLLIN = IO_REQ_FLAG (REQ_F_CLEAR_POLLIN_BIT ),
531550 /* hashed into ->cancel_hash_locked, protected by ->uring_lock */
532- REQ_F_HASH_LOCKED = BIT (REQ_F_HASH_LOCKED_BIT ),
551+ REQ_F_HASH_LOCKED = IO_REQ_FLAG (REQ_F_HASH_LOCKED_BIT ),
533552 /* don't use lazy poll wake for this request */
534- REQ_F_POLL_NO_LAZY = BIT (REQ_F_POLL_NO_LAZY_BIT ),
553+ REQ_F_POLL_NO_LAZY = IO_REQ_FLAG (REQ_F_POLL_NO_LAZY_BIT ),
554+ /* cancel sequence is set and valid */
555+ REQ_F_CANCEL_SEQ = IO_REQ_FLAG (REQ_F_CANCEL_SEQ_BIT ),
556+ /* file is pollable */
557+ REQ_F_CAN_POLL = IO_REQ_FLAG (REQ_F_CAN_POLL_BIT ),
558+ /* buffer list was empty after selection of buffer */
559+ REQ_F_BL_EMPTY = IO_REQ_FLAG (REQ_F_BL_EMPTY_BIT ),
560+ /* don't recycle provided buffers for this request */
561+ REQ_F_BL_NO_RECYCLE = IO_REQ_FLAG (REQ_F_BL_NO_RECYCLE_BIT ),
535562};
536563
537564typedef void (* io_req_tw_func_t )(struct io_kiocb * req , struct io_tw_state * ts );
@@ -592,15 +619,17 @@ struct io_kiocb {
592619 * and after selection it points to the buffer ID itself.
593620 */
594621 u16 buf_index ;
595- unsigned int flags ;
622+
623+ unsigned nr_tw ;
624+
625+ /* REQ_F_* flags */
626+ io_req_flags_t flags ;
596627
597628 struct io_cqe cqe ;
598629
599630 struct io_ring_ctx * ctx ;
600631 struct task_struct * task ;
601632
602- struct io_rsrc_node * rsrc_node ;
603-
604633 union {
605634 /* store used ubuf, so we can prevent reloading */
606635 struct io_mapped_ubuf * imu ;
@@ -621,10 +650,12 @@ struct io_kiocb {
621650 /* cache ->apoll->events */
622651 __poll_t apoll_events ;
623652 };
653+
654+ struct io_rsrc_node * rsrc_node ;
655+
624656 atomic_t refs ;
625657 atomic_t poll_refs ;
626658 struct io_task_work io_task_work ;
627- unsigned nr_tw ;
628659 /* for polled requests, i.e. IORING_OP_POLL_ADD and async armed poll */
629660 struct hlist_node hash_node ;
630661 /* internal polling, see IORING_FEAT_FAST_POLL */
0 commit comments