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@xxxxxxxxx> --- 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> - -- 2.34.1