Make sure there are enough sqes available before preparing them

This commit is contained in:
Martin Raiber 2020-11-09 22:23:08 +01:00
parent f0402d5d4d
commit 488e00d691
4 changed files with 62 additions and 18 deletions

View File

@ -14,7 +14,7 @@ mount $LODEV "$BMNT"
losetup -d $LODEV
cp /usr/share/doc/fio/examples/ssd-test.fio ./
sed -i 's/iodepth=4/iodepth=1024/g' ssd-test.fio
sed -i 's/iodepth=4/iodepth=2048/g' ssd-test.fio
sed -i 's/size=10g/size=400m/g' ssd-test.fio
sed -i "s@directory=/mount-point-of-ssd@directory=$BMNT@g" ssd-test.fio
fio ssd-test.fio

View File

@ -36,16 +36,29 @@ int fuse_io_context::fuseuring_submit(bool block)
{
if(fuse_ring.ring_submit)
{
int rc;
if(block)
rc = io_uring_submit_and_wait(fuse_ring.ring, 1);
else
rc = io_uring_submit(fuse_ring.ring);
if(rc<0)
while(true)
{
perror("Error submitting to fuse io_uring.");
return 18;
int rc;
if(block)
rc = io_uring_submit_and_wait(fuse_ring.ring, 1);
else
rc = io_uring_submit(fuse_ring.ring);
if(rc<0 && errno!=EBUSY)
{
perror("Error submitting to fuse io_uring.");
return 18;
}
else if(rc<0)
{
std::cout << "io_uring_submit(2): EBUSY" << std::endl;
}
else
{
break;
}
sleep(0);
}
fuse_ring.ring_submit=false;
}

View File

@ -37,8 +37,8 @@ struct fuse_io_context
{
struct IoUringAwaiterGlobalRes
{
size_t tocomplete;
std::coroutine_handle<> awaiter;
uint8_t tocomplete;
};
struct IoUringAwaiterRes
@ -120,8 +120,39 @@ struct fuse_io_context
return IoUringAwaiter<std::pair<io_uring_sqe*, io_uring_sqe*> >({sqes.first, sqes.second});
}
io_uring_sqe* get_sqe() noexcept
io_uring_sqe* get_sqe(unsigned int peek=1) noexcept
{
if(peek>1)
{
while(true)
{
struct io_uring_sq *sq = &fuse_ring.ring->sq;
unsigned int head = io_uring_smp_load_acquire(sq->khead);
unsigned int tail = sq->sqe_tail;
struct io_uring_sqe *__sqe = NULL;
if (tail - head < *sq->kring_entries &&
*sq->kring_entries - (tail - head) >= peek)
{
io_uring_sqe* sqe = &sq->sqes[sq->sqe_tail & *sq->kring_mask];
sq->sqe_tail = tail + 1;
return sqe;
}
int rc = io_uring_submit(fuse_ring.ring);
if(rc<0 && errno!=EBUSY)
{
perror("io_uring_submit failed in get_sqe");
return nullptr;
}
else if(rc<0)
{
std::cout << "io_uring_submit: EBUSY" << std::endl;
sleep(0);
}
}
}
fuse_ring.ring_submit=true;
auto ret = io_uring_get_sqe(fuse_ring.ring);
if(ret==nullptr)
@ -469,4 +500,4 @@ private:
int fuseuring_submit(bool block);
int last_rc;
};
};

View File

@ -86,7 +86,7 @@ namespace
[[nodiscard]] fuse_io_context::io_uring_task<int> send_reply(fuse_io_context& io, fuse_io_context::FuseIoVal& fuse_io)
{
struct io_uring_sqe *sqe;
sqe = io.get_sqe();
sqe = io.get_sqe(2);
if(sqe==nullptr)
co_return -1;
@ -121,7 +121,7 @@ namespace
const std::vector<char>& buf)
{
struct io_uring_sqe *sqe;
sqe = io.get_sqe();
sqe = io.get_sqe(2);
if(sqe==nullptr)
co_return -1;
@ -358,7 +358,7 @@ namespace
out_header->len = sizeof(fuse_out_header) + read_size;
out_header->unique = fheader->unique;
io_uring_sqe* sqe1 = io.get_sqe();
io_uring_sqe* sqe1 = io.get_sqe(3);
if(sqe1==nullptr)
co_return -1;
@ -507,7 +507,7 @@ namespace
write_out->size = write_size;
write_out->padding = 0;
io_uring_sqe* sqe1 = io.get_sqe();
io_uring_sqe* sqe1 = io.get_sqe(3);
if(sqe1==nullptr)
co_return -1;
@ -650,7 +650,7 @@ fuse_io_context::io_uring_task<int> queue_fuse_read(fuse_io_context& io)
fuse_io_context::FuseIoVal fuse_io = io.get_fuse_io();
DBG_PRINT(std::cout << "queue_fuse_read" << std::endl);
struct io_uring_sqe *sqe1 = io.get_sqe();
struct io_uring_sqe *sqe1 = io.get_sqe(2);
struct io_uring_sqe *sqe2 = io.get_sqe();
if(sqe1==nullptr || sqe2==nullptr)
co_return -1;