On Wed, Oct 30, 2024 at 11:31:08PM +0530, Kanchan Joshi wrote: > diff --git a/include/uapi/linux/io_uring.h b/include/uapi/linux/io_uring.h > index 024745283783..48dcca125db3 100644 > --- a/include/uapi/linux/io_uring.h > +++ b/include/uapi/linux/io_uring.h > @@ -105,6 +105,22 @@ struct io_uring_sqe { > */ > __u8 cmd[0]; > }; > + /* > + * If the ring is initialized with IORING_SETUP_SQE128, then > + * this field is starting offset for 64 bytes of data. For meta io > + * this contains 'struct io_uring_meta_pi' > + */ > + __u8 big_sqe[0]; > +}; > + > +/* this is placed in SQE128 */ > +struct io_uring_meta_pi { > + __u16 pi_flags; > + __u16 app_tag; > + __u32 len; > + __u64 addr; > + __u64 seed; > + __u64 rsvd[2]; > }; On the previous version, I was more questioning if it aligns with what Pavel was trying to do here. I didn't quite get it, so I was more confused than saying it should be this way now. But I personally think this path makes sense. I would set it up just a little differently for extended sqe's so that the PI overlays a more generic struct that other opcodes might find a way to use later. Something like: struct io_uring_sqe_ext { union { __u32 rsvd0[8]; struct { __u16 pi_flags; __u16 app_tag; __u32 len; __u64 addr; __u64 seed; } rw_pi; }; __u32 rsvd1[8]; }; > @@ -3902,6 +3903,9 @@ static int __init io_uring_init(void) > /* top 8bits are for internal use */ > BUILD_BUG_ON((IORING_URING_CMD_MASK & 0xff000000) != 0); > > + BUILD_BUG_ON(sizeof(struct io_uring_meta_pi) > > + sizeof(struct io_uring_sqe)); Then this check would become: BUILD_BUG_ON(sizeof(struct io_uring_sqe_ext) != sizeof(struct io_uring_sqe));