public inbox for [email protected]
 help / color / mirror / Atom feed
* [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