All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH application] Allow one to filter on specific trace actions
@ 2008-07-21 18:43 Alan D. Brunelle
  0 siblings, 0 replies; only message in thread
From: Alan D. Brunelle @ 2008-07-21 18:43 UTC (permalink / raw)
  To: linux-kernel@vger.kernel.org; +Cc: Jens Axboe

[-- Attachment #1: Type: text/plain, Size: 0 bytes --]



[-- Attachment #2: 0002-Allow-one-to-filter-on-specific-trace-actions.patch --]
[-- Type: text/x-diff, Size: 17812 bytes --]

>From 8dbad2d1af70f3dce95e3d38a5f8cb582a02a69e Mon Sep 17 00:00:00 2001
From: Alan D. Brunelle <alan.brunelle@hp.com>
Date: Mon, 21 Jul 2008 14:41:54 -0400
Subject: [PATCH] Allow one to filter on specific trace actions

Added in new '-m' option to blktrace: Can now specify filter at a specific
trace action.

Also: fixed up a missing NOTIFY in the mas_maps table. Updated doc -
still need to do man page.

Signed-off-by: Alan D. Brunelle <alan.brunelle@hp.com>
---
 act_mask.c       |   43 +++++++++++++++++++++++---
 blktrace.c       |   30 +++++++++++++++---
 blktrace.h       |    1 +
 blktrace_api.h   |    1 +
 doc/blktrace.tex |   90 +++++++++++++++++++++++++++++++++++------------------
 5 files changed, 124 insertions(+), 41 deletions(-)

diff --git a/act_mask.c b/act_mask.c
index 40a4050..87faa62 100644
--- a/act_mask.c
+++ b/act_mask.c
@@ -1,7 +1,9 @@
 #include <strings.h>
 #include "blktrace.h"
 
-#define DECLARE_MASK_MAP(mask)          { BLK_TC_##mask, #mask, "BLK_TC_"#mask }
+#define DECLARE_MASK_MAP(mask)	{ BLK_TC_##mask, #mask, "BLK_TC_"#mask }
+#define DECLARE_TRACE_MAP(mask)	{ __BLK_TA_##mask, #mask, "__BLK_TA_"#mask }
+
 #define COMPARE_MASK_MAP(mmp, str)                                      \
         (!strcasecmp((mmp)->short_form, (str)) ||                      \
          !strcasecmp((mmp)->long_form, (str)))
@@ -23,22 +25,53 @@ static struct mask_map mask_maps[] = {
 	DECLARE_MASK_MAP(COMPLETE),
 	DECLARE_MASK_MAP(FS),
 	DECLARE_MASK_MAP(PC),
+	DECLARE_MASK_MAP(NOTIFY),
 	DECLARE_MASK_MAP(AHEAD),
 	DECLARE_MASK_MAP(META),
 };
 
-int find_mask_map(char *string)
+static struct mask_map trace_maps[] = {
+	DECLARE_TRACE_MAP(QUEUE),
+	DECLARE_TRACE_MAP(BACKMERGE),
+	DECLARE_TRACE_MAP(FRONTMERGE),
+	DECLARE_TRACE_MAP(GETRQ),
+	DECLARE_TRACE_MAP(SLEEPRQ),
+	DECLARE_TRACE_MAP(REQUEUE),
+	DECLARE_TRACE_MAP(ISSUE),
+	DECLARE_TRACE_MAP(COMPLETE),
+	DECLARE_TRACE_MAP(PLUG),
+	DECLARE_TRACE_MAP(UNPLUG_IO),
+	DECLARE_TRACE_MAP(UNPLUG_TIMER),
+	DECLARE_TRACE_MAP(INSERT),
+	DECLARE_TRACE_MAP(SPLIT),
+	DECLARE_TRACE_MAP(BOUNCE),
+	DECLARE_TRACE_MAP(REMAP),
+};
+
+#define MAP_LEN(map) (sizeof(map) / sizeof((map)[0]))
+
+int find_mask(char *string, struct mask_map *maps, unsigned int map_len)
 {
 	unsigned int i;
 
-	for (i = 0; i < sizeof(mask_maps)/sizeof(mask_maps[0]); i++)
-		if (COMPARE_MASK_MAP(&mask_maps[i], string))
-			return mask_maps[i].mask;
+	for (i = 0; i < map_len; i++)
+		if (COMPARE_MASK_MAP(&maps[i], string))
+			return maps[i].mask;
 
 	return -1;
 }
 
+int find_mask_map(char *string)
+{
+	return find_mask(string, mask_maps, MAP_LEN(mask_maps));
+}
+
 int valid_act_opt(int x)
 {
 	return (1 <= x) && (x < (1 << BLK_TC_SHIFT));
 }
+
+int find_trace_map(char *string)
+{
+	return find_mask(string, trace_maps, MAP_LEN(trace_maps));
+}
diff --git a/blktrace.c b/blktrace.c
index 8892a33..f9131fe 100644
--- a/blktrace.c
+++ b/blktrace.c
@@ -60,7 +60,7 @@ static char blktrace_version[] = "0.99.3";
 
 #define DEBUGFS_TYPE	0x64626720
 
-#define S_OPTS	"d:a:A:r:o:kw:Vb:n:D:lh:p:sI:"
+#define S_OPTS	"d:a:A:r:o:kw:Vb:n:D:lh:p:sI:m:"
 static struct option l_opts[] = {
 	{
 		.name = "dev",
@@ -247,6 +247,7 @@ static char *debugfs_path;
 static char *output_name;
 static char *output_dir;
 static int cat_mask = ~0U;
+static u32 trace_mask = ~0U;
 static int kill_running_trace;
 static unsigned long buf_size = BUF_SIZE;
 static unsigned long buf_nr = BUF_NR;
@@ -398,6 +399,7 @@ static int start_trace(struct device_information *dip)
 	buts.buf_size = dip->buf_size;
 	buts.buf_nr = dip->buf_nr;
 	buts.cat_mask = cat_mask;
+	buts.trace_mask = trace_mask;
 
 	if (ioctl(dip->fd, BLKTRACESETUP, &buts) < 0) {
 		perror("BLKTRACESETUP");
@@ -1756,7 +1758,8 @@ static int net_setup_client(void)
 
 static char usage_str[] = \
 	"-d <dev> [ -r debugfs path ] [ -o <output> ] [-k ] [ -w time ]\n" \
-	"[ -a action ] [ -A action mask ] [ -I  <devs file> ] [ -v ]\n\n" \
+	"[ -a action ] [ -A action mask ] [ -I  <devs file> ]\n" \
+	"[ -m trace ] [ -M trace mask ][ -v ]\n\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" \
 	"\t-o File(s) to send output to\n" \
@@ -1772,6 +1775,8 @@ static char usage_str[] = \
 	"\t-p Network port to use (default 8462)\n" \
 	"\t-s Make the network client NOT use sendfile() to transfer data\n" \
 	"\t-I Add devices found in <devs file>\n" \
+	"\t-m Only capture specified traces. See documentation\n" \
+	"\t-M Give traces mask as a single value. See documentation\n" \
 	"\t-V Print program version info\n\n";
 
 static void show_usage(char *program)
@@ -1786,6 +1791,7 @@ int main(int argc, char *argv[])
 	int i, c;
 	int stop_watch = 0;
 	int cat_mask_tmp = 0;
+	int trace_mask_tmp = 0;
 
 	while ((c = getopt_long(argc, argv, S_OPTS, l_opts, NULL)) >= 0) {
 		switch (c) {
@@ -1800,7 +1806,7 @@ int main(int argc, char *argv[])
 			break;
 
 		case 'A':
-			if ((sscanf(optarg, "%x", &i) != 1) || 
+			if ((sscanf(optarg, "%x", &i) != 1) ||
 							!valid_act_opt(i)) {
 				fprintf(stderr,
 					"Invalid set action mask %s/0x%x\n",
@@ -1810,6 +1816,17 @@ int main(int argc, char *argv[])
 			cat_mask_tmp = i;
 			break;
 
+		case 'm':
+			i = find_trace_map(optarg);
+			if (i < 0) {
+				fprintf(stderr,
+					"Invalid trace action mask %s\n",
+					optarg);
+				return 1;
+			}
+			trace_mask_tmp |= (1 << i);
+			break;
+
 		case 'd':
 			if (resize_devices(optarg) != 0)
 				return 1;
@@ -1820,8 +1837,8 @@ int main(int argc, char *argv[])
 			FILE *ifp = fopen(optarg, "r");
 
 			if (!ifp) {
-				fprintf(stderr, 
-				        "Invalid file for devices %s\n", 
+				fprintf(stderr,
+				        "Invalid file for devices %s\n",
 					optarg);
 				return 1;
 			}
@@ -1920,6 +1937,9 @@ int main(int argc, char *argv[])
 	if (cat_mask_tmp != 0)
 		cat_mask = cat_mask_tmp;
 
+	if (trace_mask_tmp != 0)
+		trace_mask = trace_mask_tmp;
+
 	if (!debugfs_path)
 		debugfs_path = default_debugfs_path;
 
diff --git a/blktrace.h b/blktrace.h
index 816ce61..b26686d 100644
--- a/blktrace.h
+++ b/blktrace.h
@@ -140,6 +140,7 @@ extern void process_fmt(char *, struct per_cpu_info *, struct blk_io_trace *,
 			unsigned long long, int, unsigned char *);
 extern int valid_act_opt(int);
 extern int find_mask_map(char *);
+extern int find_trace_map(char *);
 extern char *find_process_name(pid_t);
 
 #endif
diff --git a/blktrace_api.h b/blktrace_api.h
index 2b76d76..8490fdc 100644
--- a/blktrace_api.h
+++ b/blktrace_api.h
@@ -115,6 +115,7 @@ struct blk_io_trace_remap {
 struct blk_user_trace_setup {
 	char name[32];			/* output */
 	__u16 cat_mask;			/* input */
+	__u32 trace_mask;			/* input */
 	__u32 buf_size;			/* input */
 	__u32 buf_nr;			/* input */
 	__u64 start_lba;
diff --git a/doc/blktrace.tex b/doc/blktrace.tex
index 1b79c73..bac1495 100644
--- a/doc/blktrace.tex
+++ b/doc/blktrace.tex
@@ -21,7 +21,7 @@
 \title{blktrace User Guide}
 \author{blktrace: Jens Axboe (jens.axboe@oracle.com)\\
         User Guide: Alan D. Brunelle (Alan.Brunelle@hp.com)}
-\date{27 May 2008}
+\date{21 July 2008}
 
 \begin{document}
 \maketitle
@@ -82,7 +82,7 @@ As an example, bt/kernel contains blk-trace-2.6.14-rc1-git-G2, download
 linux-2.6.13.tar.bz2 and patch-2.6.14-rc1.bz2
 
 \begin{verbatim}
-% tar xjf linux-2.6.13.tar.bz2 
+% tar xjf linux-2.6.13.tar.bz2
 % mv linux-2.6.13 linux-2.6.14-rc1
 % cd linux-2.6.14-rc1
 % bunzip2 -c ../patch-2.6.14-rc1.bz2 | patch -p1
@@ -102,7 +102,7 @@ system -- again, outside the scope of this document -- and then enable
 and navigate through \emph{Device Drivers} and \emph{Block devices}
 and then down to \emph{Support for tracing block io actions} and hit Y.
 
-Install the new kernel (and modules\ldots) and reboot. 
+Install the new kernel (and modules\ldots) and reboot.
 
 \subsection{\label{sec:mount}Mounting the debugfs file system}
 
@@ -220,14 +220,14 @@ device. An example of that would be \emph{cdrecord} burning.
 \subsection{\label{sec:blktrace-post}blktrace -- post-processing}
 
 Another way to run blktrace is to have blktrace save data away for later
-formatting by blkparse. This would be useful if you want to get 
+formatting by blkparse. This would be useful if you want to get
 measurements while running specific loads.
 
-To do this, one would specify the device (or devices) to be watched. Then 
+To do this, one would specify the device (or devices) to be watched. Then
 go run you test cases. Stop the trace, and at your leisure utilize
 blkparse to see the results.
 
-In this example, devices /dev/sdaa, /dev/sdc and /dev/sdo are used in an 
+In this example, devices /dev/sdaa, /dev/sdc and /dev/sdo are used in an
 LVM volume called adb3/vol.
 
 \begin{verbatim}
@@ -247,11 +247,11 @@ Maximum filesystem blocks=4294967296
 1025 block groups
 32768 blocks per group, 32768 fragments per group
 16384 inodes per group
-Superblock backups stored on blocks: 
-        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
+Superblock backups stored on blocks:
+        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
 	4096000, 7962624, 11239424, 20480000, 23887872
 
-Writing inode tables: done                            
+Writing inode tables: done
 Creating journal (8192 blocks): done
 Writing superblocks and filesystem accounting information: done
 
@@ -343,7 +343,7 @@ of the more arcane command line options:
   a file created in the mounted directory for the debugfs, which defaults
   to \emph{/sys/kernel/debug} -- this can be overridden with the \emph{-r}
   command line argument.
-  
+
   \item blktrace defaults to collecting \emph{all} events that can be
   traced. To limit the events being captured, you can specify one or
   more filter masks via the \emph{-a} option.
@@ -368,7 +368,7 @@ of the more arcane command line options:
   \item blktrace may also be run concurrently with blkparse to produce
   \emph{live} output -- to do this specify \emph{-o -} for blktrace.
 
-  \item The default behaviour for blktrace is to run forever until explicitly killed by the user (via a control-C, or \emph{kill} utility invocation). There are two ways to modify this: 
+  \item The default behaviour for blktrace is to run forever until explicitly killed by the user (via a control-C, or \emph{kill} utility invocation). There are two ways to modify this:
 
   \begin{enumerate}
     \item You may utilize the blktrace utility itself to \emph{kill}
@@ -395,6 +395,7 @@ Short              & Long                       & Description \\ \hline\hline
 -w \emph{seconds}  & --stopwatch=\emph{seconds} & Sets run time to the number of seconds specified \\ \hline
 -I \emph{devs file}& --input-devs=\emph{devs file}& Adds devices found in \emph{devs file} to list of devices to trace. \\
                    &                              & (One device per line.) \\ \hline
+-m \emph{name}     & --act-mask=\emph{name}     & Add \emph{name} to current trace filter (see below for masks) \\ \hline
 \end{tabular}
 
 \subsubsection{\label{sec:filter-mask}Filter Masks}
@@ -402,17 +403,44 @@ The following category masks may be passed with the \emph{-a} command
 line option, multiple filters may be combined via multiple \emph{-a}
 command line options.\smallskip
 
+\begin{tabular}{|l|l|l|}\hline
+\textbf{Name}	& \textbf{Description}		& \textbf{Hex}	\\ \hline\hline
+ahead		& \emph{Read ahead} events	& 0x0800	\\ \hline
+barrier		& \emph{barrier} attribute	& 0x0004	\\ \hline
+complete	& \emph{completed} by driver	& 0x0080	\\ \hline
+fs		& \emph{FS} requests		& 0x0100	\\ \hline
+issue		& \emph{issued} to driver	& 0x0040	\\ \hline
+meta		& \emph{Metadata} events 	& 0x1000	\\ \hline
+notify		& \emph{Notification} events	& 0x0400	\\ \hline
+pc		& \emph{packet command} events	& 0x0200	\\ \hline
+queue		& \emph{queue} operations	& 0x0010	\\ \hline
+read		& \emph{read} events		& 0x0001	\\ \hline
+requeue		& \emph{requeue} operations	& 0x0020	\\ \hline
+sync		& \emph{synchronous} attribute	& 0x0008	\\ \hline
+write		& \emph{write} events		& 0x0002	\\ \hline
+\end{tabular}
+
+The following trace masks may be pased with the \emph{-m} command line
+option, multiple filters may be combined via multiple \emph{-m} command
+line options.\smallskip
+
 \begin{tabular}{|l|l|}\hline
-barrier & \emph{barrier} attribute \\ \hline
-complete & \emph{completed} by driver \\ \hline
-fs & \emph{FS} requests \\ \hline
-issue & \emph{issued} to driver \\ \hline
-pc & \emph{packet command} events \\ \hline
-queue & \emph{queue} operations \\ \hline
-read & \emph{read} traces \\ \hline
-requeue & \emph{requeue} operations \\ \hline
-sync & \emph{synchronous} attribute \\ \hline
-write & \emph{write} traces \\ \hline
+\textbf{Name}	& \textbf{Description}		\\ \hline\hline
+queue		& \emph{Queue} traces		\\ \hline
+backmerge	& \emph{Back merge} traces	\\ \hline
+frontmerge	& \emph{Merge (front)} traces	\\ \hline
+getrq		& \emph{Get request} traces	\\ \hline
+sleeprq		& \emph{Sleep for req} traces	\\ \hline
+requeue		& \emph{Requeue req} traces	\\ \hline
+issue		& \emph{Issues} traces		\\ \hline
+complete	& \emph{Req completion} traces	\\ \hline
+plug		& \emph{Req queue plug} traces	\\ \hline
+unplug\_io	& \emph{Unplug req Q} traces	\\ \hline
+unplug\_timer	& \emph{Unplug req Q timeout}	\\ \hline
+insert		& \emph{Insertion} traces	\\ \hline
+split		& \emph{Split req} traces	\\ \hline
+bounce		& \emph{Req bounce} traces	\\ \hline
+remap		& \emph{Req remap} traces	\\ \hline
 \end{tabular}
 
 \subsubsection{\label{sec:request-types}Request types}
@@ -439,7 +467,7 @@ will help in understanding the command line options presented below.
   \item By default, blkparse expects to run in a post-processing mode
   -- one where the trace events have been saved by a previous run
   of blktrace, and blkparse is combining event streams and dumping
-  formatted data. 
+  formatted data.
 
   blkparse \emph{may} be run in a \emph{live} manner concurrently with
   blktrace by specifying \emph{-i -} to blkparse, and combining it with
@@ -476,7 +504,7 @@ Short              & Long                       & Description \\ \hline\hline
 		   &                            & (reading data from standard in). \\ \hline
 
 -F \emph{typ,fmt}  & --format=\emph{typ,fmt}    & Sets output format \\
--f \emph{fmt}      & --format-spec=\emph{fmt}   & (See section~\ref{sec:blkparse-format} for details.) \\ 
+-f \emph{fmt}      & --format-spec=\emph{fmt}   & (See section~\ref{sec:blkparse-format} for details.) \\
                    &                            & \\
 		   &                            & The -f form specifies a format for all events \\
                    &                            & \\
@@ -500,7 +528,7 @@ Short              & Long                       & Description \\ \hline\hline
 
 -t                 & --track-ios                & Display time deltas per IO \\ \hline
 
--w \emph{span}     & --stopwatch=\emph{span}    & Display traces for the \emph{span} specified -- where span can be: \\ 
+-w \emph{span}     & --stopwatch=\emph{span}    & Display traces for the \emph{span} specified -- where span can be: \\
                    &                            & \emph{end-time} -- Display traces from time 0 through \emph{end-time} (in ns) \\
 		   &                            & or \\
 		   &                            & \emph{start:end-time} -- Display traces from time \emph{start} \\
@@ -675,7 +703,7 @@ Seeing this in action:
   8,0    3        1     0.000000000   697  G   W 223490 + 8 [kjournald]
 \end{verbatim}
 
-The header is the data in this line up to the 223490 (starting block). 
+The header is the data in this line up to the 223490 (starting block).
 
 The default output for all event types includes this header.
 
@@ -683,7 +711,7 @@ The default output for all event types includes this header.
 
 \begin{description}
   \item[C -- complete] If a payload is present, this is presented between
-  parenthesis following the header, followed by the error value. 
+  parenthesis following the header, followed by the error value.
 
   If no payload is present, the sector and number of blocks are presented
   (with an intervening plus (+) character). If the \emph{-t} option
@@ -769,24 +797,24 @@ Files which include $<linux/blktrace.h>$ are supplied with the following
 kernel routine invocable interfaces:
 
 \begin{description}
-  \item[blk\_add\_trace\_rq(struct request\_queue *q, struct request\_queue 
+  \item[blk\_add\_trace\_rq(struct request\_queue *q, struct request\_queue
   								*rq, u32 what)]
 	Adds a trace event describing the state change of the passed in
 	request\_queue. The \emph{what} parameter describes the change in
-	the request\_queue state, and is one of the request queue action 
+	the request\_queue state, and is one of the request queue action
 	specifiers -- BLK\_TA\_QUEUE, BLK\_TA\_REQUEUE, BLK\_TA\_ISSUE,
 	or BLK\_TA\_COMPLETE.
 
-  \item[blk\_add\_trace\_bio(struct request\_queue *q, struct bio *bio, 
+  \item[blk\_add\_trace\_bio(struct request\_queue *q, struct bio *bio,
   								u32 what)]
 	Adds a trace event for the BIO passed in. The \emph{what} parameter
 	describes the action being performed on the BIO, and is one of
 	BLK\_TA\_BACKMERGE, BLK\_TA\_FRONTMERGE, or BLK\_TA\_QUEUE.
 
-  \item[blk\_add\_trace\_generic(struct request\_queue *q, struct bio *bio, 
+  \item[blk\_add\_trace\_generic(struct request\_queue *q, struct bio *bio,
 							int rw, u32 what)]
 	Adds a \emph{generic} trace event -- not one of the request queue
-	or BIO traces. The \emph{what} parameter describes the action being 
+	or BIO traces. The \emph{what} parameter describes the action being
 	performed on the BIO (if bio is non-NULL), and is one of
 	BLK\_TA\_PLUG, BLK\_TA\_GETRQ or BLK\_TA\_SLEEPRQ.
 
-- 
1.5.4.3


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2008-07-21 18:44 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-07-21 18:43 [PATCH application] Allow one to filter on specific trace actions Alan D. Brunelle

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.