If IORING_SETUP_COOP_TASKRUN is set to use cooperative scheduling for running task_work, then IORING_SETUP_TASKRUN_FLAG can be set so the application can tell if task_work is pending in the kernel for this ring. This allows use cases like io_uring_peek_cqe() to still function appropriately, or for the task to know when it would be useful to call io_uring_wait_cqe() to run pending events.
Showing the changes to include/uapi (1 of 2 files). Show all
Unified · Split
| @@ -110,6 +110,12 @@ enum { · 109 unmodified lines | |||
| 110 | * a task running in userspace, and saves an IPI. | 110 | * a task running in userspace, and saves an IPI. |
| 111 | */ | 111 | */ |
| 112 | #define IORING_SETUP_COOP_TASKRUN (1U << 8) | 112 | #define IORING_SETUP_COOP_TASKRUN (1U << 8) |
| 113 | /* | ||
| 114 | * If COOP_TASKRUN is set, get notified if task work is available for | ||
| 115 | * running and a kernel transition would be needed to run it. This sets | ||
| 116 | * IORING_SQ_TASKRUN in the sq ring flags. Not valid with COOP_TASKRUN. | ||
| 117 | */ | ||
| 118 | #define IORING_SETUP_TASKRUN_FLAG (1U << 9) | ||
| 113 | 119 | ||
| 114 | enum { | 120 | enum { |
| 115 | IORING_OP_NOP, | 121 | IORING_OP_NOP, |
| @@ -256,6 +262,7 @@ struct io_sqring_offsets { · 140 unmodified lines | |||
| 256 | */ | 262 | */ |
| 257 | #define IORING_SQ_NEED_WAKEUP (1U << 0) /* needs io_uring_enter wakeup */ | 263 | #define IORING_SQ_NEED_WAKEUP (1U << 0) /* needs io_uring_enter wakeup */ |
| 258 | #define IORING_SQ_CQ_OVERFLOW (1U << 1) /* CQ ring is overflown */ | 264 | #define IORING_SQ_CQ_OVERFLOW (1U << 1) /* CQ ring is overflown */ |
| 265 | #define IORING_SQ_TASKRUN (1U << 2) /* task should enter the kernel */ | ||
| 259 | 266 | ||
| 260 | struct io_cqring_offsets { | 267 | struct io_cqring_offsets { |
| 261 | __u32 head; | 268 | __u32 head; |