Message ID | 20221014100111.1706363-1-hengqi.chen@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | block: introduce block_io_start/block_io_done tracepoints | expand |
Hi. Le vendredi 14 octobre 2022, 12:01:11 CEST Hengqi Chen a écrit : > Currently, several BCC ([0]) tools (biosnoop/biostacks/biotop) use > kprobes to blk_account_io_start/blk_account_io_done to implement > their functionalities. This is fragile because the target kernel > functions may be renamed ([1]) or inlined ([2]). So introduces two > new tracepoints for such use cases. Thank you for working on this, I was able to build a kernel with your patch and successfully tested it: root@vm-amd64:~# uname -a Linux vm-amd64 6.0.0-rc4-00001-g89f38605b66b #95 SMP PREEMPT_DYNAMIC Fri Oct 14 18:03:58 CEST 2022 x86_64 GNU/Linux root@vm-amd64:~# perf_5.10 record -e block:block_io_done -e block:block_io_start -a dd if=/dev/zero of=foo count=100 ... [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.083 MB perf.data (1 samples) ] root@vm-amd64:~# perf_5.10 script dd 313 [000] 273.355898: block:block_io_start: 8,0 W 53248 ()> swapper 0 [000] 273.357048: block:block_io_done: 8,0 W 0 () 484> So, I can offer you this: Tested-by: Francis Laniel <flaniel@linux.microsoft.com> > [0]: https://github.com/iovisor/bcc > [0]: https://github.com/iovisor/bcc/issues/3954 > [1]: https://github.com/iovisor/bcc/issues/4261 One small nit: [0]: https://github.com/iovisor/bcc [1]: https://github.com/iovisor/bcc/issues/3954 [2]: https://github.com/iovisor/bcc/issues/4261 > > Signed-off-by: Hengqi Chen <hengqi.chen@gmail.com> > --- > block/blk-mq.c | 4 ++++ > include/trace/events/block.h | 27 ++++++++++++++++++++++++++- > 2 files changed, 30 insertions(+), 1 deletion(-) > > diff --git a/block/blk-mq.c b/block/blk-mq.c > index c96c8c4f751b..3777f486a365 100644 > --- a/block/blk-mq.c > +++ b/block/blk-mq.c > @@ -887,6 +887,8 @@ static void __blk_account_io_done(struct request *req, > u64 now) > > static inline void blk_account_io_done(struct request *req, u64 now) > { > + trace_block_io_done(req); > + > /* > * Account IO completion. flush_rq isn't accounted as a > * normal IO on queueing nor completion. Accounting the > @@ -917,6 +919,8 @@ static void __blk_account_io_start(struct request *rq) > > static inline void blk_account_io_start(struct request *req) > { > + trace_block_io_start(req); > + > if (blk_do_io_stat(req)) > __blk_account_io_start(req); > } > diff --git a/include/trace/events/block.h b/include/trace/events/block.h > index 7f4dfbdf12a6..65c4cb224736 100644 > --- a/include/trace/events/block.h > +++ b/include/trace/events/block.h > @@ -245,6 +245,32 @@ DEFINE_EVENT(block_rq, block_rq_merge, > TP_ARGS(rq) > ); > > +/** > + * block_io_start - insert a request for execution > + * @rq: block IO operation request > + * > + * Called when block operation request @rq is queued for execution > + */ > +DEFINE_EVENT(block_rq, block_io_start, > + > + TP_PROTO(struct request *rq), > + > + TP_ARGS(rq) > +); > + > +/** > + * block_io_done - block IO operation request completed > + * @rq: block IO operation request > + * > + * Called when block operation request @rq is completed > + */ > +DEFINE_EVENT(block_rq, block_io_done, > + > + TP_PROTO(struct request *rq), > + > + TP_ARGS(rq) > +); > + > /** > * block_bio_complete - completed all work on the block operation > * @q: queue holding the block operation > @@ -556,4 +582,3 @@ TRACE_EVENT(block_rq_remap, > > /* This part must be outside protection */ > #include <trace/define_trace.h> > - Best regards.
diff --git a/block/blk-mq.c b/block/blk-mq.c index c96c8c4f751b..3777f486a365 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -887,6 +887,8 @@ static void __blk_account_io_done(struct request *req, u64 now) static inline void blk_account_io_done(struct request *req, u64 now) { + trace_block_io_done(req); + /* * Account IO completion. flush_rq isn't accounted as a * normal IO on queueing nor completion. Accounting the @@ -917,6 +919,8 @@ static void __blk_account_io_start(struct request *rq) static inline void blk_account_io_start(struct request *req) { + trace_block_io_start(req); + if (blk_do_io_stat(req)) __blk_account_io_start(req); } diff --git a/include/trace/events/block.h b/include/trace/events/block.h index 7f4dfbdf12a6..65c4cb224736 100644 --- a/include/trace/events/block.h +++ b/include/trace/events/block.h @@ -245,6 +245,32 @@ DEFINE_EVENT(block_rq, block_rq_merge, TP_ARGS(rq) ); +/** + * block_io_start - insert a request for execution + * @rq: block IO operation request + * + * Called when block operation request @rq is queued for execution + */ +DEFINE_EVENT(block_rq, block_io_start, + + TP_PROTO(struct request *rq), + + TP_ARGS(rq) +); + +/** + * block_io_done - block IO operation request completed + * @rq: block IO operation request + * + * Called when block operation request @rq is completed + */ +DEFINE_EVENT(block_rq, block_io_done, + + TP_PROTO(struct request *rq), + + TP_ARGS(rq) +); + /** * block_bio_complete - completed all work on the block operation * @q: queue holding the block operation @@ -556,4 +582,3 @@ TRACE_EVENT(block_rq_remap, /* This part must be outside protection */ #include <trace/define_trace.h> -
Currently, several BCC ([0]) tools (biosnoop/biostacks/biotop) use kprobes to blk_account_io_start/blk_account_io_done to implement their functionalities. This is fragile because the target kernel functions may be renamed ([1]) or inlined ([2]). So introduces two new tracepoints for such use cases. [0]: https://github.com/iovisor/bcc [0]: https://github.com/iovisor/bcc/issues/3954 [1]: https://github.com/iovisor/bcc/issues/4261 Signed-off-by: Hengqi Chen <hengqi.chen@gmail.com> --- block/blk-mq.c | 4 ++++ include/trace/events/block.h | 27 ++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-)