From d9857a5340c932c534af5f0a29573e3d67ab4d92 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Mon, 31 Jan 2022 02:17:54 +0300 Subject: [PATCH] Check for SQEs, not for completions Should finally fix Assertion `sqe != NULL' failed introduced after journaling refactor in 0.6.11... --- src/blockstore_impl.h | 2 +- src/ringloop.cpp | 8 ++++++++ src/ringloop.h | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) 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;