From e3d9206dc90ebe0a03f9c866ba2450f6144b0b55 Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Fri, 3 Jun 2022 14:15:45 -0700 Subject: [PATCH] io_uring: expand poll_events to 32 bits The original poll_events field in io_uring_sqe was 16 bits wide, but it was later extended to 32 bits to allow the use of all epoll flags. Technically, we should check for the IORING_FEAT_POLL_32BITS feature, but the new poll32_events union member was added in Linux commit 5769a351b89c ("io_uring: change the poll type to be 32-bits"), which was included in Linux 5.9, so we can assume this is available for all io_uring-enabled kernels due to our baseline version of 5.10. BUG=None TEST=cargo test -p io_uring Change-Id: I5a6266f24ba53a1826b40c91c281527481e99c8a Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/3687056 Commit-Queue: Daniel Verkamp Reviewed-by: Anton Romanov Tested-by: kokoro --- io_uring/src/uring.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/io_uring/src/uring.rs b/io_uring/src/uring.rs index e34dd73ca6..9932f705bb 100644 --- a/io_uring/src/uring.rs +++ b/io_uring/src/uring.rs @@ -101,8 +101,15 @@ impl io_uring_sqe { self.__bindgen_anon_3.rw_flags = val; } - pub fn set_poll_events(&mut self, val: u16) { - self.__bindgen_anon_3.poll_events = val; + pub fn set_poll_events(&mut self, val: u32) { + let val = if cfg!(target_endian = "big") { + // Swap words on big-endian platforms to match the original ABI where poll_events was 16 + // bits wide. + val.rotate_left(16) + } else { + val + }; + self.__bindgen_anon_3.poll32_events = val; } } @@ -539,7 +546,7 @@ impl URingContext { sqe.opcode = IORING_OP_POLL_ADD as u8; sqe.fd = fd; sqe.user_data = user_data; - sqe.set_poll_events(events.get_raw() as u16); + sqe.set_poll_events(events.get_raw()); sqe.set_addr(0); sqe.len = 0; @@ -561,7 +568,7 @@ impl URingContext { sqe.opcode = IORING_OP_POLL_REMOVE as u8; sqe.fd = fd; sqe.user_data = user_data; - sqe.set_poll_events(events.get_raw() as u16); + sqe.set_poll_events(events.get_raw()); sqe.set_addr(0); sqe.len = 0;