[PATCH 0/4] io_uring: avoid uring_lock for IORING_SETUP_SINGLE_ISSUER

Caleb Sander Mateos posted 4 patches 1 month ago
There is a newer version of this series
io_uring/cancel.c    |  1 +
io_uring/fdinfo.c    |  2 +-
io_uring/filetable.c |  3 ++-
io_uring/io_uring.c  | 58 +++++++++++++++++++++++++++-----------------
io_uring/io_uring.h  | 43 ++++++++++++++++++++++++++------
io_uring/kbuf.c      |  6 ++---
io_uring/net.c       |  1 +
io_uring/notif.c     |  5 ++--
io_uring/notif.h     |  3 ++-
io_uring/openclose.c |  1 +
io_uring/poll.c      |  2 +-
io_uring/register.c  |  1 +
io_uring/rsrc.c      | 10 +++++++-
io_uring/rsrc.h      |  3 ++-
io_uring/rw.c        |  3 ++-
io_uring/splice.c    |  1 +
io_uring/waitid.c    |  2 +-
17 files changed, 102 insertions(+), 43 deletions(-)
[PATCH 0/4] io_uring: avoid uring_lock for IORING_SETUP_SINGLE_ISSUER
Posted by Caleb Sander Mateos 1 month ago
As far as I can tell, setting IORING_SETUP_SINGLE_ISSUER when creating
an io_uring doesn't actually enable any additional optimizations (aside
from being a requirement for IORING_SETUP_DEFER_TASKRUN). This series
leverages IORING_SETUP_SINGLE_ISSUER's guarantee that only one task
submits SQEs to skip taking the uring_lock mutex in the submission and
task work paths.

First, we need to close a hole in the IORING_SETUP_SINGLE_ISSUER checks
where IORING_REGISTER_CLONE_BUFFERS only checks whether the thread is
allowed to access one of the two io_urings. It assumes the uring_lock
will prevent concurrent access to the other io_uring, but this will no
longer be the case after the optimization to skip taking uring_lock.

We also need to remove the unused filetable.h #include from io_uring.h
to avoid an #include cycle.

Caleb Sander Mateos (4):
  io_uring: don't include filetable.h in io_uring.h
  io_uring/rsrc: respect submitter_task in io_register_clone_buffers()
  io_uring: factor out uring_lock helpers
  io_uring: avoid uring_lock for IORING_SETUP_SINGLE_ISSUER

 io_uring/cancel.c    |  1 +
 io_uring/fdinfo.c    |  2 +-
 io_uring/filetable.c |  3 ++-
 io_uring/io_uring.c  | 58 +++++++++++++++++++++++++++-----------------
 io_uring/io_uring.h  | 43 ++++++++++++++++++++++++++------
 io_uring/kbuf.c      |  6 ++---
 io_uring/net.c       |  1 +
 io_uring/notif.c     |  5 ++--
 io_uring/notif.h     |  3 ++-
 io_uring/openclose.c |  1 +
 io_uring/poll.c      |  2 +-
 io_uring/register.c  |  1 +
 io_uring/rsrc.c      | 10 +++++++-
 io_uring/rsrc.h      |  3 ++-
 io_uring/rw.c        |  3 ++-
 io_uring/splice.c    |  1 +
 io_uring/waitid.c    |  2 +-
 17 files changed, 102 insertions(+), 43 deletions(-)

-- 
2.45.2
Re: [PATCH 0/4] io_uring: avoid uring_lock for IORING_SETUP_SINGLE_ISSUER
Posted by Jens Axboe 1 month ago
On 9/2/25 4:07 PM, Caleb Sander Mateos wrote:
> As far as I can tell, setting IORING_SETUP_SINGLE_ISSUER when creating
> an io_uring doesn't actually enable any additional optimizations (aside
> from being a requirement for IORING_SETUP_DEFER_TASKRUN).

Indeed. It was supposed to enable future optimizations, but they
didn't quite materialize.

> This series leverages IORING_SETUP_SINGLE_ISSUER's guarantee that only
> one task submits SQEs to skip taking the uring_lock mutex in the
> submission and task work paths.

Interesting, would indeed be great to kill the lock/unlock for each
submit and local work run. I'll take a closer look at this tomorrow.

-- 
Jens Axboe
Re: [PATCH 0/4] io_uring: avoid uring_lock for IORING_SETUP_SINGLE_ISSUER
Posted by Jens Axboe 1 month ago
On 9/2/25 7:28 PM, Jens Axboe wrote:
> On 9/2/25 4:07 PM, Caleb Sander Mateos wrote:
>> As far as I can tell, setting IORING_SETUP_SINGLE_ISSUER when creating
>> an io_uring doesn't actually enable any additional optimizations (aside
>> from being a requirement for IORING_SETUP_DEFER_TASKRUN).
> 
> Indeed. It was supposed to enable future optimizations, but they
> didn't quite materialize.
> 
>> This series leverages IORING_SETUP_SINGLE_ISSUER's guarantee that only
>> one task submits SQEs to skip taking the uring_lock mutex in the
>> submission and task work paths.
> 
> Interesting, would indeed be great to kill the lock/unlock for each
> submit and local work run. I'll take a closer look at this tomorrow.

I just noticed that you forgot to CC io-uring@vger.kernel.org on
this posting. Would you mind re-sending and doing that? LKML isn't
really useful, for anything really, the key list to CC is the
io_uring one.

-- 
Jens Axboe
Re: [PATCH 0/4] io_uring: avoid uring_lock for IORING_SETUP_SINGLE_ISSUER
Posted by Caleb Sander Mateos 1 month ago
On Tue, Sep 2, 2025 at 6:29 PM Jens Axboe <axboe@kernel.dk> wrote:
>
> On 9/2/25 7:28 PM, Jens Axboe wrote:
> > On 9/2/25 4:07 PM, Caleb Sander Mateos wrote:
> >> As far as I can tell, setting IORING_SETUP_SINGLE_ISSUER when creating
> >> an io_uring doesn't actually enable any additional optimizations (aside
> >> from being a requirement for IORING_SETUP_DEFER_TASKRUN).
> >
> > Indeed. It was supposed to enable future optimizations, but they
> > didn't quite materialize.
> >
> >> This series leverages IORING_SETUP_SINGLE_ISSUER's guarantee that only
> >> one task submits SQEs to skip taking the uring_lock mutex in the
> >> submission and task work paths.
> >
> > Interesting, would indeed be great to kill the lock/unlock for each
> > submit and local work run. I'll take a closer look at this tomorrow.
>
> I just noticed that you forgot to CC io-uring@vger.kernel.org on
> this posting. Would you mind re-sending and doing that? LKML isn't
> really useful, for anything really, the key list to CC is the
> io_uring one.

Oops, I accidentally copied the wrong list address. Thanks for catching that.

Best,
Caleb