Skip to content

Commit 725193e

Browse files
tavianatorioquatix
authored andcommitted
Use io_uring_sq_ready to count pending SQEs
Rather than account them ourselves with `pending`, just rely on liburing itself to keep proper track.
1 parent d59a55a commit 725193e

1 file changed

Lines changed: 18 additions & 13 deletions

File tree

ext/io/event/selector/uring.c

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ struct IO_Event_Selector_URing
3232
{
3333
struct IO_Event_Selector backend;
3434
struct io_uring ring;
35-
size_t pending;
3635

3736
// Flag indicating whether the selector is currently blocked in a system call.
3837
// Set to 1 when blocked in io_uring_wait_cqe_timeout() without GVL, 0 otherwise.
@@ -239,7 +238,6 @@ VALUE IO_Event_Selector_URing_allocate(VALUE self) {
239238
IO_Event_Selector_initialize(&selector->backend, self, Qnil);
240239
selector->ring.ring_fd = -1;
241240

242-
selector->pending = 0;
243241
selector->blocked = 0;
244242
selector->interrupt.descriptor = -1;
245243
selector->wakeup_registered = 0;
@@ -421,15 +419,14 @@ void IO_Event_Selector_URing_dump_completion_queue(struct IO_Event_Selector_URin
421419
// Flush the submission queue, optionally yielding if unsuccessful.
422420
static
423421
int io_uring_submit_all(struct IO_Event_Selector_URing *selector, bool yield) {
424-
while (selector->pending > 0) {
422+
struct io_uring *ring = &selector->ring;
423+
424+
while (io_uring_sq_ready(ring) > 0) {
425425
int result = io_uring_submit(&selector->ring);
426426

427-
if (result >= 0) {
428-
// io_uring_submit() returns the number of submitted SQEs
429-
selector->pending -= result;
430-
} else if (result == -EBUSY || result == -EAGAIN) {
427+
if (result == -EBUSY || result == -EAGAIN) {
431428
if (yield) IO_Event_Selector_yield(&selector->backend);
432-
} else {
429+
} else if (result < 0) {
433430
rb_syserr_fail(-result, "io_uring_submit_all:io_uring_submit");
434431
return result;
435432
}
@@ -442,23 +439,32 @@ int io_uring_submit_all(struct IO_Event_Selector_URing *selector, bool yield) {
442439
// Flush the submission queue if pending operations are present.
443440
static
444441
int io_uring_submit_flush(struct IO_Event_Selector_URing *selector) {
445-
if (DEBUG) fprintf(stderr, "io_uring_submit_now(pending=%ld)\n", selector->pending);
442+
if (DEBUG) {
443+
unsigned pending = io_uring_sq_ready(&selector->ring);
444+
fprintf(stderr, "io_uring_submit_flush(pending=%u)\n", pending);
445+
}
446446

447447
return io_uring_submit_all(selector, false);
448448
}
449449

450450
// Immediately flush the submission queue, yielding to the event loop if it was not successful.
451451
static
452452
int io_uring_submit_now(struct IO_Event_Selector_URing *selector) {
453-
if (DEBUG) fprintf(stderr, "io_uring_submit_now(pending=%ld)\n", selector->pending);
454-
453+
if (DEBUG) {
454+
unsigned pending = io_uring_sq_ready(&selector->ring);
455+
fprintf(stderr, "io_uring_submit_now(pending=%u)\n", pending);
456+
}
457+
455458
return io_uring_submit_all(selector, true);
456459
}
457460

458461
// Submit a pending operation. This does not submit the operation immediately, but instead defers it to the next call to `io_uring_submit_flush` or `io_uring_submit_now`. This is useful for operations that are not urgent, but should be used with care as it can lead to a deadlock if the submission queue is not flushed.
459462
static
460463
void io_uring_submit_pending(struct IO_Event_Selector_URing *selector) {
461-
if (DEBUG) fprintf(stderr, "io_uring_submit_pending(ring=%p, pending=%ld)\n", &selector->ring, selector->pending);
464+
if (DEBUG) {
465+
unsigned pending = io_uring_sq_ready(&selector->ring);
466+
fprintf(stderr, "io_uring_submit_pending(ring=%p, pending=%u)\n", &selector->ring, pending);
467+
}
462468
}
463469

464470
struct io_uring_sqe * io_get_sqe(struct IO_Event_Selector_URing *selector) {
@@ -471,7 +477,6 @@ struct io_uring_sqe * io_get_sqe(struct IO_Event_Selector_URing *selector) {
471477
sqe = io_uring_get_sqe(&selector->ring);
472478
}
473479

474-
selector->pending += 1;
475480
return sqe;
476481
}
477482

0 commit comments

Comments
 (0)