On 12/11/2020 23:00, Bijan Mottahedeh wrote: > This patchset is the follow-on to my previous RFC which implements a > set of enhancements to buffer registration consistent with existing file > registration functionality: I like the idea of generic resource handling > > - buffer registration updates IORING_REGISTER_BUFFERS_UPDATE > IORING_OP_BUFFERS_UPDATE Do you need it for something specific? > > - readv/writev with fixed buffers IOSQE_FIXED_BUFFER Why do we need it? > > - buffer registration sharing IORING_SETUP_SHARE_BUF > IORING_SETUP_ATTACH_BUF I haven't looked it up. What's the overhead on that? And again, do you really need it? The set is +600 lines, so just want to know that there is a real benefit from having it. > > Patches 1,2 modularize existing buffer registration code. > > Patch 3 generalizes fixed_file functionality to fixed_rsrc. > > Patch 4 applies fixed_rsrc functionality for fixed buffers support. > > Patch 5 generalizes files_update functionality to rsrc_update. > > Patch 6 implements buffer registration update, and introduces > IORING_REGISTER_BUFFERS_UPDATE and IORING_OP_BUFFERS_UPDATE, consistent > with file registration update. > > Patch 7 implements readv/writev support with fixed buffers, and introduces > IOSQE_FIXED_BUFFER, consistent with fixed files. > > Patch 8 implements buffer sharing among multiple rings; it works as follows: > > - A new ring, A, is setup. Since no buffers have been registered, the > registered buffer state is an empty set, Z. That's different from the > NULL state in current implementation. > > - Ring B is setup, attaching to Ring A. It's also attaching to it's > buffer registrations, now we have two references to the same empty > set, Z. > > - Ring A registers buffers into set Z, which is no longer empty. > > - Ring B sees this immediately, since it's already sharing that set. > > TBD > > - I think I have to add IORING_UNREGISTER_BUFFERS to > io_register_op_must_quiesce() but wanted to confirm. ->fixed_file_refs trades off fast unsynchronised access (by adding percpu_ref_get/put) to not do full quiesce. So, yes, after it's hooked up right. > > I have used liburing file-{register,update} tests as models for > buffer-{register,update,share}, tests and they run ok. > > The liburing test suite fails for "self" with/without this patchset. > > Bijan Mottahedeh (8): > io_uring: modularize io_sqe_buffer_register > io_uring: modularize io_sqe_buffers_register > io_uring: generalize fixed file functionality > io_uring: implement fixed buffers registration similar to fixed files > io_uring: generalize files_update functionlity to rsrc_update > io_uring: support buffer registration updates > io_uring: support readv/writev with fixed buffers > io_uring: support buffer registration sharing > > fs/io_uring.c | 1021 ++++++++++++++++++++++++++++++++--------- > include/uapi/linux/io_uring.h | 15 +- > 2 files changed, 807 insertions(+), 229 deletions(-) > -- Pavel Begunkov