> On Tue, Oct 8, 2019 at 2:52 PM Dmitrii Dolgov <9erthalion6@xxxxxxxxx> wrote: > > To trace io_uring activity one can get an information from workqueue and > io trace events, but looks like some parts could be hard to identify. > E.g. it's not easy to figure out that one work was started after another > due to a link between them. > > For that purpose introduce io_uring_link trace event, that will be fired > when a request is added to a link_list. > > Signed-off-by: Dmitrii Dolgov <9erthalion6@xxxxxxxxx> > --- > fs/io_uring.c | 4 ++++ > include/Kbuild | 1 + > include/trace/events/io_uring.h | 42 +++++++++++++++++++++++++++++++++ > 3 files changed, 47 insertions(+) > create mode 100644 include/trace/events/io_uring.h > > diff --git a/fs/io_uring.c b/fs/io_uring.c > index bfbb7ab3c4e..63e4b592d69 100644 > --- a/fs/io_uring.c > +++ b/fs/io_uring.c > @@ -71,6 +71,9 @@ > #include <linux/sizes.h> > #include <linux/hugetlb.h> > > +#define CREATE_TRACE_POINTS > +#include <trace/events/io_uring.h> > + > #include <uapi/linux/io_uring.h> > > #include "internal.h" > @@ -2488,6 +2491,7 @@ static void io_submit_sqe(struct io_ring_ctx *ctx, struct sqe_submit *s, > > s->sqe = sqe_copy; > memcpy(&req->submit, s, sizeof(*s)); > + trace_io_uring_link(&req->work, &prev->work); > list_add_tail(&req->list, &prev->link_list); > } else if (s->sqe->flags & IOSQE_IO_LINK) { > req->flags |= REQ_F_LINK; > diff --git a/include/Kbuild b/include/Kbuild > index ffba79483cc..61b66725d25 100644 > --- a/include/Kbuild > +++ b/include/Kbuild > @@ -1028,6 +1028,7 @@ header-test- += trace/events/fsi_master_gpio.h > header-test- += trace/events/huge_memory.h > header-test- += trace/events/ib_mad.h > header-test- += trace/events/ib_umad.h > +header-test- += trace/events/io_uring.h > header-test- += trace/events/iscsi.h > header-test- += trace/events/jbd2.h > header-test- += trace/events/kvm.h > diff --git a/include/trace/events/io_uring.h b/include/trace/events/io_uring.h > new file mode 100644 > index 00000000000..56245c31a1e > --- /dev/null > +++ b/include/trace/events/io_uring.h > @@ -0,0 +1,42 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +#undef TRACE_SYSTEM > +#define TRACE_SYSTEM io_uring > + > +#if !defined(_TRACE_IO_URING_H) || defined(TRACE_HEADER_MULTI_READ) > +#define _TRACE_IO_URING_H > + > +#include <linux/tracepoint.h> > + > +/** > + * io_uring_link - called immediately before the io_uring work added into > + * link_list of the another request. > + * @work: pointer to linked struct work_struct > + * @target_work: pointer to previous struct work_struct, > + * that would contain @work > + * > + * Allows to track linked requests in io_uring. > + */ > +TRACE_EVENT(io_uring_link, > + > + TP_PROTO(struct work_struct *work, struct work_struct *target_work), > + > + TP_ARGS(work, target_work), > + > + TP_STRUCT__entry ( > + __field( void *, work ) > + __field( void *, target_work ) > + ), > + > + TP_fast_assign( > + __entry->work = work; > + __entry->target_work = target_work; > + ), > + > + TP_printk("io_uring work struct %p linked after %p", > + __entry->work, __entry->target_work) > +); > + > +#endif /* _TRACE_IO_URING_H */ > + > +/* This part must be outside protection */ > +#include <trace/define_trace.h> > -- > 2.21.0 > If I'm missing something and it doesn't make sense, then I would be glad to hear if there are any best practices or ideas, and in general how to look at io_uring from the tracing point of view.