block: introduce block_io_start/block_io_done tracepoints
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 introduce two new tracepoints for such use cases. [0]: https://github.com/iovisor/bcc [1]: https://github.com/iovisor/bcc/issues/3954 [2]: https://github.com/iovisor/bcc/issues/4261 Tested-by: Francis Laniel <flaniel@linux.microsoft.com> Signed-off-by: Hengqi Chen <hengqi.chen@gmail.com> Tested-by: Yonghong Song <yhs@fb.com> Link: https://lore.kernel.org/r/20230520084057.1467003-1-hengqi.chen@gmail.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
a13bd91be2
commit
5a80bd075f
|
@ -962,6 +962,8 @@ EXPORT_SYMBOL_GPL(blk_update_request);
|
|||
|
||||
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
|
||||
|
@ -981,6 +983,8 @@ static inline void blk_account_io_done(struct request *req, u64 now)
|
|||
|
||||
static inline void blk_account_io_start(struct request *req)
|
||||
{
|
||||
trace_block_io_start(req);
|
||||
|
||||
if (blk_do_io_stat(req)) {
|
||||
/*
|
||||
* All non-passthrough requests are created from a bio with one
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue