lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <d6cdd535ae170d4ba0f580434a51286861c75c07.1429677461.git.hcochran@kernelspring.com>
Date:	Wed, 22 Apr 2015 00:55:12 -0400
From:	Howard Cochran <hcochran@...nelspring.com>
To:	Steven Rostedt <rostedt@...dmis.org>
Cc:	Howard Cochran <hcochran@...nelspring.com>,
	linux-kernel@...r.kernel.org, Howard Cochran <cochran@...mark.com>
Subject: [PATCH v3 3/5] trace-cmd stop, reset, restart: Add -a for all instances

As for extract, -a means all instances except the top one.
Use -t to get the top one too.

Signed-off-by: Howard Cochran <hcochran@...nelspring.com>
---
 Documentation/trace-cmd-reset.1.txt | 57 +++++++++++++++++++++++++++++++++----
 Documentation/trace-cmd-stop.1.txt  | 13 ++++++---
 trace-record.c                      | 57 ++++++++++++++++++++++++++++++-------
 trace-usage.c                       | 21 ++++++++------
 4 files changed, 119 insertions(+), 29 deletions(-)

diff --git a/Documentation/trace-cmd-reset.1.txt b/Documentation/trace-cmd-reset.1.txt
index 06a60af..bff4530 100644
--- a/Documentation/trace-cmd-reset.1.txt
+++ b/Documentation/trace-cmd-reset.1.txt
@@ -22,6 +22,9 @@ the data in the ring buffer, and the options that were used are all lost.
 
 OPTIONS
 -------
+Please note that the order that options are specified on the command line is
+significant. See EXAMPLES.
+
 *-b* 'buffer_size'::
     When the kernel boots, the Ftrace ring buffer is of a minimal size (3
     pages per CPU). The first time the tracer is used, the ring buffer size
@@ -32,6 +35,17 @@ OPTIONS
 
     trace-cmd reset -b 1
 
+    The buffer instance affected is the one (or ones) specified by the most
+    recently preceding *-B*, *-t*, or *-a* option:
+
+    When used after *-B*, resizes the buffer instance that precedes it on
+    the command line.
+
+    When used after *-a*, resizes all buffer instances except the top one.
+
+    When used after *-t* or before any *-B* or *-a*, resizes the top
+    instance.
+
 *-B* 'buffer-name'::
     If the kernel supports multiple buffers, this will reset the trace for
     only the given buffer. It does not affect any other buffer. This may be
@@ -39,15 +53,46 @@ OPTIONS
     will not be reset if this option is given (unless the *-t* option is
     also supplied).
 
+*-a*::
+    Reset the trace for all existing buffer instances. When this option
+    is used, the top level instance will not be reset unless *-t* is given.
+
 *-d*::
-    Delete the previously specified buffer instance that was specified by
-    the *-B* option. It is invalid to use with *-t* as the top level instance
-    can not be deleted.
+    This option deletes the instance buffer(s) specified by the most recently
+    preceding *-B* or *-a* option. Because the top-level instance buffer
+    cannot be deleted, it is invalid to use this immediatly following *-t* or
+    prior to any *-B* or *-a* option on the command line.
 
 *-t*::
-    Resets the top level instance buffer. Without the *-B* option this is the
-    same as the default. But if *-B* is used, this is required if the top
-    level instance buffer should also be reset.
+    Resets the top level instance buffer. Without the *-B* or *-a* option
+    this is the same as the default. But if *-B* or *-a* is used, this is
+    required if the top level instance buffer should also be reset.
+
+EXAMPLES
+--------
+
+Reset tracing for instance-one and set its per-cpu buffer size to 4096kb.
+Also deletes instance-two. The top level instance and any other instances
+remain unaffected:
+
+    trace-cmd reset -B instance-one -b 4096 -B instance-two -d
+
+Delete all instance buffers. Top level instance remains unaffected:
+
+    trace-cmd reset -a -d
+
+Delete all instance buffers and also reset the top instance:
+
+    trace-cmd reset -t -a -d
+
+Invalid. This command implies an attempt to delete the top instance:
+
+    trace-cmd reset -a -t -d
+
+Reset the top instance and set its per-cpu buffer size to 1024kb. If any
+instance buffers exist, they will be unaffected:
+
+    trace-cmd reset -b 1024
 
 
 SEE ALSO
