diff --git a/src/blockstore_impl.h b/src/blockstore_impl.h index d7a78504..037636e1 100644 --- a/src/blockstore_impl.h +++ b/src/blockstore_impl.h @@ -55,7 +55,7 @@ #define IS_DELETE(st) (((st) & 0x0F) == BS_ST_DELETE) #define BS_SUBMIT_CHECK_SQES(n) \ - if (ringloop->space_left() < (n))\ + if (ringloop->sqes_left() < (n))\ {\ /* Pause until there are more requests available */\ PRIV(op)->wait_for = WAIT_SQE;\ diff --git a/src/ringloop.cpp b/src/ringloop.cpp index ccfba0ac..1e39b357 100644 --- a/src/ringloop.cpp +++ b/src/ringloop.cpp @@ -112,3 +112,11 @@ void ring_loop_t::restore(unsigned sqe_tail) } ring.sq.sqe_tail = sqe_tail; } + +int ring_loop_t::sqes_left() +{ + struct io_uring_sq *sq = &ring.sq; + unsigned int head = io_uring_smp_load_acquire(sq->khead); + unsigned int next = sq->sqe_tail + 1; + return *sq->kring_entries - (next - head); +} diff --git a/src/ringloop.h b/src/ringloop.h index 88b98645..18d1191b 100644 --- a/src/ringloop.h +++ b/src/ringloop.h @@ -172,6 +172,7 @@ public: struct io_uring_cqe *cqe; return io_uring_wait_cqe(&ring, &cqe); } + int sqes_left(); inline unsigned space_left() { return free_ring_data_ptr;