mirror of
https://github.com/uroni/fuseuring.git
synced 2025-10-26 11:19:19 +00:00
Make sure there are enough sqes available before preparing them
This commit is contained in:
parent
f0402d5d4d
commit
488e00d691
2
bench.sh
2
bench.sh
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
};
|
||||
};
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user