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 | 110 | * a task running in userspace, and saves an IPI. |
| 111 | 111 | */ |
| 112 | 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 | 120 | enum { |
| 115 | 121 | IORING_OP_NOP, |
| @@ -256,6 +262,7 @@ struct io_sqring_offsets { · 140 unmodified lines | ||
| 256 | 262 | */ |
| 257 | 263 | #define IORING_SQ_NEED_WAKEUP (1U << 0) /* needs io_uring_enter wakeup */ |
| 258 | 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 | 267 | struct io_cqring_offsets { |
| 261 | 268 | __u32 head; |