diff options
Diffstat (limited to 'kernel/trace/blktrace.c')
| -rw-r--r-- | kernel/trace/blktrace.c | 51 |
1 files changed, 47 insertions, 4 deletions
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index 7a34cb563fec..d9d6206e0b14 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c | |||
| @@ -65,13 +65,15 @@ static void trace_note(struct blk_trace *bt, pid_t pid, int action, | |||
| 65 | { | 65 | { |
| 66 | struct blk_io_trace *t; | 66 | struct blk_io_trace *t; |
| 67 | struct ring_buffer_event *event = NULL; | 67 | struct ring_buffer_event *event = NULL; |
| 68 | struct ring_buffer *buffer = NULL; | ||
| 68 | int pc = 0; | 69 | int pc = 0; |
| 69 | int cpu = smp_processor_id(); | 70 | int cpu = smp_processor_id(); |
| 70 | bool blk_tracer = blk_tracer_enabled; | 71 | bool blk_tracer = blk_tracer_enabled; |
| 71 | 72 | ||
| 72 | if (blk_tracer) { | 73 | if (blk_tracer) { |
| 74 | buffer = blk_tr->buffer; | ||
| 73 | pc = preempt_count(); | 75 | pc = preempt_count(); |
| 74 | event = trace_buffer_lock_reserve(blk_tr, TRACE_BLK, | 76 | event = trace_buffer_lock_reserve(buffer, TRACE_BLK, |
| 75 | sizeof(*t) + len, | 77 | sizeof(*t) + len, |
| 76 | 0, pc); | 78 | 0, pc); |
| 77 | if (!event) | 79 | if (!event) |
| @@ -96,7 +98,7 @@ record_it: | |||
| 96 | memcpy((void *) t + sizeof(*t), data, len); | 98 | memcpy((void *) t + sizeof(*t), data, len); |
| 97 | 99 | ||
| 98 | if (blk_tracer) | 100 | if (blk_tracer) |
| 99 | trace_buffer_unlock_commit(blk_tr, event, 0, pc); | 101 | trace_buffer_unlock_commit(buffer, event, 0, pc); |
| 100 | } | 102 | } |
| 101 | } | 103 | } |
| 102 | 104 | ||
| @@ -179,6 +181,7 @@ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, | |||
| 179 | { | 181 | { |
| 180 | struct task_struct *tsk = current; | 182 | struct task_struct *tsk = current; |
| 181 | struct ring_buffer_event *event = NULL; | 183 | struct ring_buffer_event *event = NULL; |
| 184 | struct ring_buffer *buffer = NULL; | ||
| 182 | struct blk_io_trace *t; | 185 | struct blk_io_trace *t; |
| 183 | unsigned long flags = 0; | 186 | unsigned long flags = 0; |
| 184 | unsigned long *sequence; | 187 | unsigned long *sequence; |
| @@ -204,8 +207,9 @@ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, | |||
| 204 | if (blk_tracer) { | 207 | if (blk_tracer) { |
| 205 | tracing_record_cmdline(current); | 208 | tracing_record_cmdline(current); |
| 206 | 209 | ||
| 210 | buffer = blk_tr->buffer; | ||
| 207 | pc = preempt_count(); | 211 | pc = preempt_count(); |
| 208 | event = trace_buffer_lock_reserve(blk_tr, TRACE_BLK, | 212 | event = trace_buffer_lock_reserve(buffer, TRACE_BLK, |
| 209 | sizeof(*t) + pdu_len, | 213 | sizeof(*t) + pdu_len, |
| 210 | 0, pc); | 214 | 0, pc); |
| 211 | if (!event) | 215 | if (!event) |
| @@ -252,7 +256,7 @@ record_it: | |||
| 252 | memcpy((void *) t + sizeof(*t), pdu_data, pdu_len); | 256 | memcpy((void *) t + sizeof(*t), pdu_data, pdu_len); |
| 253 | 257 | ||
| 254 | if (blk_tracer) { | 258 | if (blk_tracer) { |
| 255 | trace_buffer_unlock_commit(blk_tr, event, 0, pc); | 259 | trace_buffer_unlock_commit(buffer, event, 0, pc); |
| 256 | return; | 260 | return; |
| 257 | } | 261 | } |
| 258 | } | 262 | } |
| @@ -852,6 +856,37 @@ static void blk_add_trace_remap(struct request_queue *q, struct bio *bio, | |||
| 852 | } | 856 | } |
| 853 | 857 | ||
| 854 | /** | 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 | /** | ||
| 855 | * blk_add_driver_data - Add binary message with driver-specific data | 890 | * blk_add_driver_data - Add binary message with driver-specific data |
| 856 | * @q: queue the io is for | 891 | * @q: queue the io is for |
| 857 | * @rq: io request | 892 | * @rq: io request |
| @@ -918,10 +953,13 @@ static void blk_register_tracepoints(void) | |||
| 918 | WARN_ON(ret); | 953 | WARN_ON(ret); |
| 919 | ret = register_trace_block_remap(blk_add_trace_remap); | 954 | ret = register_trace_block_remap(blk_add_trace_remap); |
| 920 | WARN_ON(ret); | 955 | WARN_ON(ret); |
| 956 | ret = register_trace_block_rq_remap(blk_add_trace_rq_remap); | ||
| 957 | WARN_ON(ret); | ||
| 921 | } | 958 | } |
| 922 | 959 | ||
| 923 | static void blk_unregister_tracepoints(void) | 960 | static void blk_unregister_tracepoints(void) |
| 924 | { | 961 | { |
| 962 | unregister_trace_block_rq_remap(blk_add_trace_rq_remap); | ||
| 925 | unregister_trace_block_remap(blk_add_trace_remap); | 963 | unregister_trace_block_remap(blk_add_trace_remap); |
| 926 | unregister_trace_block_split(blk_add_trace_split); | 964 | unregister_trace_block_split(blk_add_trace_split); |
| 927 | unregister_trace_block_unplug_io(blk_add_trace_unplug_io); | 965 | unregister_trace_block_unplug_io(blk_add_trace_unplug_io); |
| @@ -1653,6 +1691,11 @@ int blk_trace_init_sysfs(struct device *dev) | |||
| 1653 | return sysfs_create_group(&dev->kobj, &blk_trace_attr_group); | 1691 | return sysfs_create_group(&dev->kobj, &blk_trace_attr_group); |
| 1654 | } | 1692 | } |
| 1655 | 1693 | ||
| 1694 | void blk_trace_remove_sysfs(struct device *dev) | ||
| 1695 | { | ||
| 1696 | sysfs_remove_group(&dev->kobj, &blk_trace_attr_group); | ||
| 1697 | } | ||
| 1698 | |||
| 1656 | #endif /* CONFIG_BLK_DEV_IO_TRACE */ | 1699 | #endif /* CONFIG_BLK_DEV_IO_TRACE */ |
| 1657 | 1700 | ||
| 1658 | #ifdef CONFIG_EVENT_TRACING | 1701 | #ifdef CONFIG_EVENT_TRACING |
