FDMON_IO_URING_ENTRIES = 128, /* sq/cq ring size */
/* AioHandler::flags */
- FDMON_IO_URING_PENDING = (1 << 0),
- FDMON_IO_URING_ADD = (1 << 1),
- FDMON_IO_URING_REMOVE = (1 << 2),
+ FDMON_IO_URING_PENDING = (1 << 0),
+ FDMON_IO_URING_ADD = (1 << 1),
+ FDMON_IO_URING_REMOVE = (1 << 2),
+ FDMON_IO_URING_DELETE_AIO_HANDLER = (1 << 3),
};
static inline int poll_events_from_pfd(int pfd_events)
if (flags & FDMON_IO_URING_REMOVE) {
add_poll_remove_sqe(ctx, node);
}
+ if (flags & FDMON_IO_URING_DELETE_AIO_HANDLER) {
+ /*
+ * process_cqe() sets this flag after ADD and REMOVE have been
+ * cleared. They cannot be set again, so they must be clear.
+ */
+ assert(!(flags & FDMON_IO_URING_ADD));
+ assert(!(flags & FDMON_IO_URING_REMOVE));
+
+ QLIST_INSERT_HEAD_RCU(&ctx->deleted_aio_handlers, node, node_deleted);
+ }
}
}
*/
flags = qatomic_fetch_and(&node->flags, ~FDMON_IO_URING_REMOVE);
if (flags & FDMON_IO_URING_REMOVE) {
- QLIST_INSERT_HEAD_RCU(&ctx->deleted_aio_handlers, node, node_deleted);
+ if (flags & FDMON_IO_URING_PENDING) {
+ /* Still on ctx->submit_list, defer deletion until fill_sq_ring() */
+ qatomic_or(&node->flags, FDMON_IO_URING_DELETE_AIO_HANDLER);
+ } else {
+ QLIST_INSERT_HEAD_RCU(&ctx->deleted_aio_handlers, node, node_deleted);
+ }
return false;
}
unsigned flags = qatomic_fetch_and(&node->flags,
~(FDMON_IO_URING_PENDING |
FDMON_IO_URING_ADD |
- FDMON_IO_URING_REMOVE));
+ FDMON_IO_URING_REMOVE |
+ FDMON_IO_URING_DELETE_AIO_HANDLER));
- if (flags & FDMON_IO_URING_REMOVE) {
- QLIST_INSERT_HEAD_RCU(&ctx->deleted_aio_handlers, node, node_deleted);
+ if ((flags & FDMON_IO_URING_REMOVE) ||
+ (flags & FDMON_IO_URING_DELETE_AIO_HANDLER)) {
+ QLIST_INSERT_HEAD_RCU(&ctx->deleted_aio_handlers,
+ node, node_deleted);
}
QSLIST_REMOVE_HEAD_RCU(&ctx->submit_list, node_submitted);