Recent changes (master)
The following changes since commit 9b24b42ef59d2e8015957db3dd70ffedb7ebcfe8:
Update git tree references (2025-12-10 23:53:45 -0700)
are available in the Git repository at:
git://git.kernel.dk/blktrace.git master
for you to fetch changes up to b3015a35bd6332dfead81aa29fed5b8a6567036f:
iowatcher/main: remove written only variable (2026-10-02 08:24:58 -0600)
----------------------------------------------------------------
Jens Axboe (1):
iowatcher/main: remove written only variable
Johannes Thumshirn (11):
btt: use blk_io_trace2 internally
btt: natively parse blk_io_trace2
blktrace: add option to request a specific trace protocol version
blkrawverify: use blk_io_trace2 internally
blkrawverify: natively parse blk_io_trace2
blkiomon: use blk_io_trace2 internally
blkiomon: natively parse blk_io_trace2
iowatcher: use blk_io_trace2 internally
iowatcher: natively parse blk_io_trace2
btreplay: support blk_io_trace2 in btrecord
blkparse: add option to emit a specific trace protocol version
blkiomon.c | 93 +++++++++++++++++++++++--------- blkparse.c | 64 +++++++++++++++++++--- blkrawverify.c | 69 ++++++++++++++++++------ blktrace.c | 24 ++++++++- blktrace.h | 20 +++++++ btreplay/btrecord.c | 83 ++++++++++++++++++++++------ btt/globals.h | 4 +- btt/mmap.c | 134 ++++++++++++++++++++++++++++++++++++++++++--- doc/blkparse.1 | 7 +++ doc/blktrace.8 | 7 +++ iowatcher/blkparse.c | 150 ++++++++++++++++++++++++++++++++++++++------------- iowatcher/blkparse.h | 3 +- iowatcher/main.c | 2 - 13 files changed, 543 insertions(+), 117 deletions(-)
---
Diff of recent changes:
blkiomon.c +68 -25
@@ -42,7 +42,7 @@#include "blkiomon.h" struct trace { -struct blk_io_trace bit; +struct blk_io_trace2 bit;struct rb_node node;struct trace *next;long sequence;
@@ -105,7 +105,7 @@ static long leftover = 0, driverdata = 0, match = 0, mismatch = 0, sequence = 0;static void dump_bit (struct trace *t,const char *descr) { -struct blk_io_trace *bit = &t->bit; +struct blk_io_trace2 *bit = &t->bit;if (!debug.fn)return ;
@@ -116,7 +116,7 @@ static void dump_bit(struct trace *t, const char *descr)fprintf (debug.fp,"time %16ld\n" , (unsigned long )bit->time);fprintf (debug.fp,"sector %16ld\n" , (unsigned long )bit->sector);fprintf (debug.fp,"bytes %16d\n" , bit->bytes); -fprintf (debug.fp,"action %16x\n" , bit->action); +fprintf (debug.fp,"action %16llx\n" , (unsigned long long )bit->action);fprintf (debug.fp,"pid %16d\n" , bit->pid);fprintf (debug.fp,"device %16d\n" , bit->device);fprintf (debug.fp,"cpu %16d\n" , bit->cpu);
@@ -128,8 +128,8 @@ static void dump_bit(struct trace *t, const char *descr)static void dump_bits (struct trace *t1,struct trace *t2,const char *descr) { -struct blk_io_trace *bit1 = &t1->bit; -struct blk_io_trace *bit2 = &t2->bit; +struct blk_io_trace2 *bit1 = &t1->bit; +struct blk_io_trace2 *bit2 = &t2->bit;if (!debug.fn)return ;
@@ -143,7 +143,9 @@ static void dump_bits(struct trace *t1, struct trace *t2, const char *descr)fprintf (debug.fp,"sector %16ld %16ld\n" , (unsigned long )bit1->sector, (unsigned long )bit2->sector);fprintf (debug.fp,"bytes %16d %16d\n" , bit1->bytes, bit2->bytes); -fprintf (debug.fp,"action %16x %16x\n" , bit1->action, bit2->action); +fprintf (debug.fp,"action %16llx %16llx\n" , + (unsigned long long )bit1->action, + (unsigned long long )bit2->action);fprintf (debug.fp,"pid %16d %16d\n" , bit1->pid, bit2->pid);fprintf (debug.fp,"device %16d %16d\n" , bit1->device, bit2->device);fprintf (debug.fp,"cpu %16d %16d\n" , bit1->cpu, bit2->cpu);
@@ -305,8 +307,8 @@ static void *blkiomon_interval(void *data)#define BLK_DATADIR (a) (((a) >> BLK_TC_SHIFT) & (BLK_TC_READ | BLK_TC_WRITE)) -static int blkiomon_account (struct blk_io_trace *bit_d, -struct blk_io_trace *bit_c) +static int blkiomon_account (struct blk_io_trace2 *bit_d, +struct blk_io_trace2 *bit_c) {struct dstat *dstat;struct blkiomon_stat *p;
@@ -371,7 +373,7 @@ static void blkiomon_store_trace(struct trace *t) thash[i] = t; } -static struct trace *blkiomon_fetch_trace (struct blk_io_trace *bit) +static struct trace *blkiomon_fetch_trace (struct blk_io_trace2 *bit) {int i = bit->sector %TRACE_HASH_SIZE ;struct trace *t, *prev =NULL ;
@@ -428,7 +430,7 @@ static struct trace *blkiomon_do_trace(struct trace *t)return t_old; } -static int blkiomon_dump_drvdata (struct blk_io_trace *bit,void *pdu_buf) +static int blkiomon_dump_drvdata (struct blk_io_trace2 *bit,void *pdu_buf) {if (!drvdata.fn)return 0 ;
@@ -451,8 +453,10 @@ failed:static int blkiomon_do_fifo (void ) {struct trace *t; -struct blk_io_trace *bit; +struct blk_io_trace2 *bit; +struct blk_io_trace bit1;void *pdu_buf =NULL ; +void *p; t =blkiomon_alloc_trace ();if (!t)
@@ -461,6 +465,7 @@ static int blkiomon_do_fifo(void)while (up) {__u32 magic; +int version;if (fread (&magic,sizeof (magic),1 , ifp) !=1 ) {if (!feof (ifp))
@@ -468,26 +473,64 @@ static int blkiomon_do_fifo(void) "blkiomon: could not read trace");break ; } -if (fread (bit,sizeof (*bit),1 , ifp) !=1 ) { -if (!feof (ifp)) -fprintf (stderr, -"blkiomon: could not read trace" ); -break ; - } - bit->magic = magic; -if (ferror (ifp)) { -clearerr (ifp); -fprintf (stderr,"blkiomon: error while reading trace" ); -break ; - }if (data_is_native ==-1 &&check_data_endianness (magic)) {fprintf (stderr,"blkiomon: endianess problem\n" );break ; } -/* endianess */ -bit_trace_to_cpu (bit); + version = (data_is_native ? magic :be32_to_cpu (magic)) &0xff ; + +if (version ==SUPPORTED_VERSION2 ) { + bit->magic = magic; + p = (void *) ((u8 *)bit +sizeof (__u32)); +if (fread (p,sizeof (*bit) -sizeof (__u32),1 , ifp) !=1 ) { +if (!feof (ifp)) +fprintf (stderr, +"blkiomon: could not read trace" ); +break ; + } +if (ferror (ifp)) { +clearerr (ifp); +fprintf (stderr, +"blkiomon: error while reading trace" ); +break ; + } + +/* endianess */ +bit2_trace_to_cpu (bit); + }else { + bit1.magic = magic; + p = (void *) ((u8 *)&bit1 +sizeof (__u32)); +if (fread (p,sizeof (bit1) -sizeof (__u32),1 , ifp) !=1 ) { +if (!feof (ifp)) +fprintf (stderr, +"blkiomon: could not read trace" ); +break ; + } +if (ferror (ifp)) { +clearerr (ifp); +fprintf (stderr, +"blkiomon: error while reading trace" ); +break ; + } + +/* endianess */ +bit_trace_to_cpu (&bit1); + + bit->magic = bit1.magic; + bit->sequence = bit1.sequence; + bit->time = bit1.time; + bit->sector = bit1.sector; + bit->bytes = bit1.bytes; + bit->action = bit1.action; + bit->pid = bit1.pid; + bit->device = bit1.device; + bit->cpu = bit1.cpu; + bit->error = bit1.error; + bit->pdu_len = bit1.pdu_len; + } +if (verify_trace (bit->magic)) {fprintf (stderr,"blkiomon: bad trace\n" );break ;
blkparse.c +56 -8
108 lines not on this page · raw message
blkrawverify.c +53 -16
119 lines not on this page · raw message
blktrace.c +22 -2
@@ -283,6 +283,7 @@ static unsigned long long act_mask = ~0U;static int kill_running_trace;static int stop_watch;static int piped_output; +static int trace_ver;static char *debugfs_path ="/sys/kernel/debug" ;static char *output_name;
@@ -329,6 +330,10 @@ static int *cl_fds;static int (*handle_pfds)(struct tracer *,int ,int );static int (*handle_list)(struct tracer_devpath_head *,struct list_head *); +enum { +OPT_TRACE_VERSION =256 , +}; +#define S_OPTS "d:a:A:r:o:kw:vVb:n:D:lh:p:sI:"static struct option l_opts[] = { {
@@ -433,6 +438,12 @@ static struct option l_opts[] = { .flag = NULL, .val = 's' }, + { + .name = "trace-version", + .has_arg = required_argument, + .flag = NULL, + .val = OPT_TRACE_VERSION + }, { .name = NULL, }
@@ -455,6 +466,7 @@ static char usage_str[] = "\n\n" \"[ -I <devs file> | --input-devs=<devs file>]\n" \"[ -v <version> | --version]\n" \"[ -V <version> | --version]\n" \ +"[ --trace-version=<1|2> ]\n" \"\t-d Use specified device. May also be given last after options\n" \"\t-r Path to mounted debugfs, defaults to /sys/kernel/debug\n" \
@@ -471,7 +483,8 @@ static char usage_str[] = "\n\n" \"\t-s Make the network client NOT use sendfile() to transfer data\n" \"\t-I Add devices found in <devs file>\n" \"\t-v Print program version info\n" \ -"\t-V Print program version info\n\n" ; +"\t-V Print program version info\n" \ +"\t--trace-version Request trace protocol version 1 or 2 from the kernel\n\n" ;static void clear_events (struct pollfd *pfd) {
@@ -2244,6 +2257,13 @@ static int handle_args(int argc, char *argv[])case 's' : net_use_sendfile =0 ;break ; +case OPT_TRACE_VERSION : + trace_ver =atoi (optarg); +if (trace_ver !=1 && trace_ver !=2 ) { +show_usage (argv[0 ]); +exit (1 ); + } +break ;default :show_usage (argv[0 ]);exit (1 );
@@ -2714,7 +2734,7 @@ static int run_tracers(void)if (net_mode == Net_client)printf ("blktrace: connecting to %s\n" , hostname); -if (setup_buts2 ()) { +if (trace_ver ==1 ||setup_buts2 ()) {if (setup_buts ()) { done =1 ;return 1 ;
blktrace.h +20 -0
@@ -129,6 +129,26 @@ static inline void bit_to_bit2(struct blk_io_trace *old, old->pdu_len); } +static inline void bit2_to_bit (struct blk_io_trace2 *new, +struct blk_io_trace *old) +{ + old->magic =BLK_IO_TRACE_MAGIC |BLK_IO_TRACE_VERSION ; + old->sequence = new->sequence; + old->time = new->time; + old->sector = new->sector; + old->bytes = new->bytes; + old->action = new->action; + old->pid = new->pid; + old->device = new->device; + old->cpu = new->cpu; + old->error = new->error; + old->pdu_len = new->pdu_len; + +if (old->pdu_len) +memcpy (((u8 *) old +sizeof (*old)), ((u8 *)new +sizeof (*new)), + new->pdu_len); +} +static inline void bit2_trace_to_cpu (struct blk_io_trace2 *t) {if (data_is_native)
btreplay/btrecord.c +67 -16
115 lines not on this page · raw message
btt/globals.h +2 -2
@@ -158,7 +158,7 @@ struct io {__u64 s_time;__u32 d_nsec, c_nsec; -struct blk_io_trace t; +struct blk_io_trace2 t;int linked;enum iop_type type;
@@ -260,7 +260,7 @@ void clean_allocs(void);/* mmap.c */ void setup_ifile (char *fname);void cleanup_ifile (void ); -int next_trace (struct blk_io_trace *t,void **pdu); +int next_trace (struct blk_io_trace2 *t,void **pdu);double pct_done (void );/* output.c */
btt/mmap.c +127 -7
178 lines not on this page · raw message
doc/blkparse.1 +7 -0
@@ -151,6 +151,13 @@ Do \fInot\fR produce text output, used for binary (\fB\-d\fR) only Binary output file .RE +\-\-trace\-version=\fI1|2\fR +.RS +Selects the trace protocol version of the binary output file (\fB\-d\fR). +Version 1 emits the legacy \fBstruct blk_io_trace\fR, while version 2 (the +default) emits \fBstruct blk_io_trace2\fR. +.RE + \-q .br \-\-quiet
doc/blktrace.8 +7 -0
@@ -191,6 +191,13 @@ Outputs version Sets run time to the number of seconds specified .RE +\-\-trace\-version=\fI1|2\fR +.RS +Selects the trace protocol version requested from the kernel. Requesting +version 1 forces blktrace to use the old \fBBLKTRACESETUP\fR ioctl, while +version 2 (the default) uses \fBBLKTRACESETUP2\fR. +.RE + .SH FILTER MASKS The following masks may be passed with the \fI\-a\fR command line
iowatcher/blkparse.c +112 -38
267 lines not on this page · raw message
iowatcher/blkparse.h +2 -1
@@ -39,7 +39,8 @@ struct trace {u64 len;char *start;char *cur; -struct blk_io_trace *io; +int version; +struct blk_io_trace2 *io;u64 start_timestamp;struct timespec abs_start_time;
iowatcher/main.c +0 -2
@@ -897,7 +897,6 @@ static void plot_cpu(struct plot *plot, unsigned int max_seconds, char *label,char *color;double avg =0 ;int ymax; -int plotted =0 ;if (active_graphs[active_index] ==0 )return ;
@@ -971,7 +970,6 @@ static void plot_cpu(struct plot *plot, unsigned int max_seconds, char *label,svg_line_graph (plot, gld, color, avg +30 ,95 );snprintf (line, line_len," CPU %d\n" , i -1 );svg_add_legend (plot, tf->label, line, color); - plotted++;break ; }