diff --git a/Documentation/trace-cmd-stop.1.txt b/Documentation/trace-cmd-stop.1.txt
index c3f8b33..9d4093e 100644
--- a/Documentation/trace-cmd-stop.1.txt
+++ b/Documentation/trace-cmd-stop.1.txt
@@ -30,12 +30,17 @@ OPTIONS
 *-B* 'buffer-name'::
     If the kernel supports multiple buffers, this will stop the trace for
     only the given buffer. It does not affect any other buffer. This may be
-    used multiple times to specify different buffers.
+    used multiple times to specify different buffers. When this option is
+    used, the top level instance will not be stopped unless *-t* is given.
+
+*-a*::
+    Stop the trace for all existing buffer instances. When this option
+    is used, the top level instance will not be stopped unless *-t* is given.
 
 *-t*::
-    Stops the top level instance buffer. Without the *-B* option this is the
-    same as the default. But if *-B* is used, this is required if the top
-    level instance buffer should also be stopped.
+    Stops the top level instance buffer. Without the *-B* or *-a* option this
+    is the same as the default. But if *-B* or *-a* is used, this is
+    required if the top level instance buffer should also be stopped.
 
 SEE ALSO
 --------
diff --git a/trace-record.c b/trace-record.c
index 4a78fff..7c6b7e9 100644
--- a/trace-record.c
+++ b/trace-record.c
@@ -311,7 +311,7 @@ struct buffer_instance *create_instance(const char *name)
  *
  * Returns whether the operation succeeded
  */
