On 12-04-2023 14:37, Kevin Brodsky wrote:
On 04/04/2023 17:14, Tudor Cretu wrote:
This series makes it possible for purecap apps to use the io_uring system.
With these patches, all io_uring LTP tests pass in both Purecap and plain AArch64 modes. Note that the LTP tests only address the basic functionality of the io_uring system and a significant portion of the multiplexed functionality is untested in LTP.
I have finished investigating Purecap and plain AArch64 liburing tests and examples and the series is updated accordingly.
v6:
- Only Patches 8 and 10 are slighlty modified
- Fix format issues
- Add license header to io_uring_compat.h
- Move __io_get_ith_cqe after __io_get_cqe
- Remove the const from io_user_data_is_same parameters
v5:
- Revert changes in trace/events/io_uring.h
- Add new header trace/events/io_uring.h for compat structs
- Change cqe_cached/ccqe_sentinel to indices
- Move print_sqe and print_cqe macros outside of the function
- Rename is_compat64_io_ring_ctx to io_in_compat64
- Add helper for user_data values comparison
- Add condition to not change addr fielt to a compat_ptr for opcodes where it's a user_data value stored
- Other small fixes suggested by Kevin
v4:
- Rebase on top of morello/next
- Remove the union for flags in struct compat_io_uring_sqe and only kept a single member
- Improve format and move functions as per feedback on v3
- Add a new helper for checking if context is compat
- Remove struct conversion in fdinfo and just use macros
- Remove the union from struct io_overflow_cqe and just leave the native struct
- Fix the cqe_cached/cqe_sentinel mechanism
- Separate the fix for the shared ring size's off-by-one error into a new PATCH 6
- Remove the compat_ptr for addr fields that represent user_data values
- Extend the trace events accordingly to propagate capabilities
- Use copy*_with_ptr routine for copy_msghdr_from_user in a new PATCH 1
- Fix the misuse of addr2 and off in IORING_OP_CONNECT and IORING_OP_POLL_REMOVE
v3:
- Introduce Patch 5 which exposes the compat handling logic for epoll_event. This is used then in io_uring/epoll.c.
- Introduce Patch 6 which makes sure that when struct iovec is copied from userspace, the capability tags are preserved.
- Fix a few sizeof(var) to sizeof(*var).
- Use iovec_from_user so that compat handling logic is applied instead of copying directly from user
- Add a few missing copy_from_user_with_ptr where suitable.
v2:
- Rebase on top of release 6.1
- Remove VM_READ_CAPS/VM_LOAD_CAPS patches as they are already merged
- Update commit message in PATCH 1
- Add the generic changes PATCH 2 and PATCH 3 to avoid copying user pointers from/to userspace unnecesarily. These could be upstreamable.
- Split "pulling the cqes memeber out" change into PATCH 4
- The changes for PATCH 5 and 6 are now split into their respective files after the rebase.
- Format and change organization based on the feedback on the previous version, including creating helpers copy_*_from_* for various uAPI structs
- Add comments related to handling of setup flags IORING_SETUP_SQE128 and IORING_SETUP_CQE32
- Add handling for new uAPI structs: io_uring_buf, io_uring_buf_ring, io_uring_buf_reg, io_uring_sync_cancel_reg.
Gitlab issue: https://git.morello-project.org/morello/kernel/linux/-/issues/2
Review branch: https://git.morello-project.org/tudcre01/linux/-/commits/morello/io_uring_v6
Tudor Cretu (10): net: socket: use copy_from_user_with_ptr for struct user_msghdr io_uring/rw: Restrict copy to only uiov->len from userspace io_uring/tctx: Copy only the offset field back to user io_uring: Pull cqes member out from rings struct epoll: Expose compat handling logic of epoll_event io_uring/kbuf: Fix size for shared buffer ring io_uring: Make cqe_cached and cqe_sentinel indices instead of pointers io_uring: Implement compat versions of uAPI structs and handle them io_uring: Allow capability tag access on the shared memory io_uring: Use user pointer type in the uAPI structs
Now applied on next. Thanks and well done for a really good series!
Great! Thanks for all the patience and detailed reviews!
Tudor
Kevin
fs/eventpoll.c | 38 ++-- include/linux/eventpoll.h | 4 + include/linux/io_uring_compat.h | 130 +++++++++++++ include/linux/io_uring_types.h | 35 ++-- include/uapi/linux/io_uring.h | 76 ++++---- io_uring/advise.c | 7 +- io_uring/cancel.c | 32 +++- io_uring/cancel.h | 2 +- io_uring/epoll.c | 4 +- io_uring/fdinfo.c | 79 +++++--- io_uring/fs.c | 16 +- io_uring/io_uring.c | 323 ++++++++++++++++++++++++-------- io_uring/io_uring.h | 147 +++++++++++++-- io_uring/kbuf.c | 111 +++++++++-- io_uring/kbuf.h | 8 +- io_uring/msg_ring.c | 4 +- io_uring/net.c | 25 +-- io_uring/openclose.c | 4 +- io_uring/poll.c | 8 +- io_uring/rsrc.c | 138 +++++++++++--- io_uring/rw.c | 22 +-- io_uring/statx.c | 4 +- io_uring/tctx.c | 56 +++++- io_uring/timeout.c | 14 +- io_uring/uring_cmd.c | 5 + io_uring/uring_cmd.h | 4 + io_uring/xattr.c | 12 +- net/socket.c | 2 +- 28 files changed, 1000 insertions(+), 310 deletions(-) create mode 100644 include/linux/io_uring_compat.h