mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
blktrace: factor out recording a blktrace event
Factor out the recording of a blktrace event into its own function, deduplicating the code. This also enables recording different versions of the blktrace protocol later on. 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>
This commit is contained in:
committed by
Jens Axboe
parent
a65988a0ad
commit
472eca5383
@@ -63,6 +63,34 @@ static int blk_probes_ref;
|
|||||||
static void blk_register_tracepoints(void);
|
static void blk_register_tracepoints(void);
|
||||||
static void blk_unregister_tracepoints(void);
|
static void blk_unregister_tracepoints(void);
|
||||||
|
|
||||||
|
static void record_blktrace_event(struct blk_io_trace *t, pid_t pid, int cpu,
|
||||||
|
sector_t sector, int bytes, u32 what,
|
||||||
|
dev_t dev, int error, u64 cgid,
|
||||||
|
ssize_t cgid_len, void *pdu_data, int pdu_len)
|
||||||
|
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* These two are not needed in ftrace as they are in the
|
||||||
|
* generic trace_entry, filled by tracing_generic_entry_update,
|
||||||
|
* but for the trace_event->bin() synthesizer benefit we do it
|
||||||
|
* here too.
|
||||||
|
*/
|
||||||
|
t->cpu = cpu;
|
||||||
|
t->pid = pid;
|
||||||
|
|
||||||
|
t->sector = sector;
|
||||||
|
t->bytes = bytes;
|
||||||
|
t->action = what;
|
||||||
|
t->device = dev;
|
||||||
|
t->error = error;
|
||||||
|
t->pdu_len = pdu_len + cgid_len;
|
||||||
|
|
||||||
|
if (cgid_len)
|
||||||
|
memcpy((void *)t + sizeof(*t), &cgid, cgid_len);
|
||||||
|
if (pdu_len)
|
||||||
|
memcpy((void *)t + sizeof(*t) + cgid_len, pdu_data, pdu_len);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Send out a notify message.
|
* Send out a notify message.
|
||||||
*/
|
*/
|
||||||
@@ -87,7 +115,12 @@ static void trace_note(struct blk_trace *bt, pid_t pid, int action,
|
|||||||
if (!event)
|
if (!event)
|
||||||
return;
|
return;
|
||||||
t = ring_buffer_event_data(event);
|
t = ring_buffer_event_data(event);
|
||||||
goto record_it;
|
record_blktrace_event(t, pid, cpu, 0, 0,
|
||||||
|
action | (cgid ? __BLK_TN_CGROUP : 0),
|
||||||
|
bt->dev, 0, cgid, cgid_len, (void *)data,
|
||||||
|
len);
|
||||||
|
trace_buffer_unlock_commit(blk_tr, buffer, event, trace_ctx);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bt->rchan)
|
if (!bt->rchan)
|
||||||
@@ -97,18 +130,11 @@ static void trace_note(struct blk_trace *bt, pid_t pid, int action,
|
|||||||
if (t) {
|
if (t) {
|
||||||
t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
|
t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
|
||||||
t->time = ktime_to_ns(ktime_get());
|
t->time = ktime_to_ns(ktime_get());
|
||||||
record_it:
|
|
||||||
t->device = bt->dev;
|
|
||||||
t->action = action | (cgid ? __BLK_TN_CGROUP : 0);
|
|
||||||
t->pid = pid;
|
|
||||||
t->cpu = cpu;
|
|
||||||
t->pdu_len = len + cgid_len;
|
|
||||||
if (cgid_len)
|
|
||||||
memcpy((void *)t + sizeof(*t), &cgid, cgid_len);
|
|
||||||
memcpy((void *) t + sizeof(*t) + cgid_len, data, len);
|
|
||||||
|
|
||||||
if (blk_tracer)
|
record_blktrace_event(t, pid, cpu, 0, 0,
|
||||||
trace_buffer_unlock_commit(blk_tr, buffer, event, trace_ctx);
|
action | (cgid ? __BLK_TN_CGROUP : 0),
|
||||||
|
bt->dev, 0, cgid, cgid_len, (void *)data,
|
||||||
|
len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -263,7 +289,12 @@ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes,
|
|||||||
if (!event)
|
if (!event)
|
||||||
return;
|
return;
|
||||||
t = ring_buffer_event_data(event);
|
t = ring_buffer_event_data(event);
|
||||||
goto record_it;
|
|
||||||
|
record_blktrace_event(t, pid, cpu, sector, bytes, what, bt->dev,
|
||||||
|
error, cgid, cgid_len, pdu_data, pdu_len);
|
||||||
|
|
||||||
|
trace_buffer_unlock_commit(blk_tr, buffer, event, trace_ctx);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(tsk->btrace_seq != blktrace_seq))
|
if (unlikely(tsk->btrace_seq != blktrace_seq))
|
||||||
@@ -282,32 +313,10 @@ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes,
|
|||||||
t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
|
t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
|
||||||
t->sequence = ++(*sequence);
|
t->sequence = ++(*sequence);
|
||||||
t->time = ktime_to_ns(ktime_get());
|
t->time = ktime_to_ns(ktime_get());
|
||||||
record_it:
|
|
||||||
/*
|
|
||||||
* These two are not needed in ftrace as they are in the
|
|
||||||
* generic trace_entry, filled by tracing_generic_entry_update,
|
|
||||||
* but for the trace_event->bin() synthesizer benefit we do it
|
|
||||||
* here too.
|
|
||||||
*/
|
|
||||||
t->cpu = cpu;
|
|
||||||
t->pid = pid;
|
|
||||||
|
|
||||||
t->sector = sector;
|
record_blktrace_event(t, pid, cpu, sector, bytes, what,
|
||||||
t->bytes = bytes;
|
bt->dev, error, cgid, cgid_len,
|
||||||
t->action = what;
|
pdu_data, pdu_len);
|
||||||
t->device = bt->dev;
|
|
||||||
t->error = error;
|
|
||||||
t->pdu_len = pdu_len + cgid_len;
|
|
||||||
|
|
||||||
if (cgid_len)
|
|
||||||
memcpy((void *)t + sizeof(*t), &cgid, cgid_len);
|
|
||||||
if (pdu_len)
|
|
||||||
memcpy((void *)t + sizeof(*t) + cgid_len, pdu_data, pdu_len);
|
|
||||||
|
|
||||||
if (blk_tracer) {
|
|
||||||
trace_buffer_unlock_commit(blk_tr, buffer, event, trace_ctx);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
|
|||||||
Reference in New Issue
Block a user