-int add_all_instances(const char *tracing_dir)
+int __add_all_instances(const char *tracing_dir)
 {
 	struct dirent *dent;
 	char *instances_dir;
@@ -3844,7 +3844,7 @@ void trace_record (int argc, char **argv)
 		for (;;) {
 			int c;
 
-			c = getopt(argc-1, argv+1, "tB:");
+			c = getopt(argc-1, argv+1, "hatB:");
 			if (c == -1)
 				break;
 			switch (c) {
@@ -3855,6 +3855,9 @@ void trace_record (int argc, char **argv)
 				instance = create_instance(optarg);
 				add_instance(instance);
 				break;
+			case 'a':
+				add_all_instances();
+				break;
 			case 't':
 				/* Force to use top instance */
 				topt = 1;
@@ -3872,7 +3875,7 @@ void trace_record (int argc, char **argv)
 		for (;;) {
 			int c;
 
-			c = getopt(argc-1, argv+1, "tB:");
+			c = getopt(argc-1, argv+1, "hatB:");
 			if (c == -1)
 				break;
 			switch (c) {
@@ -3883,6 +3886,9 @@ void trace_record (int argc, char **argv)
 				instance = create_instance(optarg);
 				add_instance(instance);
 				break;
+			case 'a':
+				add_all_instances();
+				break;
 			case 't':
 				/* Force to use top instance */
 				topt = 1;
@@ -3897,16 +3903,33 @@ void trace_record (int argc, char **argv)
 		enable_tracing();
 		exit(0);
 	} else if (strcmp(argv[1], "reset") == 0) {
+		/* if last arg is -a, then -b and -d apply to all instances */
+		int last_specified_all = 0;
+		struct buffer_instance *inst; /* iterator */
+
+		while ((c = getopt(argc-1, argv+1, "hab:B:td")) >= 0) {
 
-		while ((c = getopt(argc-1, argv+1, "b:B:td")) >= 0) {
 			switch (c) {
+			case 'h':
+				usage(argv);
+				break;
 			case 'b':
-				instance->buffer_size = atoi(optarg);
+			{
+				int size = atoi(optarg);
 				/* Min buffer size is 1 */
-				if (strcmp(optarg, "0") == 0)
-					instance->buffer_size = 1;
+				if (size <= 1)
+					size = 1;
+				if (last_specified_all) {
+					for_each_instance(inst) {
+						inst->buffer_size = size;
+					}
+				} else {
+					instance->buffer_size = size;
+				}
 				break;
+			}
 			case 'B':
+				last_specified_all = 0;
 				instance = create_instance(optarg);
 				add_instance(instance);
 				/* -d will remove keep */
@@ -3914,13 +3937,27 @@ void trace_record (int argc, char **argv)
 				break;
 			case 't':
 				/* Force to use top instance */
+				last_specified_all = 0;
 				topt = 1;
 				instance = &top_instance;
 				break;
+			case 'a':
+				last_specified_all = 1;
+				add_all_instances();
+				for_each_instance(instance) {
+					instance->keep = 1;
+				}
+				break;
 			case 'd':
-				if (is_top_instance(instance))
-					die("Can not delete top level buffer");
-				instance->keep = 0;
+				if (last_specified_all) {
+					for_each_instance(inst) {
+						inst->keep = 0;
+					}
+				} else {
+					if (is_top_instance(instance))
+						die("Can not delete top level buffer");
+					instance->keep = 0;
+				}
 				break;
 			}
 		}
diff --git a/trace-usage.c b/trace-usage.c
index 39de386..c56661b 100644
--- a/trace-usage.c
+++ b/trace-usage.c
@@ -72,20 +72,22 @@ static struct usage_help usage_help[] = {
 	{
 		"stop",
 		"stop the kernel from recording trace data",
-		" %s stop [-B buf [-B buf]..] [-t]\n"
+		" %s stop [-B buf [-B buf]..] [-a] [-t]\n"
 		"          Stops the tracer from recording more data.\n"
 		"          Used in conjunction with start\n"
-		"          -B stop a given buffer (more than one may be specified)\n "
-		"          -t stop the top level buffer (needed if -B is specified)\n"
+		"          -B stop a given buffer (more than one may be specified)\n"
+		"          -a stop all buffers (except top one)\n"
+		"          -t stop the top level buffer (useful with -B or -a)\n"
 	},
 	{
 		"restart",
 		"restart the kernel trace data recording",
-		" %s restart [-B buf [-B buf]..] [-t]\n"
+		" %s restart [-B buf [-B buf]..] [-a] [-t]\n"
 		"          Restarts recording after a trace-cmd stop.\n"
 		"          Used in conjunction with stop\n"
-		"          -B restart a given buffer (more than one may be specified)\n "
-		"          -t restart the top level buffer (needed if -B is specified)\n"
+		"          -B restart a given buffer (more than one may be specified)\n"
+		"          -a restart all buffers (except top one)\n"
+		"          -t restart the top level buffer (useful with -B or -a)\n"
 	},
 	{
 		"show",
@@ -114,13 +116,14 @@ static struct usage_help usage_help[] = {
 	{
 		"reset",
 		"disable all kernel tracing and clear the trace buffers",
-		" %s reset [-b size][-B buf][-d][-t]\n"
+		" %s reset [-b size][-B buf][-a][-d][-t]\n"
 		"          Disables the tracer (may reset trace file)\n"
 		"          Used in conjunction with start\n"
 		"          -b change the kernel buffer size (in kilobytes per CPU)\n"
-		"          -B reset the given buffer instance (top instance ignored)\n"
 		"          -d delete the previous specified instance\n"
-		"          -t still reset the top instance if -B option is given\n"
+		"          -B reset the given buffer instance (may specify multiple -B)\n"
+		"          -a reset all instances (except top one)\n"
+		"          -t reset the top level instance (useful with -B or -a)\n"
 	},
 	{
 		"report",
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