On 5/31/24 11:36 AM, Bernd Schubert wrote: > On 5/31/24 18:24, Jens Axboe wrote: >> On 5/29/24 12:00 PM, Bernd Schubert wrote: >>> This is to avoid using async completion tasks >>> (i.e. context switches) when not needed. >>> >>> Cc: io-uring@xxxxxxxxxxxxxxx >>> Signed-off-by: Bernd Schubert <bschubert@xxxxxxx> >> >> This patch is very confusing, even after having pulled the other >> changes. In general, would be great if the io_uring list was CC'ed on > > Hmm, let me try to explain. And yes, I definitely need to add these details > to the commit message > > Without the patch: > > <sending a struct fuse_req> > > fuse_uring_queue_fuse_req > fuse_uring_send_to_ring > io_uring_cmd_complete_in_task > > <async task runs> > io_uring_cmd_done() And this is a worthwhile optimization, you always want to complete it line if at all possible. But none of this logic or code belongs in fuse, it really should be provided by io_uring helpers. I would just drop this patch for now and focus on the core functionality. Send out a version with that, and then we'll be happy to help this as performant as it can be. This is where the ask on "how to reproduce your numbers" comes from - with that, it's usually trivial to spot areas where things could be improved. And I strongly suspect that will involve providing you with the right API to use here, and perhaps refactoring a bit on the fuse side. Making up issue_flags is _really_ not something a user should do. > 1) (current == queue->server_task) > fuse_uring_cmd (IORING_OP_URING_CMD) received a completion for a > previous fuse_req, after completion it fetched the next fuse_req and > wants to send it - for 'current == queue->server_task' issue flags > got stored in struct fuse_ring_queue::uring_cmd_issue_flags And queue->server_task is the owner of the ring? Then yes that is safe > > 2) 'else if (current->io_uring)' > > (actually documented in the code) > > 2.1 This might be through IORING_OP_URING_CMD as well, but then server > side uses multiple threads to access the same ring - not nice. We only > store issue_flags into the queue for 'current == queue->server_task', so > we do not know issue_flags - sending through task is needed. What's the path leading to you not having the issue_flags? > 2.2 This might be an application request through the mount point, through > the io-uring interface. We do know issue flags either. > (That one was actually a surprise for me, when xfstests caught it. > Initially I had a condition to send without the extra task then lockdep > caught that. In general, if you don't know the context (eg you don't have issue_flags passed in), you should probably assume the only way is to sanely proceed is to have it processed by the task itself. > > In both cases it has to use a tasks. > > > My question here is if 'current->io_uring' is reliable. Yes that will be reliable in the sense that it tells you that the current task has (at least) one io_uring context setup. But it doesn't tell you anything beyond that, like if it's the owner of this request. > 3) everything else > > 3.1) For async requests, interesting are cached reads and writes here. At a minimum > writes a holding a spin lock and that lock conflicts with the mutex io-uring is taking - > we need a task as well > > 3.2) sync - no lock being hold, it can send without the extra task. As mentioned, let's drop this patch 19 for now. Send out what you have with instructions on how to test it, and I'll give it a spin and see what we can do about this. >> Outside of that, would be super useful to include a blurb on how you set >> things up for testing, and how you run the testing. That would really >> help in terms of being able to run and test it, and also to propose >> changes that might make a big difference. >> > > Will do in the next version. > You basically need my libfuse uring branch > (right now commit history is not cleaned up) and follow > instructions in <libfuse>/xfstests/README.md how to run xfstests. > Missing is a slight patch for that dir to set extra daemon parameters, > like direct-io (fuse' FOPEN_DIRECT_IO) and io-uring. Will add that libfuse > during the next days. I'll leave the xfstests to you for now, but running some perf testing just to verify how it's being used would be useful and help improve it for sure. -- Jens Axboe