Commit 51c3ff62 authored by Jens Axboe's avatar Jens Axboe

io_uring: add completion trace event

We currently don't have a completion event trace, add one of those. And
to better be able to match up submissions and completions, add user_data
to the submission trace as well.
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 364b05fd
...@@ -592,6 +592,8 @@ static void io_cqring_fill_event(struct io_ring_ctx *ctx, u64 ki_user_data, ...@@ -592,6 +592,8 @@ static void io_cqring_fill_event(struct io_ring_ctx *ctx, u64 ki_user_data,
{ {
struct io_uring_cqe *cqe; struct io_uring_cqe *cqe;
trace_io_uring_complete(ctx, ki_user_data, res);
/* /*
* If we can't get a cq entry, userspace overflowed the * If we can't get a cq entry, userspace overflowed the
* submission (by quite a lot). Increment the overflow count in * submission (by quite a lot). Increment the overflow count in
...@@ -2733,7 +2735,7 @@ static int io_submit_sqes(struct io_ring_ctx *ctx, unsigned int nr, ...@@ -2733,7 +2735,7 @@ static int io_submit_sqes(struct io_ring_ctx *ctx, unsigned int nr,
s.has_user = *mm != NULL; s.has_user = *mm != NULL;
s.in_async = true; s.in_async = true;
s.needs_fixed_file = true; s.needs_fixed_file = true;
trace_io_uring_submit_sqe(ctx, true, true); trace_io_uring_submit_sqe(ctx, s.sqe->user_data, true, true);
io_submit_sqe(ctx, &s, statep, &link); io_submit_sqe(ctx, &s, statep, &link);
submitted++; submitted++;
} }
...@@ -2913,7 +2915,7 @@ static int io_ring_submit(struct io_ring_ctx *ctx, unsigned int to_submit, ...@@ -2913,7 +2915,7 @@ static int io_ring_submit(struct io_ring_ctx *ctx, unsigned int to_submit,
s.needs_fixed_file = false; s.needs_fixed_file = false;
s.ring_fd = ring_fd; s.ring_fd = ring_fd;
submit++; submit++;
trace_io_uring_submit_sqe(ctx, true, false); trace_io_uring_submit_sqe(ctx, s.sqe->user_data, true, false);
io_submit_sqe(ctx, &s, statep, &link); io_submit_sqe(ctx, &s, statep, &link);
} }
......
...@@ -284,10 +284,43 @@ TRACE_EVENT(io_uring_fail_link, ...@@ -284,10 +284,43 @@ TRACE_EVENT(io_uring_fail_link,
TP_printk("request %p, link %p", __entry->req, __entry->link) TP_printk("request %p, link %p", __entry->req, __entry->link)
); );
/**
* io_uring_complete - called when completing an SQE
*
* @ctx: pointer to a ring context structure
* @user_data: user data associated with the request
* @res: result of the request
*
*/
TRACE_EVENT(io_uring_complete,
TP_PROTO(void *ctx, u64 user_data, long res),
TP_ARGS(ctx, user_data, res),
TP_STRUCT__entry (
__field( void *, ctx )
__field( u64, user_data )
__field( long, res )
),
TP_fast_assign(
__entry->ctx = ctx;
__entry->user_data = user_data;
__entry->res = res;
),
TP_printk("ring %p, user_data 0x%llx, result %ld",
__entry->ctx, (unsigned long long)__entry->user_data,
__entry->res)
);
/** /**
* io_uring_submit_sqe - called before submitting one SQE * io_uring_submit_sqe - called before submitting one SQE
* *
* @ctx: pointer to a ring context structure * @ctx: pointer to a ring context structure
* @user_data: user data associated with the request
* @force_nonblock: whether a context blocking or not * @force_nonblock: whether a context blocking or not
* @sq_thread: true if sq_thread has submitted this SQE * @sq_thread: true if sq_thread has submitted this SQE
* *
...@@ -296,24 +329,27 @@ TRACE_EVENT(io_uring_fail_link, ...@@ -296,24 +329,27 @@ TRACE_EVENT(io_uring_fail_link,
*/ */
TRACE_EVENT(io_uring_submit_sqe, TRACE_EVENT(io_uring_submit_sqe,
TP_PROTO(void *ctx, bool force_nonblock, bool sq_thread), TP_PROTO(void *ctx, u64 user_data, bool force_nonblock, bool sq_thread),
TP_ARGS(ctx, force_nonblock, sq_thread), TP_ARGS(ctx, user_data, force_nonblock, sq_thread),
TP_STRUCT__entry ( TP_STRUCT__entry (
__field( void *, ctx ) __field( void *, ctx )
__field( u64, user_data )
__field( bool, force_nonblock ) __field( bool, force_nonblock )
__field( bool, sq_thread ) __field( bool, sq_thread )
), ),
TP_fast_assign( TP_fast_assign(
__entry->ctx = ctx; __entry->ctx = ctx;
__entry->user_data = user_data;
__entry->force_nonblock = force_nonblock; __entry->force_nonblock = force_nonblock;
__entry->sq_thread = sq_thread; __entry->sq_thread = sq_thread;
), ),
TP_printk("ring %p, non block %d, sq_thread %d", TP_printk("ring %p, user data 0x%llx, non block %d, sq_thread %d",
__entry->ctx, __entry->force_nonblock, __entry->sq_thread) __entry->ctx, (unsigned long long) __entry->user_data,
__entry->force_nonblock, __entry->sq_thread)
); );
#endif /* _TRACE_IO_URING_H */ #endif /* _TRACE_IO_URING_H */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment