Commit 48b77ad6 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe

block: cleanup tracing

A couple tweaks to the tracing code:

 - trace the request size for all requests
 - trace request sector and nr_sectors only for fs requests, enforced by
   helpers
 - drop SCSI CDB tracing - we have SCSI tracing for this and are going
   to me the CDB out of the generic struct request soon.

With this the tracing code stops to know about BLOCK_PC requests entirely,
it's just FS vs passthrough requests now, where the latter includes any
driver-private requests.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent 6d247d7f
...@@ -110,16 +110,16 @@ struct compat_blk_user_trace_setup { ...@@ -110,16 +110,16 @@ struct compat_blk_user_trace_setup {
#endif #endif
#if defined(CONFIG_EVENT_TRACING) && defined(CONFIG_BLOCK) extern void blk_fill_rwbs(char *rwbs, unsigned int op, int bytes);
static inline int blk_cmd_buf_len(struct request *rq) static inline sector_t blk_rq_trace_sector(struct request *rq)
{ {
return (rq->cmd_type == REQ_TYPE_BLOCK_PC) ? rq->cmd_len * 3 : 1; return (rq->cmd_type != REQ_TYPE_FS) ? 0 : blk_rq_pos(rq);
} }
extern void blk_dump_cmd(char *buf, struct request *rq); static inline unsigned int blk_rq_trace_nr_sectors(struct request *rq)
extern void blk_fill_rwbs(char *rwbs, unsigned int op, int bytes); {
return (rq->cmd_type != REQ_TYPE_FS) ? 0 : blk_rq_sectors(rq);
#endif /* CONFIG_EVENT_TRACING && CONFIG_BLOCK */ }
#endif #endif
...@@ -73,19 +73,17 @@ DECLARE_EVENT_CLASS(block_rq_with_error, ...@@ -73,19 +73,17 @@ DECLARE_EVENT_CLASS(block_rq_with_error,
__field( unsigned int, nr_sector ) __field( unsigned int, nr_sector )
__field( int, errors ) __field( int, errors )
__array( char, rwbs, RWBS_LEN ) __array( char, rwbs, RWBS_LEN )
__dynamic_array( char, cmd, blk_cmd_buf_len(rq) ) __dynamic_array( char, cmd, 1 )
), ),
TP_fast_assign( TP_fast_assign(
__entry->dev = rq->rq_disk ? disk_devt(rq->rq_disk) : 0; __entry->dev = rq->rq_disk ? disk_devt(rq->rq_disk) : 0;
__entry->sector = (rq->cmd_type == REQ_TYPE_BLOCK_PC) ? __entry->sector = blk_rq_trace_sector(rq);
0 : blk_rq_pos(rq); __entry->nr_sector = blk_rq_trace_nr_sectors(rq);
__entry->nr_sector = (rq->cmd_type == REQ_TYPE_BLOCK_PC) ?
0 : blk_rq_sectors(rq);
__entry->errors = rq->errors; __entry->errors = rq->errors;
blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq));
blk_dump_cmd(__get_str(cmd), rq); __get_str(cmd)[0] = '\0';
), ),
TP_printk("%d,%d %s (%s) %llu + %u [%d]", TP_printk("%d,%d %s (%s) %llu + %u [%d]",
...@@ -153,7 +151,7 @@ TRACE_EVENT(block_rq_complete, ...@@ -153,7 +151,7 @@ TRACE_EVENT(block_rq_complete,
__field( unsigned int, nr_sector ) __field( unsigned int, nr_sector )
__field( int, errors ) __field( int, errors )
__array( char, rwbs, RWBS_LEN ) __array( char, rwbs, RWBS_LEN )
__dynamic_array( char, cmd, blk_cmd_buf_len(rq) ) __dynamic_array( char, cmd, 1 )
), ),
TP_fast_assign( TP_fast_assign(
...@@ -163,7 +161,7 @@ TRACE_EVENT(block_rq_complete, ...@@ -163,7 +161,7 @@ TRACE_EVENT(block_rq_complete,
__entry->errors = rq->errors; __entry->errors = rq->errors;
blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, nr_bytes); blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, nr_bytes);
blk_dump_cmd(__get_str(cmd), rq); __get_str(cmd)[0] = '\0';
), ),
TP_printk("%d,%d %s (%s) %llu + %u [%d]", TP_printk("%d,%d %s (%s) %llu + %u [%d]",
...@@ -186,20 +184,17 @@ DECLARE_EVENT_CLASS(block_rq, ...@@ -186,20 +184,17 @@ DECLARE_EVENT_CLASS(block_rq,
__field( unsigned int, bytes ) __field( unsigned int, bytes )
__array( char, rwbs, RWBS_LEN ) __array( char, rwbs, RWBS_LEN )
__array( char, comm, TASK_COMM_LEN ) __array( char, comm, TASK_COMM_LEN )
__dynamic_array( char, cmd, blk_cmd_buf_len(rq) ) __dynamic_array( char, cmd, 1 )
), ),
TP_fast_assign( TP_fast_assign(
__entry->dev = rq->rq_disk ? disk_devt(rq->rq_disk) : 0; __entry->dev = rq->rq_disk ? disk_devt(rq->rq_disk) : 0;
__entry->sector = (rq->cmd_type == REQ_TYPE_BLOCK_PC) ? __entry->sector = blk_rq_trace_sector(rq);
0 : blk_rq_pos(rq); __entry->nr_sector = blk_rq_trace_nr_sectors(rq);
__entry->nr_sector = (rq->cmd_type == REQ_TYPE_BLOCK_PC) ? __entry->bytes = blk_rq_bytes(rq);
0 : blk_rq_sectors(rq);
__entry->bytes = (rq->cmd_type == REQ_TYPE_BLOCK_PC) ?
blk_rq_bytes(rq) : 0;
blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq));
blk_dump_cmd(__get_str(cmd), rq); __get_str(cmd)[0] = '\0';
memcpy(__entry->comm, current->comm, TASK_COMM_LEN); memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
), ),
......
...@@ -712,15 +712,13 @@ static void blk_add_trace_rq(struct request_queue *q, struct request *rq, ...@@ -712,15 +712,13 @@ static void blk_add_trace_rq(struct request_queue *q, struct request *rq,
if (likely(!bt)) if (likely(!bt))
return; return;
if (rq->cmd_type == REQ_TYPE_BLOCK_PC) { if (rq->cmd_type != REQ_TYPE_FS)
what |= BLK_TC_ACT(BLK_TC_PC); what |= BLK_TC_ACT(BLK_TC_PC);
__blk_add_trace(bt, 0, nr_bytes, req_op(rq), rq->cmd_flags, else
what, rq->errors, rq->cmd_len, rq->cmd);
} else {
what |= BLK_TC_ACT(BLK_TC_FS); what |= BLK_TC_ACT(BLK_TC_FS);
__blk_add_trace(bt, blk_rq_pos(rq), nr_bytes, req_op(rq),
rq->cmd_flags, what, rq->errors, 0, NULL); __blk_add_trace(bt, blk_rq_trace_sector(rq), nr_bytes, req_op(rq),
} rq->cmd_flags, what, rq->errors, 0, NULL);
} }
static void blk_add_trace_rq_abort(void *ignore, static void blk_add_trace_rq_abort(void *ignore,
...@@ -972,11 +970,7 @@ void blk_add_driver_data(struct request_queue *q, ...@@ -972,11 +970,7 @@ void blk_add_driver_data(struct request_queue *q,
if (likely(!bt)) if (likely(!bt))
return; return;
if (rq->cmd_type == REQ_TYPE_BLOCK_PC) __blk_add_trace(bt, blk_rq_trace_sector(rq), blk_rq_bytes(rq), 0, 0,
__blk_add_trace(bt, 0, blk_rq_bytes(rq), 0, 0,
BLK_TA_DRV_DATA, rq->errors, len, data);
else
__blk_add_trace(bt, blk_rq_pos(rq), blk_rq_bytes(rq), 0, 0,
BLK_TA_DRV_DATA, rq->errors, len, data); BLK_TA_DRV_DATA, rq->errors, len, data);
} }
EXPORT_SYMBOL_GPL(blk_add_driver_data); EXPORT_SYMBOL_GPL(blk_add_driver_data);
...@@ -1752,31 +1746,6 @@ void blk_trace_remove_sysfs(struct device *dev) ...@@ -1752,31 +1746,6 @@ void blk_trace_remove_sysfs(struct device *dev)
#ifdef CONFIG_EVENT_TRACING #ifdef CONFIG_EVENT_TRACING
void blk_dump_cmd(char *buf, struct request *rq)
{
int i, end;
int len = rq->cmd_len;
unsigned char *cmd = rq->cmd;
if (rq->cmd_type != REQ_TYPE_BLOCK_PC) {
buf[0] = '\0';
return;
}
for (end = len - 1; end >= 0; end--)
if (cmd[end])
break;
end++;
for (i = 0; i < len; i++) {
buf += sprintf(buf, "%s%02x", i == 0 ? "" : " ", cmd[i]);
if (i == end && end != len - 1) {
sprintf(buf, " ..");
break;
}
}
}
void blk_fill_rwbs(char *rwbs, unsigned int op, int bytes) void blk_fill_rwbs(char *rwbs, unsigned int op, int bytes)
{ {
int i = 0; int i = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment