On 5/6/22 11:03 PM, Christoph Hellwig wrote: > Getting back to this after a good night's worth of sleep: > > On Fri, May 06, 2022 at 08:57:53AM -0600, Jens Axboe wrote: >>> Just add this: >>> >>> "Add a small helper to act as the counterpart to nvme_add_user_metadata." >>> >>> with my signoff: >>> >>> Signed-off-by: Christoph Hellwig <hch@xxxxxx> >> >> Both done, thanks. > > I think we're much better of folding "nvme: add nvme_finish_user_metadata > helper" into "nvme: refactor nvme_submit_user_cmd()" as the first basically > just redos the split done in the first patch in a more fine grained way > to allow sharing some of the metadata end I/O code with the uring path, > and basically only touches code changes in the first patch again. Yes good point, I've folded the two. >>>> I did not do your async_size changes, I think you're jetlagged eyes >>>> missed that this isn't a sizeof thing on a flexible array, it's just the >>>> offset of it. Hence for non-sqe128, the the async size is io_uring_sqe - >>>> offsetof where pdu starts, and so forth. >>> >>> Hmm, this still seems a bit odd to me. So without sqe128 you don't even >>> get the cmd data that would fit into the 64-bit SQE? >> >> You do. Without sqe128, you get sizeof(sqe) - offsetof(cmd) == 16 bytes. >> With, you get 16 + 64, 80. > > Can we please get a little documented helper that does this instead of > the two open coded places? How about we just add a comment? We use it in two spots, but one has knowledge of the sqe64 vs sqe128 state, the other one does not. Hence not sure how best to add a helper for this. One also must be a compile time constant. Best I can think of is the below. Not the prettiest, but it does keep it in one spot and with a single comment rather than in two spots. diff --git a/fs/io_uring.c b/fs/io_uring.c index 1860c50f7f8e..0a9b0fde55af 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -1044,6 +1044,14 @@ struct io_cancel_data { int seq; }; +/* + * The URING_CMD payload starts at 'cmd' in the first sqe, and continues into + * the following sqe if SQE128 is used. + */ +#define uring_cmd_pdu_size(is_sqe128) \ + ((1 + !!(is_sqe128)) * sizeof(struct io_uring_sqe) - \ + offsetof(struct io_uring_sqe, cmd)) + struct io_op_def { /* needs req->file assigned */ unsigned needs_file : 1; @@ -1286,8 +1294,7 @@ static const struct io_op_def io_op_defs[] = { [IORING_OP_URING_CMD] = { .needs_file = 1, .plug = 1, - .async_size = 2 * sizeof(struct io_uring_sqe) - - offsetof(struct io_uring_sqe, cmd), + .async_size = uring_cmd_pdu_size(1), }, }; @@ -4947,11 +4954,9 @@ EXPORT_SYMBOL_GPL(io_uring_cmd_done); static int io_uring_cmd_prep_async(struct io_kiocb *req) { - size_t cmd_size = sizeof(struct io_uring_sqe) - - offsetof(struct io_uring_sqe, cmd); + size_t cmd_size; - if (req->ctx->flags & IORING_SETUP_SQE128) - cmd_size += sizeof(struct io_uring_sqe); + cmd_size = uring_cmd_pdu_size(req->ctx->flags & IORING_SETUP_SQE128); memcpy(req->async_data, req->uring_cmd.cmd, cmd_size); return 0; -- Jens Axboe