Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

blktrace: differentiate between blk_io_trace versions

Differentiate between blk_io_trace and blk_io_trace2 when relaying to
user-space depending on which version has been requested by the blktrace
utility.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Johannes Thumshirn and committed by
Jens Axboe
915bb538 c44347d6

+57 -1
+57 -1
kernel/trace/blktrace.c
··· 91 91 memcpy((void *)t + sizeof(*t) + cgid_len, pdu_data, pdu_len); 92 92 } 93 93 94 - static void relay_blktrace_event(struct blk_trace *bt, unsigned long sequence, 94 + static void record_blktrace_event2(struct blk_io_trace2 *t2, pid_t pid, int cpu, 95 + sector_t sector, int bytes, u64 what, 96 + dev_t dev, int error, u64 cgid, 97 + ssize_t cgid_len, void *pdu_data, 98 + int pdu_len) 99 + { 100 + t2->pid = pid; 101 + t2->cpu = cpu; 102 + 103 + t2->sector = sector; 104 + t2->bytes = bytes; 105 + t2->action = what; 106 + t2->device = dev; 107 + t2->error = error; 108 + t2->pdu_len = pdu_len + cgid_len; 109 + 110 + if (cgid_len) 111 + memcpy((void *)t2 + sizeof(*t2), &cgid, cgid_len); 112 + if (pdu_len) 113 + memcpy((void *)t2 + sizeof(*t2) + cgid_len, pdu_data, pdu_len); 114 + } 115 + 116 + static void relay_blktrace_event1(struct blk_trace *bt, unsigned long sequence, 95 117 pid_t pid, int cpu, sector_t sector, int bytes, 96 118 u64 what, int error, u64 cgid, 97 119 ssize_t cgid_len, void *pdu_data, int pdu_len) ··· 131 109 132 110 record_blktrace_event(t, pid, cpu, sector, bytes, what, bt->dev, error, 133 111 cgid, cgid_len, pdu_data, pdu_len); 112 + } 113 + 114 + static void relay_blktrace_event2(struct blk_trace *bt, unsigned long sequence, 115 + pid_t pid, int cpu, sector_t sector, 116 + int bytes, u64 what, int error, u64 cgid, 117 + ssize_t cgid_len, void *pdu_data, int pdu_len) 118 + { 119 + struct blk_io_trace2 *t; 120 + size_t trace_len = sizeof(struct blk_io_trace2) + pdu_len + cgid_len; 121 + 122 + t = relay_reserve(bt->rchan, trace_len); 123 + if (!t) 124 + return; 125 + 126 + t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE2_VERSION; 127 + t->sequence = sequence; 128 + t->time = ktime_to_ns(ktime_get()); 129 + 130 + record_blktrace_event2(t, pid, cpu, sector, bytes, what, bt->dev, error, 131 + cgid, cgid_len, pdu_data, pdu_len); 132 + } 133 + 134 + static void relay_blktrace_event(struct blk_trace *bt, unsigned long sequence, 135 + pid_t pid, int cpu, sector_t sector, int bytes, 136 + u64 what, int error, u64 cgid, 137 + ssize_t cgid_len, void *pdu_data, int pdu_len) 138 + { 139 + if (bt->version == 2) 140 + return relay_blktrace_event2(bt, sequence, pid, cpu, sector, 141 + bytes, what, error, cgid, cgid_len, 142 + pdu_data, pdu_len); 143 + return relay_blktrace_event1(bt, sequence, pid, cpu, sector, bytes, 144 + lower_32_bits(what), error, cgid, cgid_len, 145 + pdu_data, pdu_len); 134 146 } 135 147 136 148 /*