diff options
| -rw-r--r-- | include/linux/blktrace_api.h | 5 | ||||
| -rw-r--r-- | include/trace/events/block.h | 20 | ||||
| -rw-r--r-- | kernel/trace/blktrace.c | 21 |
3 files changed, 30 insertions, 16 deletions
diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h index 8c7c2de7631a..8e9e4bc6d73b 100644 --- a/include/linux/blktrace_api.h +++ b/include/linux/blktrace_api.h | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | enum blktrace_cat { | 14 | enum blktrace_cat { |
| 15 | BLK_TC_READ = 1 << 0, /* reads */ | 15 | BLK_TC_READ = 1 << 0, /* reads */ |
| 16 | BLK_TC_WRITE = 1 << 1, /* writes */ | 16 | BLK_TC_WRITE = 1 << 1, /* writes */ |
| 17 | BLK_TC_BARRIER = 1 << 2, /* barrier */ | 17 | BLK_TC_FLUSH = 1 << 2, /* flush */ |
| 18 | BLK_TC_SYNC = 1 << 3, /* sync IO */ | 18 | BLK_TC_SYNC = 1 << 3, /* sync IO */ |
| 19 | BLK_TC_SYNCIO = BLK_TC_SYNC, | 19 | BLK_TC_SYNCIO = BLK_TC_SYNC, |
| 20 | BLK_TC_QUEUE = 1 << 4, /* queueing/merging */ | 20 | BLK_TC_QUEUE = 1 << 4, /* queueing/merging */ |
| @@ -28,8 +28,9 @@ enum blktrace_cat { | |||
| 28 | BLK_TC_META = 1 << 12, /* metadata */ | 28 | BLK_TC_META = 1 << 12, /* metadata */ |
| 29 | BLK_TC_DISCARD = 1 << 13, /* discard requests */ | 29 | BLK_TC_DISCARD = 1 << 13, /* discard requests */ |
| 30 | BLK_TC_DRV_DATA = 1 << 14, /* binary per-driver data */ | 30 | BLK_TC_DRV_DATA = 1 << 14, /* binary per-driver data */ |
| 31 | BLK_TC_FUA = 1 << 15, /* fua requests */ | ||
| 31 | 32 | ||
| 32 | BLK_TC_END = 1 << 15, /* only 16-bits, reminder */ | 33 | BLK_TC_END = 1 << 15, /* we've run out of bits! */ |
| 33 | }; | 34 | }; |
| 34 | 35 | ||
| 35 | #define BLK_TC_SHIFT (16) | 36 | #define BLK_TC_SHIFT (16) |
diff --git a/include/trace/events/block.h b/include/trace/events/block.h index bf366547da25..05c5e61f0a7c 100644 --- a/include/trace/events/block.h +++ b/include/trace/events/block.h | |||
| @@ -8,6 +8,8 @@ | |||
| 8 | #include <linux/blkdev.h> | 8 | #include <linux/blkdev.h> |
| 9 | #include <linux/tracepoint.h> | 9 | #include <linux/tracepoint.h> |
| 10 | 10 | ||
| 11 | #define RWBS_LEN 8 | ||
| 12 | |||
| 11 | DECLARE_EVENT_CLASS(block_rq_with_error, | 13 | DECLARE_EVENT_CLASS(block_rq_with_error, |
| 12 | 14 | ||
| 13 | TP_PROTO(struct request_queue *q, struct request *rq), | 15 | TP_PROTO(struct request_queue *q, struct request *rq), |
| @@ -19,7 +21,7 @@ DECLARE_EVENT_CLASS(block_rq_with_error, | |||
| 19 | __field( sector_t, sector ) | 21 | __field( sector_t, sector ) |
| 20 | __field( unsigned int, nr_sector ) | 22 | __field( unsigned int, nr_sector ) |
| 21 | __field( int, errors ) | 23 | __field( int, errors ) |
| 22 | __array( char, rwbs, 6 ) | 24 | __array( char, rwbs, RWBS_LEN ) |
| 23 | __dynamic_array( char, cmd, blk_cmd_buf_len(rq) ) | 25 | __dynamic_array( char, cmd, blk_cmd_buf_len(rq) ) |
| 24 | ), | 26 | ), |
| 25 | 27 | ||
| @@ -104,7 +106,7 @@ DECLARE_EVENT_CLASS(block_rq, | |||
| 104 | __field( sector_t, sector ) | 106 | __field( sector_t, sector ) |
| 105 | __field( unsigned int, nr_sector ) | 107 | __field( unsigned int, nr_sector ) |
| 106 | __field( unsigned int, bytes ) | 108 | __field( unsigned int, bytes ) |
| 107 | __array( char, rwbs, 6 ) | 109 | __array( char, rwbs, RWBS_LEN ) |
| 108 | __array( char, comm, TASK_COMM_LEN ) | 110 | __array( char, comm, TASK_COMM_LEN ) |
| 109 | __dynamic_array( char, cmd, blk_cmd_buf_len(rq) ) | 111 | __dynamic_array( char, cmd, blk_cmd_buf_len(rq) ) |
| 110 | ), | 112 | ), |
| @@ -183,7 +185,7 @@ TRACE_EVENT(block_bio_bounce, | |||
| 183 | __field( dev_t, dev ) | 185 | __field( dev_t, dev ) |
| 184 | __field( sector_t, sector ) | 186 | __field( sector_t, sector ) |
| 185 | __field( unsigned int, nr_sector ) | 187 | __field( unsigned int, nr_sector ) |
| 186 | __array( char, rwbs, 6 ) | 188 | __array( char, rwbs, RWBS_LEN ) |
| 187 | __array( char, comm, TASK_COMM_LEN ) | 189 | __array( char, comm, TASK_COMM_LEN ) |
| 188 | ), | 190 | ), |
| 189 | 191 | ||
| @@ -222,7 +224,7 @@ TRACE_EVENT(block_bio_complete, | |||
| 222 | __field( sector_t, sector ) | 224 | __field( sector_t, sector ) |
| 223 | __field( unsigned, nr_sector ) | 225 | __field( unsigned, nr_sector ) |
| 224 | __field( int, error ) | 226 | __field( int, error ) |
| 225 | __array( char, rwbs, 6 ) | 227 | __array( char, rwbs, RWBS_LEN) |
| 226 | ), | 228 | ), |
| 227 | 229 | ||
| 228 | TP_fast_assign( | 230 | TP_fast_assign( |
| @@ -249,7 +251,7 @@ DECLARE_EVENT_CLASS(block_bio, | |||
| 249 | __field( dev_t, dev ) | 251 | __field( dev_t, dev ) |
| 250 | __field( sector_t, sector ) | 252 | __field( sector_t, sector ) |
| 251 | __field( unsigned int, nr_sector ) | 253 | __field( unsigned int, nr_sector ) |
| 252 | __array( char, rwbs, 6 ) | 254 | __array( char, rwbs, RWBS_LEN ) |
| 253 | __array( char, comm, TASK_COMM_LEN ) | 255 | __array( char, comm, TASK_COMM_LEN ) |
| 254 | ), | 256 | ), |
| 255 | 257 | ||
| @@ -321,7 +323,7 @@ DECLARE_EVENT_CLASS(block_get_rq, | |||
| 321 | __field( dev_t, dev ) | 323 | __field( dev_t, dev ) |
| 322 | __field( sector_t, sector ) | 324 | __field( sector_t, sector ) |
| 323 | __field( unsigned int, nr_sector ) | 325 | __field( unsigned int, nr_sector ) |
| 324 | __array( char, rwbs, 6 ) | 326 | __array( char, rwbs, RWBS_LEN ) |
| 325 | __array( char, comm, TASK_COMM_LEN ) | 327 | __array( char, comm, TASK_COMM_LEN ) |
| 326 | ), | 328 | ), |
| 327 | 329 | ||
| @@ -456,7 +458,7 @@ TRACE_EVENT(block_split, | |||
| 456 | __field( dev_t, dev ) | 458 | __field( dev_t, dev ) |
| 457 | __field( sector_t, sector ) | 459 | __field( sector_t, sector ) |
| 458 | __field( sector_t, new_sector ) | 460 | __field( sector_t, new_sector ) |
| 459 | __array( char, rwbs, 6 ) | 461 | __array( char, rwbs, RWBS_LEN ) |
| 460 | __array( char, comm, TASK_COMM_LEN ) | 462 | __array( char, comm, TASK_COMM_LEN ) |
| 461 | ), | 463 | ), |
| 462 | 464 | ||
| @@ -498,7 +500,7 @@ TRACE_EVENT(block_bio_remap, | |||
| 498 | __field( unsigned int, nr_sector ) | 500 | __field( unsigned int, nr_sector ) |
| 499 | __field( dev_t, old_dev ) | 501 | __field( dev_t, old_dev ) |
| 500 | __field( sector_t, old_sector ) | 502 | __field( sector_t, old_sector ) |
| 501 | __array( char, rwbs, 6 ) | 503 | __array( char, rwbs, RWBS_LEN) |
| 502 | ), | 504 | ), |
| 503 | 505 | ||
| 504 | TP_fast_assign( | 506 | TP_fast_assign( |
| @@ -542,7 +544,7 @@ TRACE_EVENT(block_rq_remap, | |||
| 542 | __field( unsigned int, nr_sector ) | 544 | __field( unsigned int, nr_sector ) |
| 543 | __field( dev_t, old_dev ) | 545 | __field( dev_t, old_dev ) |
| 544 | __field( sector_t, old_sector ) | 546 | __field( sector_t, old_sector ) |
| 545 | __array( char, rwbs, 6 ) | 547 | __array( char, rwbs, RWBS_LEN) |
| 546 | ), | 548 | ), |
| 547 | 549 | ||
| 548 | TP_fast_assign( | 550 | TP_fast_assign( |
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index 6957aa298dfa..7c910a5593a6 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c | |||
| @@ -206,6 +206,8 @@ static void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes, | |||
| 206 | what |= MASK_TC_BIT(rw, RAHEAD); | 206 | what |= MASK_TC_BIT(rw, RAHEAD); |
| 207 | what |= MASK_TC_BIT(rw, META); | 207 | what |= MASK_TC_BIT(rw, META); |
| 208 | what |= MASK_TC_BIT(rw, DISCARD); | 208 | what |= MASK_TC_BIT(rw, DISCARD); |
| 209 | what |= MASK_TC_BIT(rw, FLUSH); | ||
| 210 | what |= MASK_TC_BIT(rw, FUA); | ||
| 209 | 211 | ||
| 210 | pid = tsk->pid; | 212 | pid = tsk->pid; |
| 211 | if (act_log_check(bt, what, sector, pid)) | 213 | if (act_log_check(bt, what, sector, pid)) |
| @@ -1054,6 +1056,9 @@ static void fill_rwbs(char *rwbs, const struct blk_io_trace *t) | |||
| 1054 | goto out; | 1056 | goto out; |
| 1055 | } | 1057 | } |
| 1056 | 1058 | ||
| 1059 | if (tc & BLK_TC_FLUSH) | ||
| 1060 | rwbs[i++] = 'F'; | ||
| 1061 | |||
| 1057 | if (tc & BLK_TC_DISCARD) | 1062 | if (tc & BLK_TC_DISCARD) |
| 1058 | rwbs[i++] = 'D'; | 1063 | rwbs[i++] = 'D'; |
| 1059 | else if (tc & BLK_TC_WRITE) | 1064 | else if (tc & BLK_TC_WRITE) |
| @@ -1063,10 +1068,10 @@ static void fill_rwbs(char *rwbs, const struct blk_io_trace *t) | |||
| 1063 | else | 1068 | else |
| 1064 | rwbs[i++] = 'N'; | 1069 | rwbs[i++] = 'N'; |
| 1065 | 1070 | ||
| 1071 | if (tc & BLK_TC_FUA) | ||
| 1072 | rwbs[i++] = 'F'; | ||
| 1066 | if (tc & BLK_TC_AHEAD) | 1073 | if (tc & BLK_TC_AHEAD) |
| 1067 | rwbs[i++] = 'A'; | 1074 | rwbs[i++] = 'A'; |
| 1068 | if (tc & BLK_TC_BARRIER) | ||
| 1069 | rwbs[i++] = 'B'; | ||
| 1070 | if (tc & BLK_TC_SYNC) | 1075 | if (tc & BLK_TC_SYNC) |
| 1071 | rwbs[i++] = 'S'; | 1076 | rwbs[i++] = 'S'; |
| 1072 | if (tc & BLK_TC_META) | 1077 | if (tc & BLK_TC_META) |
| @@ -1132,7 +1137,7 @@ typedef int (blk_log_action_t) (struct trace_iterator *iter, const char *act); | |||
| 1132 | 1137 | ||
| 1133 | static int blk_log_action_classic(struct trace_iterator *iter, const char *act) | 1138 | static int blk_log_action_classic(struct trace_iterator *iter, const char *act) |
| 1134 | { | 1139 | { |
| 1135 | char rwbs[6]; | 1140 | char rwbs[RWBS_LEN]; |
| 1136 | unsigned long long ts = iter->ts; | 1141 | unsigned long long ts = iter->ts; |
| 1137 | unsigned long nsec_rem = do_div(ts, NSEC_PER_SEC); | 1142 | unsigned long nsec_rem = do_div(ts, NSEC_PER_SEC); |
| 1138 | unsigned secs = (unsigned long)ts; | 1143 | unsigned secs = (unsigned long)ts; |
| @@ -1148,7 +1153,7 @@ static int blk_log_action_classic(struct trace_iterator *iter, const char *act) | |||
| 1148 | 1153 | ||
| 1149 | static int blk_log_action(struct trace_iterator *iter, const char *act) | 1154 | static int blk_log_action(struct trace_iterator *iter, const char *act) |
| 1150 | { | 1155 | { |
| 1151 | char rwbs[6]; | 1156 | char rwbs[RWBS_LEN]; |
| 1152 | const struct blk_io_trace *t = te_blk_io_trace(iter->ent); | 1157 | const struct blk_io_trace *t = te_blk_io_trace(iter->ent); |
| 1153 | 1158 | ||
| 1154 | fill_rwbs(rwbs, t); | 1159 | fill_rwbs(rwbs, t); |
| @@ -1561,7 +1566,7 @@ static const struct { | |||
| 1561 | } mask_maps[] = { | 1566 | } mask_maps[] = { |
| 1562 | { BLK_TC_READ, "read" }, | 1567 | { BLK_TC_READ, "read" }, |
| 1563 | { BLK_TC_WRITE, "write" }, | 1568 | { BLK_TC_WRITE, "write" }, |
| 1564 | { BLK_TC_BARRIER, "barrier" }, | 1569 | { BLK_TC_FLUSH, "flush" }, |
| 1565 | { BLK_TC_SYNC, "sync" }, | 1570 | { BLK_TC_SYNC, "sync" }, |
| 1566 | { BLK_TC_QUEUE, "queue" }, | 1571 | { BLK_TC_QUEUE, "queue" }, |
| 1567 | { BLK_TC_REQUEUE, "requeue" }, | 1572 | { BLK_TC_REQUEUE, "requeue" }, |
| @@ -1573,6 +1578,7 @@ static const struct { | |||
| 1573 | { BLK_TC_META, "meta" }, | 1578 | { BLK_TC_META, "meta" }, |
| 1574 | { BLK_TC_DISCARD, "discard" }, | 1579 | { BLK_TC_DISCARD, "discard" }, |
| 1575 | { BLK_TC_DRV_DATA, "drv_data" }, | 1580 | { BLK_TC_DRV_DATA, "drv_data" }, |
| 1581 | { BLK_TC_FUA, "fua" }, | ||
| 1576 | }; | 1582 | }; |
| 1577 | 1583 | ||
| 1578 | static int blk_trace_str2mask(const char *str) | 1584 | static int blk_trace_str2mask(const char *str) |
| @@ -1788,6 +1794,9 @@ void blk_fill_rwbs(char *rwbs, u32 rw, int bytes) | |||
| 1788 | { | 1794 | { |
| 1789 | int i = 0; | 1795 | int i = 0; |
| 1790 | 1796 | ||
| 1797 | if (rw & REQ_FLUSH) | ||
| 1798 | rwbs[i++] = 'F'; | ||
| 1799 | |||
| 1791 | if (rw & WRITE) | 1800 | if (rw & WRITE) |
| 1792 | rwbs[i++] = 'W'; | 1801 | rwbs[i++] = 'W'; |
| 1793 | else if (rw & REQ_DISCARD) | 1802 | else if (rw & REQ_DISCARD) |
| @@ -1797,6 +1806,8 @@ void blk_fill_rwbs(char *rwbs, u32 rw, int bytes) | |||
| 1797 | else | 1806 | else |
| 1798 | rwbs[i++] = 'N'; | 1807 | rwbs[i++] = 'N'; |
| 1799 | 1808 | ||
| 1809 | if (rw & REQ_FUA) | ||
| 1810 | rwbs[i++] = 'F'; | ||
| 1800 | if (rw & REQ_RAHEAD) | 1811 | if (rw & REQ_RAHEAD) |
| 1801 | rwbs[i++] = 'A'; | 1812 | rwbs[i++] = 'A'; |
| 1802 | if (rw & REQ_SYNC) | 1813 | if (rw & REQ_SYNC) |
