mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
Add a tracepoint for block request remapping
Since 2.6.31 now has request-based device-mapper, it's useful to have a tracepoint for request-remapping as well as bio-remapping. This patch adds a tracepoint for request-remapping, trace_block_rq_remap(). Signed-off-by: Kiyoshi Ueda <k-ueda@ct.jp.nec.com> Signed-off-by: Jun'ichi Nomura <j-nomura@ce.jp.nec.com> Cc: Alasdair G Kergon <agk@redhat.com> Cc: Li Zefan <lizf@cn.fujitsu.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
parent
67efc92580
commit
b0da3f0dad
4 changed files with 69 additions and 1 deletions
|
@ -34,6 +34,7 @@
|
||||||
#include "blk.h"
|
#include "blk.h"
|
||||||
|
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(block_remap);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(block_remap);
|
||||||
|
EXPORT_TRACEPOINT_SYMBOL_GPL(block_rq_remap);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(block_bio_complete);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(block_bio_complete);
|
||||||
|
|
||||||
static int __make_request(struct request_queue *q, struct bio *bio);
|
static int __make_request(struct request_queue *q, struct bio *bio);
|
||||||
|
|
|
@ -212,7 +212,7 @@ extern struct attribute_group blk_trace_attr_group;
|
||||||
# define blk_trace_startstop(q, start) (-ENOTTY)
|
# define blk_trace_startstop(q, start) (-ENOTTY)
|
||||||
# define blk_trace_remove(q) (-ENOTTY)
|
# define blk_trace_remove(q) (-ENOTTY)
|
||||||
# define blk_add_trace_msg(q, fmt, ...) do { } while (0)
|
# define blk_add_trace_msg(q, fmt, ...) do { } while (0)
|
||||||
# define blk_trace_remove_sysfs(struct device *dev) do { } while (0)
|
# define blk_trace_remove_sysfs(dev) do { } while (0)
|
||||||
static inline int blk_trace_init_sysfs(struct device *dev)
|
static inline int blk_trace_init_sysfs(struct device *dev)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -488,6 +488,39 @@ TRACE_EVENT(block_remap,
|
||||||
(unsigned long long)__entry->old_sector)
|
(unsigned long long)__entry->old_sector)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT(block_rq_remap,
|
||||||
|
|
||||||
|
TP_PROTO(struct request_queue *q, struct request *rq, dev_t dev,
|
||||||
|
sector_t from),
|
||||||
|
|
||||||
|
TP_ARGS(q, rq, dev, from),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field( dev_t, dev )
|
||||||
|
__field( sector_t, sector )
|
||||||
|
__field( unsigned int, nr_sector )
|
||||||
|
__field( dev_t, old_dev )
|
||||||
|
__field( sector_t, old_sector )
|
||||||
|
__array( char, rwbs, 6 )
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->dev = disk_devt(rq->rq_disk);
|
||||||
|
__entry->sector = blk_rq_pos(rq);
|
||||||
|
__entry->nr_sector = blk_rq_sectors(rq);
|
||||||
|
__entry->old_dev = dev;
|
||||||
|
__entry->old_sector = from;
|
||||||
|
blk_fill_rwbs_rq(__entry->rwbs, rq);
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu",
|
||||||
|
MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
|
||||||
|
(unsigned long long)__entry->sector,
|
||||||
|
__entry->nr_sector,
|
||||||
|
MAJOR(__entry->old_dev), MINOR(__entry->old_dev),
|
||||||
|
(unsigned long long)__entry->old_sector)
|
||||||
|
);
|
||||||
|
|
||||||
#endif /* _TRACE_BLOCK_H */
|
#endif /* _TRACE_BLOCK_H */
|
||||||
|
|
||||||
/* This part must be outside protection */
|
/* This part must be outside protection */
|
||||||
|
|
|
@ -855,6 +855,37 @@ static void blk_add_trace_remap(struct request_queue *q, struct bio *bio,
|
||||||
sizeof(r), &r);
|
sizeof(r), &r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* blk_add_trace_rq_remap - Add a trace for a request-remap operation
|
||||||
|
* @q: queue the io is for
|
||||||
|
* @rq: the source request
|
||||||
|
* @dev: target device
|
||||||
|
* @from: source sector
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Device mapper remaps request to other devices.
|
||||||
|
* Add a trace for that action.
|
||||||
|
*
|
||||||
|
**/
|
||||||
|
static void blk_add_trace_rq_remap(struct request_queue *q,
|
||||||
|
struct request *rq, dev_t dev,
|
||||||
|
sector_t from)
|
||||||
|
{
|
||||||
|
struct blk_trace *bt = q->blk_trace;
|
||||||
|
struct blk_io_trace_remap r;
|
||||||
|
|
||||||
|
if (likely(!bt))
|
||||||
|
return;
|
||||||
|
|
||||||
|
r.device_from = cpu_to_be32(dev);
|
||||||
|
r.device_to = cpu_to_be32(disk_devt(rq->rq_disk));
|
||||||
|
r.sector_from = cpu_to_be64(from);
|
||||||
|
|
||||||
|
__blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq),
|
||||||
|
rq_data_dir(rq), BLK_TA_REMAP, !!rq->errors,
|
||||||
|
sizeof(r), &r);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* blk_add_driver_data - Add binary message with driver-specific data
|
* blk_add_driver_data - Add binary message with driver-specific data
|
||||||
* @q: queue the io is for
|
* @q: queue the io is for
|
||||||
|
@ -922,10 +953,13 @@ static void blk_register_tracepoints(void)
|
||||||
WARN_ON(ret);
|
WARN_ON(ret);
|
||||||
ret = register_trace_block_remap(blk_add_trace_remap);
|
ret = register_trace_block_remap(blk_add_trace_remap);
|
||||||
WARN_ON(ret);
|
WARN_ON(ret);
|
||||||
|
ret = register_trace_block_rq_remap(blk_add_trace_rq_remap);
|
||||||
|
WARN_ON(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void blk_unregister_tracepoints(void)
|
static void blk_unregister_tracepoints(void)
|
||||||
{
|
{
|
||||||
|
unregister_trace_block_rq_remap(blk_add_trace_rq_remap);
|
||||||
unregister_trace_block_remap(blk_add_trace_remap);
|
unregister_trace_block_remap(blk_add_trace_remap);
|
||||||
unregister_trace_block_split(blk_add_trace_split);
|
unregister_trace_block_split(blk_add_trace_split);
|
||||||
unregister_trace_block_unplug_io(blk_add_trace_unplug_io);
|
unregister_trace_block_unplug_io(blk_add_trace_unplug_io);
|
||||||
|
|
Loading…
Reference in a new issue