#define SETBUFFER_SIZE (64 * 1024)
-#define S_OPTS "aAB:d:D:e:hi:I:l:L:m:M:o:p:P:q:Q:s:S:t:T:u:VvXz:"
+#define S_OPTS "aAB:d:D:e:hi:I:l:L:m:M:o:p:P:q:Q:rs:S:t:T:u:VvXz:"
static struct option l_opts[] = {
{
.name = "seek-absolute",
.flag = NULL,
.val = 'Q'
},
+ {
+ .name = "no-remaps",
+ .has_arg = no_argument,
+ .flag = NULL,
+ .val = 'r'
+ },
{
.name = "seeks",
.has_arg = required_argument,
"[ -P <output name> | --per-io-trees=<output name> ]\n" \
"[ -q <output name> | --q2c-latencies=<output name> ]\n" \
"[ -Q <output name> | --active-queue-depth=<output name> ]\n" \
+ "[ -r | --no-remaps ]\n" \
"[ -s <output name> | --seeks=<output name> ]\n" \
"[ -S <interval> | --iostat-interval=<interval> ]\n" \
"[ -t <sec> | --time-start=<sec> ]\n" \
case 'Q':
aqd_name = optarg;
break;
+ case 'r':
+ ignore_remaps = 1;
+ break;
case 's':
seek_name = optarg;
break;
rngs_ofp = avgs_ofp = msgs_ofp = stdout;
easy_parse_avgs = 0;
} else {
- rngs_ofp = std_open(output_name, ".dat", "range data");
- avgs_ofp = std_open(output_name, ".avg", "stats data");
- msgs_ofp = std_open(output_name, ".msg", "K messages");
+ rngs_ofp = std_open(output_name, "dat", "range data");
+ avgs_ofp = std_open(output_name, "avg", "stats data");
+ msgs_ofp = std_open(output_name, "msg", "K messages");
if (easy_parse_avgs) {
- xavgs_ofp = std_open(output_name, ".xvg",
- "X stats data");
+ xavgs_ofp = std_open(output_name, "xvg",
+ "EZ stats data");
}
}
#include <time.h>
#include "globals.h"
-char bt_timeline_version[] = "2.07";
+char bt_timeline_version[] = "2.08";
char *devices, *exes, *input_name, *output_name, *seek_name, *bno_dump_name;
char *d2c_name, *q2c_name, *per_io_name, *unplug_hist_name;
char *sps_name, *aqd_name, *q2d_name, *per_io_trees;
FILE *rngs_ofp, *avgs_ofp, *xavgs_ofp, *per_io_ofp, *msgs_ofp;
int verbose, done, time_bounded, output_all_data, seek_absolute;
-int easy_parse_avgs;
+int easy_parse_avgs, ignore_remaps;
double t_astart, t_aend;
unsigned long n_traces;
struct avgs_info all_avgs;
\newpage\section{\label{sec:cmd-line}Command Line}
\begin{verbatim}
-Usage: btt 2.07
+Usage: btt 2.08
[ -a | --seek-absolute ]
[ -A | --all-data ]
[ -B <output name> | --dump-blocknos=<output name> ]
[ -P <output name> | --per-io-trees=<output name> ]
[ -q <output name> | --q2c-latencies=<output name> ]
[ -Q <output name> | --active-queue-depth=<output name> ]
+[ -r | --no-remaps ]
[ -s <output name> | --seeks=<output name> ]
[ -S <interval> | --iostat-interval=<interval> ]
[ -t <sec> | --time-start=<sec> ]
driver. (The value is incremented when an \emph{issue} is performend,
and decremented when a \emph{complete} is performed.
+\subsection{\label{sec:o-r}\texttt{--no-remaps}/\texttt{-r}}
+
+ Ignore remap traces; older kernels did not implement the full remap PDU.
+
\subsection{\label{sec:o-s}\texttt{--seeks}/\texttt{-s}}
This option instructs \texttt{btt} to generate the seek data file
extern FILE *rngs_ofp, *avgs_ofp, *xavgs_ofp, *iostat_ofp, *per_io_ofp;
extern FILE *msgs_ofp;
extern int verbose, done, time_bounded, output_all_data, seek_absolute;
-extern int easy_parse_avgs;
+extern int easy_parse_avgs, ignore_remaps;
extern unsigned int n_devs;
extern unsigned long n_traces;
extern struct list_head all_devs, all_procs;
{
struct io *q_iop;
struct d_info *q_dip;
- struct blk_io_trace_remap *rp = a_iop->pdu;
+ struct blk_io_trace_remap *rp;
+ if (ignore_remaps)
+ goto out;
+
+ rp = a_iop->pdu;
cvt_pdu_remap(rp);
a_iop->t.device = rp->device_from;
.br
[ \-Q <\fIoutput name\fR> | \-\-active\-queue\-depth=<\fIoutput name\fR> ]
.br
+[ \-r | \-\-no\-remaps ]
+.br
[ \-s <\fIoutput name\fR> | \-\-seeks=<\fIoutput name\fR> ]
.br
[ \-S <\fIinterval\fR> | \-\-iostat\-interval=<\fIinterval\fR> ]
and the depth of active commands (those issued but not completed).
.RE
+.B \-r
+.br
+.B \-\-no\-remaps
+.RS 4
+Ignore remap traces; older kernels did not implement the full remap
+PDU.
+.RE
+
.B \-s <\fIoutput name\fR>
.br
.B \-\-seeks=<\fIoutput name\fR>