aboutsummaryrefslogtreecommitdiff
path: root/tracecmd/trace-snapshot.c
diff options
context:
space:
mode:
Diffstat (limited to 'tracecmd/trace-snapshot.c')
-rw-r--r--tracecmd/trace-snapshot.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/tracecmd/trace-snapshot.c b/tracecmd/trace-snapshot.c
new file mode 100644
index 00000000..34630b4f
--- /dev/null
+++ b/tracecmd/trace-snapshot.c
@@ -0,0 +1,114 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2013 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
+ *
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <getopt.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "tracefs.h"
+#include "trace-local.h"
+
+static void write_file(const char *name, char *val)
+{
+ char *path;
+ int fd;
+ ssize_t n;
+
+ path = tracefs_get_tracing_file(name);
+ fd = open(path, O_WRONLY);
+ if (fd < 0)
+ die("writing %s", path);
+
+ n = write(fd, val, strlen(val));
+ if (n < 0)
+ die("failed to write to %s\n", path);
+
+ tracefs_put_tracing_file(path);
+ close(fd);
+}
+
+void trace_snapshot (int argc, char **argv)
+{
+ const char *buffer = NULL;
+ const char *file = "snapshot";
+ struct stat st;
+ char *name;
+ char cpu_path[128];
+ int take_snap = 0;
+ int reset_snap = 0;
+ int free_snap = 0;
+ int cpu = -1;
+ int ret;
+ int c;
+
+ if (argc < 2)
+ usage(argv);
+
+ if (strcmp(argv[1], "snapshot") != 0)
+ usage(argv);
+
+ while ((c = getopt(argc-1, argv+1, "srfB:c:")) >= 0) {
+ switch (c) {
+ case 'h':
+ usage(argv);
+ break;
+ case 's':
+ take_snap = 1;
+ if (free_snap)
+ die("can't take snapshot and free it at the same time");
+ break;
+ case 'f':
+ free_snap = 1;
+ if (take_snap)
+ die("can't take snapshot and free it at the same time");
+ break;
+ case 'r':
+ reset_snap = 1;
+ break;
+ case 'B':
+ if (buffer)
+ die("Can only do one buffer at a time");
+ buffer = optarg;
+ break;
+ case 'c':
+ if (cpu >= 0)
+ die("Can only do one CPU (or all) at a time");
+ cpu = atoi(optarg);
+ break;
+ default:
+ usage(argv);
+ }
+ }
+
+ if (cpu >= 0) {
+ snprintf(cpu_path, 128, "per_cpu/cpu%d/%s", cpu, file);
+ file = cpu_path;
+ }
+
+ name = tracefs_get_tracing_file(file);
+ ret = stat(name, &st);
+ if (ret < 0)
+ die("Snapshot feature is not supported by this kernel");
+ tracefs_put_tracing_file(name);
+
+ if (!reset_snap && !take_snap && !free_snap) {
+ show_file(file);
+ exit(0);
+ }
+
+ if (reset_snap)
+ write_file(file, "2");
+
+ if (free_snap)
+ write_file(file, "0");
+
+ if (take_snap)
+ write_file(file, "1");
+}