* [PATCH v2 0/4] io_uring: text representation of opcode in trace @ 2022-04-25 15:07 Dylan Yudaken 2022-04-25 15:07 ` [PATCH v2 1/4] io_uring: add type to op enum Dylan Yudaken ` (4 more replies) 0 siblings, 5 replies; 7+ messages in thread From: Dylan Yudaken @ 2022-04-25 15:07 UTC (permalink / raw) To: io-uring; +Cc: axboe, asml.silence, Kernel-team, Dylan Yudaken This series adds the text representation of opcodes into the trace. This makes it much quicker to understand traces without having to translate opcodes in your head. Patch 1 adds a type to io_uring opcodes Patch 2 is the translation function. Patch 3 is a small cleanup Patch 4 uses the translator in the trace logic v2: - return "INVALID" rather than UNKNOWN/LAST - add a type to io_uring opcdodes to get the compiler to complain if any are missing Dylan Yudaken (4): io_uring: add type to op enum io_uring: add io_uring_get_opcode io_uring: rename op -> opcode io_uring: use the text representation of ops in trace fs/io_uring.c | 91 +++++++++++++++++++++++++++++++++ include/linux/io_uring.h | 5 ++ include/trace/events/io_uring.h | 42 +++++++++------ include/uapi/linux/io_uring.h | 2 +- 4 files changed, 122 insertions(+), 18 deletions(-) base-commit: 155bc9505dbd6613585abbf0be6466f1c21536c4 -- 2.30.2 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 1/4] io_uring: add type to op enum 2022-04-25 15:07 [PATCH v2 0/4] io_uring: text representation of opcode in trace Dylan Yudaken @ 2022-04-25 15:07 ` Dylan Yudaken 2022-04-25 15:07 ` [PATCH v2 2/4] io_uring: add io_uring_get_opcode Dylan Yudaken ` (3 subsequent siblings) 4 siblings, 0 replies; 7+ messages in thread From: Dylan Yudaken @ 2022-04-25 15:07 UTC (permalink / raw) To: io-uring; +Cc: axboe, asml.silence, Kernel-team, Dylan Yudaken It is useful to have a type enum for opcodes, to allow the compiler to assert that every value is used in a switch statement. Signed-off-by: Dylan Yudaken <[email protected]> --- include/uapi/linux/io_uring.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/uapi/linux/io_uring.h b/include/uapi/linux/io_uring.h index 980d82eb196e..a10b216ede3e 100644 --- a/include/uapi/linux/io_uring.h +++ b/include/uapi/linux/io_uring.h @@ -103,7 +103,7 @@ enum { #define IORING_SETUP_R_DISABLED (1U << 6) /* start with ring disabled */ #define IORING_SETUP_SUBMIT_ALL (1U << 7) /* continue submit on error */ -enum { +enum io_uring_op { IORING_OP_NOP, IORING_OP_READV, IORING_OP_WRITEV, -- 2.30.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 2/4] io_uring: add io_uring_get_opcode 2022-04-25 15:07 [PATCH v2 0/4] io_uring: text representation of opcode in trace Dylan Yudaken 2022-04-25 15:07 ` [PATCH v2 1/4] io_uring: add type to op enum Dylan Yudaken @ 2022-04-25 15:07 ` Dylan Yudaken 2022-04-25 15:07 ` [PATCH v2 3/4] io_uring: rename op -> opcode Dylan Yudaken ` (2 subsequent siblings) 4 siblings, 0 replies; 7+ messages in thread From: Dylan Yudaken @ 2022-04-25 15:07 UTC (permalink / raw) To: io-uring; +Cc: axboe, asml.silence, Kernel-team, Dylan Yudaken In some debug scenarios it is useful to have the text representation of the opcode. Add this function in preparation. Signed-off-by: Dylan Yudaken <[email protected]> --- fs/io_uring.c | 91 ++++++++++++++++++++++++++++++++++++++++ include/linux/io_uring.h | 5 +++ 2 files changed, 96 insertions(+) diff --git a/fs/io_uring.c b/fs/io_uring.c index e57d47a23682..90ecd656cc13 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -1255,6 +1255,97 @@ static struct kmem_cache *req_cachep; static const struct file_operations io_uring_fops; +const char *io_uring_get_opcode(u8 opcode) +{ + switch ((enum io_uring_op)opcode) { + case IORING_OP_NOP: + return "NOP"; + case IORING_OP_READV: + return "READV"; + case IORING_OP_WRITEV: + return "WRITEV"; + case IORING_OP_FSYNC: + return "FSYNC"; + case IORING_OP_READ_FIXED: + return "READ_FIXED"; + case IORING_OP_WRITE_FIXED: + return "WRITE_FIXED"; + case IORING_OP_POLL_ADD: + return "POLL_ADD"; + case IORING_OP_POLL_REMOVE: + return "POLL_REMOVE"; + case IORING_OP_SYNC_FILE_RANGE: + return "SYNC_FILE_RANGE"; + case IORING_OP_SENDMSG: + return "SENDMSG"; + case IORING_OP_RECVMSG: + return "RECVMSG"; + case IORING_OP_TIMEOUT: + return "TIMEOUT"; + case IORING_OP_TIMEOUT_REMOVE: + return "TIMEOUT_REMOVE"; + case IORING_OP_ACCEPT: + return "ACCEPT"; + case IORING_OP_ASYNC_CANCEL: + return "ASYNC_CANCEL"; + case IORING_OP_LINK_TIMEOUT: + return "LINK_TIMEOUT"; + case IORING_OP_CONNECT: + return "CONNECT"; + case IORING_OP_FALLOCATE: + return "FALLOCATE"; + case IORING_OP_OPENAT: + return "OPENAT"; + case IORING_OP_CLOSE: + return "CLOSE"; + case IORING_OP_FILES_UPDATE: + return "FILES_UPDATE"; + case IORING_OP_STATX: + return "STATX"; + case IORING_OP_READ: + return "READ"; + case IORING_OP_WRITE: + return "WRITE"; + case IORING_OP_FADVISE: + return "FADVISE"; + case IORING_OP_MADVISE: + return "MADVISE"; + case IORING_OP_SEND: + return "SEND"; + case IORING_OP_RECV: + return "RECV"; + case IORING_OP_OPENAT2: + return "OPENAT2"; + case IORING_OP_EPOLL_CTL: + return "EPOLL_CTL"; + case IORING_OP_SPLICE: + return "SPLICE"; + case IORING_OP_PROVIDE_BUFFERS: + return "PROVIDE_BUFFERS"; + case IORING_OP_REMOVE_BUFFERS: + return "REMOVE_BUFFERS"; + case IORING_OP_TEE: + return "TEE"; + case IORING_OP_SHUTDOWN: + return "SHUTDOWN"; + case IORING_OP_RENAMEAT: + return "RENAMEAT"; + case IORING_OP_UNLINKAT: + return "UNLINKAT"; + case IORING_OP_MKDIRAT: + return "MKDIRAT"; + case IORING_OP_SYMLINKAT: + return "SYMLINKAT"; + case IORING_OP_LINKAT: + return "LINKAT"; + case IORING_OP_MSG_RING: + return "MSG_RING"; + case IORING_OP_LAST: + return "INVALID"; + } + return "INVALID"; +} + struct sock *io_uring_get_socket(struct file *file) { #if defined(CONFIG_UNIX) diff --git a/include/linux/io_uring.h b/include/linux/io_uring.h index 1814e698d861..24651c229ed2 100644 --- a/include/linux/io_uring.h +++ b/include/linux/io_uring.h @@ -10,6 +10,7 @@ struct sock *io_uring_get_socket(struct file *file); void __io_uring_cancel(bool cancel_all); void __io_uring_free(struct task_struct *tsk); void io_uring_unreg_ringfd(void); +const char *io_uring_get_opcode(u8 opcode); static inline void io_uring_files_cancel(void) { @@ -42,6 +43,10 @@ static inline void io_uring_files_cancel(void) static inline void io_uring_free(struct task_struct *tsk) { } +static inline const char *io_uring_get_opcode(u8 opcode) +{ + return ""; +} #endif #endif -- 2.30.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 3/4] io_uring: rename op -> opcode 2022-04-25 15:07 [PATCH v2 0/4] io_uring: text representation of opcode in trace Dylan Yudaken 2022-04-25 15:07 ` [PATCH v2 1/4] io_uring: add type to op enum Dylan Yudaken 2022-04-25 15:07 ` [PATCH v2 2/4] io_uring: add io_uring_get_opcode Dylan Yudaken @ 2022-04-25 15:07 ` Dylan Yudaken 2022-04-25 15:07 ` [PATCH v2 4/4] io_uring: use the text representation of ops in trace Dylan Yudaken 2022-04-25 22:47 ` [PATCH v2 0/4] io_uring: text representation of opcode " Jens Axboe 4 siblings, 0 replies; 7+ messages in thread From: Dylan Yudaken @ 2022-04-25 15:07 UTC (permalink / raw) To: io-uring; +Cc: axboe, asml.silence, Kernel-team, Dylan Yudaken do this for consistency with the other trace messages Signed-off-by: Dylan Yudaken <[email protected]> --- include/trace/events/io_uring.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/trace/events/io_uring.h b/include/trace/events/io_uring.h index 42534ec2ab9d..c122d2167aa4 100644 --- a/include/trace/events/io_uring.h +++ b/include/trace/events/io_uring.h @@ -530,7 +530,7 @@ TRACE_EVENT(io_uring_req_failed, ), TP_printk("ring %p, req %p, user_data 0x%llx, " - "op %d, flags 0x%x, prio=%d, off=%llu, addr=%llu, " + "opcode %d, flags 0x%x, prio=%d, off=%llu, addr=%llu, " "len=%u, rw_flags=0x%x, buf_index=%d, " "personality=%d, file_index=%d, pad=0x%llx/%llx, error=%d", __entry->ctx, __entry->req, __entry->user_data, -- 2.30.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 4/4] io_uring: use the text representation of ops in trace 2022-04-25 15:07 [PATCH v2 0/4] io_uring: text representation of opcode in trace Dylan Yudaken ` (2 preceding siblings ...) 2022-04-25 15:07 ` [PATCH v2 3/4] io_uring: rename op -> opcode Dylan Yudaken @ 2022-04-25 15:07 ` Dylan Yudaken 2022-04-25 22:47 ` [PATCH v2 0/4] io_uring: text representation of opcode " Jens Axboe 4 siblings, 0 replies; 7+ messages in thread From: Dylan Yudaken @ 2022-04-25 15:07 UTC (permalink / raw) To: io-uring; +Cc: axboe, asml.silence, Kernel-team, Dylan Yudaken It is annoying to translate opcodes to textwhen tracing io_uring. Use the io_uring_get_opcode function instead to use the text representation. A downside here might have been that if the opcode is invalid it will not be obvious, however the opcode is already overridden in these cases to 0 (NOP) in io_init_req(). Therefore this is a non issue. Signed-off-by: Dylan Yudaken <[email protected]> --- include/trace/events/io_uring.h | 42 ++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/include/trace/events/io_uring.h b/include/trace/events/io_uring.h index c122d2167aa4..240afbb75302 100644 --- a/include/trace/events/io_uring.h +++ b/include/trace/events/io_uring.h @@ -7,6 +7,7 @@ #include <linux/tracepoint.h> #include <uapi/linux/io_uring.h> +#include <linux/io_uring.h> struct io_wq_work; @@ -87,9 +88,11 @@ TRACE_EVENT(io_uring_register, __entry->ret = ret; ), - TP_printk("ring %p, opcode %d, nr_user_files %d, nr_user_bufs %d, " + TP_printk("ring %p, opcode %s, nr_user_files %d, nr_user_bufs %d, " "ret %ld", - __entry->ctx, __entry->opcode, __entry->nr_files, + __entry->ctx, + io_uring_get_opcode(__entry->opcode), + __entry->nr_files, __entry->nr_bufs, __entry->ret) ); @@ -169,8 +172,9 @@ TRACE_EVENT(io_uring_queue_async_work, __entry->rw = rw; ), - TP_printk("ring %p, request %p, user_data 0x%llx, opcode %d, flags 0x%x, %s queue, work %p", - __entry->ctx, __entry->req, __entry->user_data, __entry->opcode, + TP_printk("ring %p, request %p, user_data 0x%llx, opcode %s, flags 0x%x, %s queue, work %p", + __entry->ctx, __entry->req, __entry->user_data, + io_uring_get_opcode(__entry->opcode), __entry->flags, __entry->rw ? "hashed" : "normal", __entry->work) ); @@ -205,8 +209,9 @@ TRACE_EVENT(io_uring_defer, __entry->opcode = opcode; ), - TP_printk("ring %p, request %p, user_data 0x%llx, opcode %d", - __entry->ctx, __entry->req, __entry->data, __entry->opcode) + TP_printk("ring %p, request %p, user_data 0x%llx, opcode %s", + __entry->ctx, __entry->req, __entry->data, + io_uring_get_opcode(__entry->opcode)) ); /** @@ -305,9 +310,9 @@ TRACE_EVENT(io_uring_fail_link, __entry->link = link; ), - TP_printk("ring %p, request %p, user_data 0x%llx, opcode %d, link %p", - __entry->ctx, __entry->req, __entry->user_data, __entry->opcode, - __entry->link) + TP_printk("ring %p, request %p, user_data 0x%llx, opcode %s, link %p", + __entry->ctx, __entry->req, __entry->user_data, + io_uring_get_opcode(__entry->opcode), __entry->link) ); /** @@ -389,9 +394,9 @@ TRACE_EVENT(io_uring_submit_sqe, __entry->sq_thread = sq_thread; ), - TP_printk("ring %p, req %p, user_data 0x%llx, opcode %d, flags 0x%x, " + TP_printk("ring %p, req %p, user_data 0x%llx, opcode %s, flags 0x%x, " "non block %d, sq_thread %d", __entry->ctx, __entry->req, - __entry->user_data, __entry->opcode, + __entry->user_data, io_uring_get_opcode(__entry->opcode), __entry->flags, __entry->force_nonblock, __entry->sq_thread) ); @@ -433,8 +438,9 @@ TRACE_EVENT(io_uring_poll_arm, __entry->events = events; ), - TP_printk("ring %p, req %p, user_data 0x%llx, opcode %d, mask 0x%x, events 0x%x", - __entry->ctx, __entry->req, __entry->user_data, __entry->opcode, + TP_printk("ring %p, req %p, user_data 0x%llx, opcode %s, mask 0x%x, events 0x%x", + __entry->ctx, __entry->req, __entry->user_data, + io_uring_get_opcode(__entry->opcode), __entry->mask, __entry->events) ); @@ -470,8 +476,9 @@ TRACE_EVENT(io_uring_task_add, __entry->mask = mask; ), - TP_printk("ring %p, req %p, user_data 0x%llx, opcode %d, mask %x", - __entry->ctx, __entry->req, __entry->user_data, __entry->opcode, + TP_printk("ring %p, req %p, user_data 0x%llx, opcode %s, mask %x", + __entry->ctx, __entry->req, __entry->user_data, + io_uring_get_opcode(__entry->opcode), __entry->mask) ); @@ -530,11 +537,12 @@ TRACE_EVENT(io_uring_req_failed, ), TP_printk("ring %p, req %p, user_data 0x%llx, " - "opcode %d, flags 0x%x, prio=%d, off=%llu, addr=%llu, " + "opcode %s, flags 0x%x, prio=%d, off=%llu, addr=%llu, " "len=%u, rw_flags=0x%x, buf_index=%d, " "personality=%d, file_index=%d, pad=0x%llx/%llx, error=%d", __entry->ctx, __entry->req, __entry->user_data, - __entry->opcode, __entry->flags, __entry->ioprio, + io_uring_get_opcode(__entry->opcode), + __entry->flags, __entry->ioprio, (unsigned long long)__entry->off, (unsigned long long) __entry->addr, __entry->len, __entry->op_flags, -- 2.30.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 0/4] io_uring: text representation of opcode in trace 2022-04-25 15:07 [PATCH v2 0/4] io_uring: text representation of opcode in trace Dylan Yudaken ` (3 preceding siblings ...) 2022-04-25 15:07 ` [PATCH v2 4/4] io_uring: use the text representation of ops in trace Dylan Yudaken @ 2022-04-25 22:47 ` Jens Axboe 2022-04-26 8:16 ` Dylan Yudaken 4 siblings, 1 reply; 7+ messages in thread From: Jens Axboe @ 2022-04-25 22:47 UTC (permalink / raw) To: Dylan Yudaken, io-uring; +Cc: asml.silence, Kernel-team On 4/25/22 9:07 AM, Dylan Yudaken wrote: > > This series adds the text representation of opcodes into the trace. This > makes it much quicker to understand traces without having to translate > opcodes in your head. > > Patch 1 adds a type to io_uring opcodes > Patch 2 is the translation function. > Patch 3 is a small cleanup > Patch 4 uses the translator in the trace logic Sorry forgot, one last request - can you make this against the for-5.19/io_uring-socket branch? That'll include the opcodes added for 5.19, otherwise we'll most likely end up in a situation where it'll merge cleanly but trigger a warning at build time. Also avoids having to fix those up after the fact in any case. -- Jens Axboe ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 0/4] io_uring: text representation of opcode in trace 2022-04-25 22:47 ` [PATCH v2 0/4] io_uring: text representation of opcode " Jens Axboe @ 2022-04-26 8:16 ` Dylan Yudaken 0 siblings, 0 replies; 7+ messages in thread From: Dylan Yudaken @ 2022-04-26 8:16 UTC (permalink / raw) To: [email protected], [email protected] Cc: Kernel Team, [email protected] On Mon, 2022-04-25 at 16:47 -0600, Jens Axboe wrote: > On 4/25/22 9:07 AM, Dylan Yudaken wrote: > > > > This series adds the text representation of opcodes into the trace. > > This > > makes it much quicker to understand traces without having to > > translate > > opcodes in your head. > > > > Patch 1 adds a type to io_uring opcodes > > Patch 2 is the translation function. > > Patch 3 is a small cleanup > > Patch 4 uses the translator in the trace logic > > Sorry forgot, one last request - can you make this against the > for-5.19/io_uring-socket branch? That'll include the opcodes added > for > 5.19, otherwise we'll most likely end up in a situation where it'll > merge cleanly but trigger a warning at build time. Also avoids having > to > fix those up after the fact in any case. > Sure - that's easy enough ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-04-26 8:16 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-04-25 15:07 [PATCH v2 0/4] io_uring: text representation of opcode in trace Dylan Yudaken 2022-04-25 15:07 ` [PATCH v2 1/4] io_uring: add type to op enum Dylan Yudaken 2022-04-25 15:07 ` [PATCH v2 2/4] io_uring: add io_uring_get_opcode Dylan Yudaken 2022-04-25 15:07 ` [PATCH v2 3/4] io_uring: rename op -> opcode Dylan Yudaken 2022-04-25 15:07 ` [PATCH v2 4/4] io_uring: use the text representation of ops in trace Dylan Yudaken 2022-04-25 22:47 ` [PATCH v2 0/4] io_uring: text representation of opcode " Jens Axboe 2022-04-26 8:16 ` Dylan Yudaken
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox