Commit b0da3f0dada78832c9da03ad2152ae76bd9a2496

Authored by Jun'ichi Nomura
Committed by Jens Axboe
1 parent 67efc92580

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>

Showing 4 changed files with 69 additions and 1 deletions Side-by-side Diff

... ... @@ -34,6 +34,7 @@
34 34 #include "blk.h"
35 35  
36 36 EXPORT_TRACEPOINT_SYMBOL_GPL(block_remap);
  37 +EXPORT_TRACEPOINT_SYMBOL_GPL(block_rq_remap);
37 38 EXPORT_TRACEPOINT_SYMBOL_GPL(block_bio_complete);
38 39  
39 40 static int __make_request(struct request_queue *q, struct bio *bio);
include/linux/blktrace_api.h
... ... @@ -212,7 +212,7 @@
212 212 # define blk_trace_startstop(q, start) (-ENOTTY)
213 213 # define blk_trace_remove(q) (-ENOTTY)
214 214 # define blk_add_trace_msg(q, fmt, ...) do { } while (0)
215   -# define blk_trace_remove_sysfs(struct device *dev) do { } while (0)
  215 +# define blk_trace_remove_sysfs(dev) do { } while (0)
216 216 static inline int blk_trace_init_sysfs(struct device *dev)
217 217 {
218 218 return 0;
include/trace/events/block.h
... ... @@ -488,6 +488,39 @@
488 488 (unsigned long long)__entry->old_sector)
489 489 );
490 490  
  491 +TRACE_EVENT(block_rq_remap,
  492 +
  493 + TP_PROTO(struct request_queue *q, struct request *rq, dev_t dev,
  494 + sector_t from),
  495 +
  496 + TP_ARGS(q, rq, dev, from),
  497 +
  498 + TP_STRUCT__entry(
  499 + __field( dev_t, dev )
  500 + __field( sector_t, sector )
  501 + __field( unsigned int, nr_sector )
  502 + __field( dev_t, old_dev )
  503 + __field( sector_t, old_sector )
  504 + __array( char, rwbs, 6 )
  505 + ),
  506 +
  507 + TP_fast_assign(
  508 + __entry->dev = disk_devt(rq->rq_disk);
  509 + __entry->sector = blk_rq_pos(rq);
  510 + __entry->nr_sector = blk_rq_sectors(rq);
  511 + __entry->old_dev = dev;
  512 + __entry->old_sector = from;
  513 + blk_fill_rwbs_rq(__entry->rwbs, rq);
  514 + ),
  515 +
  516 + TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu",
  517 + MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
  518 + (unsigned long long)__entry->sector,
  519 + __entry->nr_sector,
  520 + MAJOR(__entry->old_dev), MINOR(__entry->old_dev),
  521 + (unsigned long long)__entry->old_sector)
  522 +);
  523 +
491 524 #endif /* _TRACE_BLOCK_H */
492 525  
493 526 /* This part must be outside protection */
kernel/trace/blktrace.c
... ... @@ -856,6 +856,37 @@
856 856 }
857 857  
858 858 /**
  859 + * blk_add_trace_rq_remap - Add a trace for a request-remap operation
  860 + * @q: queue the io is for
  861 + * @rq: the source request
  862 + * @dev: target device
  863 + * @from: source sector
  864 + *
  865 + * Description:
  866 + * Device mapper remaps request to other devices.
  867 + * Add a trace for that action.
  868 + *
  869 + **/
  870 +static void blk_add_trace_rq_remap(struct request_queue *q,
  871 + struct request *rq, dev_t dev,
  872 + sector_t from)
  873 +{
  874 + struct blk_trace *bt = q->blk_trace;
  875 + struct blk_io_trace_remap r;
  876 +
  877 + if (likely(!bt))
  878 + return;
  879 +
  880 + r.device_from = cpu_to_be32(dev);
  881 + r.device_to = cpu_to_be32(disk_devt(rq->rq_disk));
  882 + r.sector_from = cpu_to_be64(from);
  883 +
  884 + __blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq),
  885 + rq_data_dir(rq), BLK_TA_REMAP, !!rq->errors,
  886 + sizeof(r), &r);
  887 +}
  888 +
  889 +/**
859 890 * blk_add_driver_data - Add binary message with driver-specific data
860 891 * @q: queue the io is for
861 892 * @rq: io request
862 893  
... ... @@ -922,10 +953,13 @@
922 953 WARN_ON(ret);
923 954 ret = register_trace_block_remap(blk_add_trace_remap);
924 955 WARN_ON(ret);
  956 + ret = register_trace_block_rq_remap(blk_add_trace_rq_remap);
  957 + WARN_ON(ret);
925 958 }
926 959  
927 960 static void blk_unregister_tracepoints(void)
928 961 {
  962 + unregister_trace_block_rq_remap(blk_add_trace_rq_remap);
929 963 unregister_trace_block_remap(blk_add_trace_remap);
930 964 unregister_trace_block_split(blk_add_trace_split);
931 965 unregister_trace_block_unplug_io(blk_add_trace_unplug_io);