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: split out relaying a blktrace event

Split out the code relaying a blktrace event to user-space using relayfs.

This enables adding a second version supporting a new version of the
protocol.

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
04678e72 472eca53

+32 -28
+32 -28
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, 95 + pid_t pid, int cpu, sector_t sector, int bytes, 96 + u32 what, int error, u64 cgid, 97 + ssize_t cgid_len, void *pdu_data, int pdu_len) 98 + { 99 + struct blk_io_trace *t; 100 + size_t trace_len = sizeof(*t) + pdu_len + cgid_len; 101 + 102 + t = relay_reserve(bt->rchan, trace_len); 103 + if (!t) 104 + return; 105 + 106 + t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION; 107 + t->sequence = sequence; 108 + t->time = ktime_to_ns(ktime_get()); 109 + 110 + record_blktrace_event(t, pid, cpu, sector, bytes, what, bt->dev, error, 111 + cgid, cgid_len, pdu_data, pdu_len); 112 + } 113 + 94 114 /* 95 115 * Send out a notify message. 96 116 */ ··· 146 126 if (!bt->rchan) 147 127 return; 148 128 149 - t = relay_reserve(bt->rchan, trace_len); 150 - if (t) { 151 - t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION; 152 - t->time = ktime_to_ns(ktime_get()); 153 - 154 - record_blktrace_event(t, pid, cpu, 0, 0, 155 - action | (cgid ? __BLK_TN_CGROUP : 0), 156 - bt->dev, 0, cgid, cgid_len, (void *)data, 157 - len); 158 - } 129 + relay_blktrace_event(bt, 0, pid, cpu, 0, 0, 130 + action | (cgid ? __BLK_TN_CGROUP : 0), 0, cgid, 131 + cgid_len, (void *)data, len); 159 132 } 160 133 161 134 /* ··· 259 246 struct task_struct *tsk = current; 260 247 struct ring_buffer_event *event = NULL; 261 248 struct trace_buffer *buffer = NULL; 262 - struct blk_io_trace *t; 263 249 unsigned long flags = 0; 264 250 unsigned long *sequence; 265 251 unsigned int trace_ctx = 0; ··· 290 278 return; 291 279 cpu = raw_smp_processor_id(); 292 280 293 - trace_len = sizeof(*t) + pdu_len + cgid_len; 294 281 if (blk_tracer) { 295 282 tracing_record_cmdline(current); 296 283 297 284 buffer = blk_tr->array_buffer.buffer; 298 285 trace_ctx = tracing_gen_ctx_flags(0); 286 + trace_len = sizeof(struct blk_io_trace) + pdu_len + cgid_len; 299 287 event = trace_buffer_lock_reserve(buffer, TRACE_BLK, 300 288 trace_len, trace_ctx); 301 289 if (!event) 302 290 return; 303 - t = ring_buffer_event_data(event); 304 291 305 - record_blktrace_event(t, pid, cpu, sector, bytes, what, bt->dev, 306 - error, cgid, cgid_len, pdu_data, pdu_len); 292 + record_blktrace_event(ring_buffer_event_data(event), 293 + pid, cpu, sector, bytes, what, bt->dev, 294 + error, cgid, cgid_len, pdu_data, 295 + pdu_len); 307 296 308 297 trace_buffer_unlock_commit(blk_tr, buffer, event, trace_ctx); 309 298 return; ··· 319 306 * from coming in and stepping on our toes. 320 307 */ 321 308 local_irq_save(flags); 322 - t = relay_reserve(bt->rchan, trace_len); 323 - if (t) { 324 - sequence = per_cpu_ptr(bt->sequence, cpu); 325 - 326 - t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION; 327 - t->sequence = ++(*sequence); 328 - t->time = ktime_to_ns(ktime_get()); 329 - 330 - record_blktrace_event(t, pid, cpu, sector, bytes, what, 331 - bt->dev, error, cgid, cgid_len, 332 - pdu_data, pdu_len); 333 - } 334 - 309 + sequence = per_cpu_ptr(bt->sequence, cpu); 310 + (*sequence)++; 311 + relay_blktrace_event(bt, *sequence, pid, cpu, sector, bytes, what, 312 + error, cgid, cgid_len, pdu_data, pdu_len); 335 313 local_irq_restore(flags); 336 314 } 337 315