Browse Source

Check for SQEs, not for completions

Should finally fix Assertion `sqe != NULL' failed introduced after journaling
refactor in 0.6.11...
non-odp-rdma
Vitaliy Filippov 5 months ago
parent
commit
d9857a5340
  1. 2
      src/blockstore_impl.h
  2. 8
      src/ringloop.cpp
  3. 1
      src/ringloop.h

2
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;\

8
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);
}

1
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;

Loading…
Cancel
Save