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>] [day] [month] [year] [list]
Message-ID: <1447107512-26191-1-git-send-email-jbacik@fb.com>
Date:	Mon, 9 Nov 2015 17:18:32 -0500
From:	Josef Bacik <jbacik@...com>
To:	<kernel-team@...com>, <linux-kernel@...r.kernel.org>,
	<rostedt@...dmis.org>
Subject: [PATCH] trace-cmd: separate out buffer_instances

In an effort to make trace-cmd more easily linked against we need to separate
out the instance handling functionality.  I've renamed buffer_instance to
tracecmd_buffer_instance and moved the relevant helper functions into their own
file and moved the definitions into trace-cmd.h.  Thanks,

Signed-off-by: Josef Bacik <jbacik@...com>
---
 Makefile         |   3 +-
 trace-cmd.c      |   9 +-
 trace-cmd.h      | 102 +++++++++++--
 trace-instance.c | 185 +++++++++++++++++++++++
 trace-local.h    |  70 ++-------
 trace-record.c   | 449 ++++++++++++++++++++-----------------------------------
 trace-stat.c     |  68 ++++-----
 trace-stream.c   |   4 +-
 8 files changed, 482 insertions(+), 408 deletions(-)
 create mode 100644 trace-instance.c

diff --git a/Makefile b/Makefile
index 6b5bd29..d538725 100644
--- a/Makefile
+++ b/Makefile
@@ -336,7 +336,8 @@ PEVENT_LIB_OBJS = event-parse.o trace-seq.o parse-filter.o parse-utils.o
 TCMD_LIB_OBJS = $(PEVENT_LIB_OBJS) trace-util.o trace-input.o trace-ftrace.o \
 			trace-output.o trace-record.o trace-recorder.o \
 			trace-restore.o trace-usage.o trace-blk-hack.o \
-			kbuffer-parse.o event-plugin.o trace-hooks.o
+			kbuffer-parse.o event-plugin.o trace-hooks.o \
+			trace-instance.o
 
 PLUGIN_OBJS =
 PLUGIN_OBJS += plugin_jbd2.o
diff --git a/trace-cmd.c b/trace-cmd.c
index 49d3559..f73d541 100644
--- a/trace-cmd.c
+++ b/trace-cmd.c
@@ -265,11 +265,12 @@ static void show_event_format_re(const char *re)
 	process_file_re(event_format_write, "available_events", re);
 }
 
-void show_instance_file(struct buffer_instance *instance, const char *name)
+void show_instance_file(struct tracecmd_buffer_instance *instance,
+			const char *name)
 {
 	char *path;
 
-	path = get_instance_file(instance, name);
+	path = tracecmd_get_instance_file(instance, name);
 	dump_file_content(path);
 	tracecmd_put_tracing_file(path);
 }
@@ -499,7 +500,7 @@ int main (int argc, char **argv)
 		const char *buffer = NULL;
 		const char *file = "trace";
 		const char *cpu = NULL;
-		struct buffer_instance *instance = &top_instance;
+		struct tracecmd_buffer_instance *instance = &top_instance;
 		char cpu_path[128];
 		char *path;
 		int snap = 0;
@@ -532,7 +533,7 @@ int main (int argc, char **argv)
 				if (buffer)
 					die("Can only show one buffer at a time");
 				buffer = optarg;
-				instance = create_instance(optarg);
+				instance = tracecmd_create_instance(optarg);
 				break;
 			case 'c':
 				if (cpu)
diff --git a/trace-cmd.h b/trace-cmd.h
index 2e59b46..6908b8b 100644
--- a/trace-cmd.h
+++ b/trace-cmd.h
@@ -296,20 +296,20 @@ void tracecmd_ftrace_load_options(void);
 /* event hooks */
 
 struct hook_list {
-	struct hook_list	*next;
-	struct buffer_instance	*instance;
-	const char		*hook;
-	char			*str;
-	char			*start_system;
-	char			*start_event;
-	char			*start_match;
-	char			*end_system;
-	char			*end_event;
-	char			*end_match;
-	char			*pid;
-	int			migrate;
-	int			global;
-	int			stack;
+	struct hook_list		*next;
+	struct tracecmd_buffer_instance	*instance;
+	const char			*hook;
+	char				*str;
+	char				*start_system;
+	char				*start_event;
+	char				*start_match;
+	char				*end_system;
+	char				*end_event;
+	char				*end_match;
+	char				*pid;
+	int				migrate;
+	int				global;
+	int				stack;
 };
 
 struct hook_list *tracecmd_create_event_hook(const char *arg);
@@ -327,4 +327,78 @@ void *tracecmd_record_page(struct tracecmd_input *handle,
 void *tracecmd_record_offset(struct tracecmd_input *handle,
 			     struct pevent_record *record);
 
+/* --- instance manipulation --- */
+
+struct tracecmd_func_list {
+	struct tracecmd_func_list *next;
+	const char *func;
+};
+
+struct tracecmd_buffer_instance {
+	struct tracecmd_buffer_instance	*next;
+	const char			*name;
+	const char			*cpumask;
+	struct event_list		*events;
+	struct event_list		**event_next;
+
+	struct event_list		*sched_switch_event;
+	struct event_list		*sched_wakeup_event;
+	struct event_list		*sched_wakeup_new_event;
+
+	const char			*plugin;
+	struct tracecmd_func_list		*filter_funcs;
+	struct tracecmd_func_list		*notrace_funcs;
+
+	const char			*clock;
+
+	struct trace_seq		*s_save;
+	struct trace_seq		*s_print;
+
+	struct tracecmd_input		*handle;
+
+	int				tracing_on_init_val;
+	int				tracing_on_fd;
+	int				keep;
+	int				buffer_size;
+	int				profile;
+};
+
+static struct tracecmd_buffer_instance top_instance = { .keep = 1 };
+static struct tracecmd_buffer_instance *buffer_instances;
+static struct tracecmd_buffer_instance *first_instance;
+
+#define for_each_instance(i) for (i = buffer_instances; i; i = (i)->next)
+#define for_all_instances(i) for (i = first_instance; i; \
+				  i = i == &top_instance ? buffer_instances : (i)->next)
+
+struct tracecmd_buffer_instance *tracecmd_create_instance(const char *name);
+void tracecmd_init_instance(struct tracecmd_buffer_instance *instance);
+void tracecmd_add_instance(struct tracecmd_buffer_instance *instance);
+char *tracecmd_get_instance_file(struct tracecmd_buffer_instance *instance,
+				 const char *file);
+char *
+tracecmd_get_instance_dir(struct tracecmd_buffer_instance *instance);
+int tracecmd_num_instances(void);
+void tracecmd_make_instances(void);
+void tracecmd_remove_instances(void);
+static inline int
+tracecmd_is_top_instance(struct tracecmd_buffer_instance *instance)
+{
+	return instance == &top_instance;
+}
+static inline int tracecmd_no_top_instance(void)
+{
+	return first_instance != &top_instance;
+}
+static inline void
+tracecmd_update_first_instance(struct tracecmd_buffer_instance *instance,
+			       int topt)
+{
+	if (topt || instance == &top_instance)
+		first_instance = &top_instance;
+	else
+		first_instance = buffer_instances;
+}
+
+
 #endif /* _TRACE_CMD_H */
diff --git a/trace-instance.c b/trace-instance.c
new file mode 100644
index 0000000..a5a1cb3
--- /dev/null
+++ b/trace-instance.c
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2015, Josef Bacik <jbacik@...com>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License (not later!)
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not,  see <http://www.gnu.org/licenses>
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <dirent.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include "trace-local.h"
+
+static int buffers = 1;
+
+/**
+ * tracecmd_init_instance - init the buffer instance.
+ * @instance: the buffer instance to initialize.
+ */
+void tracecmd_init_instance(struct tracecmd_buffer_instance *instance)
+{
+	instance->event_next = &instance->events;
+}
+
+/**
+ * create_instance - allocate a new buffer instance
+ * @name: The name of the instance (instance will point to this)
+ *
+ * Returns a newly allocated instance. Note that @name will not be
+ * copied, and the instance buffer will point to the string itself.
+ */
+struct tracecmd_buffer_instance *tracecmd_create_instance(const char *name)
+{
+	struct tracecmd_buffer_instance *instance;
+
+	instance = malloc_or_die(sizeof(*instance));
+	memset(instance, 0, sizeof(*instance));
+	instance->name = name;
+
+	return instance;
+}
+
+/**
+ * tracecmd_add_instance - add a buffer instance to the internal list
+ * @instance: The buffer instance to add
+ */
+void tracecmd_add_instance(struct tracecmd_buffer_instance *instance)
+{
+	tracecmd_init_instance(instance);
+	instance->next = buffer_instances;
+	if (first_instance == buffer_instances)
+		first_instance = instance;
+	buffer_instances = instance;
+	buffers++;
+}
+
+/**
+ * tracecmd_num_instances - the number of instances.
+ */
+int tracecmd_num_instances(void)
+{
+	return buffers;
+}
+
+/**
+ * tracecmd_get_instance_file - return the path to a instance file.
+ * @instance: buffer instance for the file
+ * @file: name of file to return
+ *
+ * Returns the path name of the @file for the given @instance.
+ *
+ * Must use tracecmd_put_tracing_file() to free the returned string.
+ */
+char *
+tracecmd_get_instance_file(struct tracecmd_buffer_instance *instance,
+			   const char *file)
+{
+	char *buf;
+	char *path;
+
+	if (instance->name) {
+		buf = malloc_or_die(strlen(instance->name) +
+			     strlen(file) + strlen("instances//") + 1);
+		sprintf(buf, "instances/%s/%s", instance->name, file);
+
+		path = tracecmd_get_tracing_file(buf);
+		free(buf);
+	} else
+		path = tracecmd_get_tracing_file(file);
+
+	return path;
+}
+
+/**
+ * tracecmd_make_instances - create the instance directories.
+ */
+void tracecmd_make_instances(void)
+{
+	struct tracecmd_buffer_instance *instance;
+	struct stat st;
+	char *path;
+	int ret;
+
+	for_each_instance(instance) {
+		path = tracecmd_get_instance_dir(instance);
+		ret = stat(path, &st);
+		if (ret < 0) {
+			ret = mkdir(path, 0777);
+			if (ret < 0)
+				die("mkdir %s", path);
+		} else
+			/* Don't delete instances that already exist */
+			instance->keep = 1;
+		tracecmd_put_tracing_file(path);
+	}
+}
+
+/**
+ * tracecmd_get_instance_dir - get the path to the instance
+ * @instance: the instance we care about.
+ *
+ * Return a string of the path to the instance.  Must call
+ * tracemcd_put_tracing_file() on the returned path.
+ */
+char *
+tracecmd_get_instance_dir(struct tracecmd_buffer_instance *instance)
+{
+	char *buf;
+	char *path;
+
+	/* only works for instances */
+	if (!instance->name)
+		return NULL;
+
+	buf = malloc_or_die(strlen(instance->name) +
+			    strlen("instances/") + 1);
+	sprintf(buf, "instances/%s", instance->name);
+
+	path = tracecmd_get_tracing_file(buf);
+	free(buf);
+
+	return path;
+}
+
+/**
+ * tracecmd_remove_instances - remove the instance directories.
+ *
+ * Go through and close the associated fd's and remove the instance directories.
+ */
+void tracecmd_remove_instances(void)
+{
+	struct tracecmd_buffer_instance *instance;
+	char *path;
+	int ret;
+
+	for_each_instance(instance) {
+		/* Only delete what we created */
+		if (instance->keep)
+			continue;
+		if (instance->tracing_on_fd > 0) {
+			close(instance->tracing_on_fd);
+			instance->tracing_on_fd = 0;
+		}
+		path = tracecmd_get_instance_dir(instance);
+		ret = rmdir(path);
+		if (ret < 0)
+			die("rmdir %s", path);
+		tracecmd_put_tracing_file(path);
+	}
+}
diff --git a/trace-local.h b/trace-local.h
index a1596e7..d294b23 100644
--- a/trace-local.h
+++ b/trace-local.h
@@ -29,7 +29,7 @@
 /* fix stupid glib guint64 typecasts and printf formats */
 typedef unsigned long long u64;
 
-struct buffer_instance;
+struct tracecmd_buffer_instance;
 
 /* for local shared information with trace-cmd executable */
 
@@ -39,13 +39,13 @@ extern int silence_warnings;
 extern int show_status;
 
 struct pid_record_data {
-	int			pid;
-	int			brass[2];
-	int			cpu;
-	int			closed;
-	struct tracecmd_input	*stream;
-	struct buffer_instance	*instance;
-	struct pevent_record	*record;
+	int				pid;
+	int				brass[2];
+	int				cpu;
+	int				closed;
+	struct tracecmd_input		*stream;
+	struct tracecmd_buffer_instance	*instance;
+	struct pevent_record		*record;
 };
 
 void show_file(const char *name);
@@ -85,8 +85,8 @@ int trace_profile(void);
 void trace_profile_set_merge_like_comms(void);
 
 struct tracecmd_input *
-trace_stream_init(struct buffer_instance *instance, int cpu, int fd, int cpus,
-		  int profile, struct hook_list *hooks, int global);
+trace_stream_init(struct tracecmd_buffer_instance *instance, int cpu, int fd,
+		  int cpus, int profile, struct hook_list *hooks, int global);
 int trace_stream_read(struct pid_record_data *pids, int nr_pids, struct timeval *tv,
 		      int profile);
 
@@ -134,56 +134,6 @@ char *get_file_content(const char *file);
 
 char *strstrip(char *str);
 
-/* --- instance manipulation --- */
-
-struct func_list {
-	struct func_list *next;
-	const char *func;
-};
-
-struct buffer_instance {
-	struct buffer_instance	*next;
-	const char		*name;
-	const char		*cpumask;
-	struct event_list	*events;
-	struct event_list	**event_next;
-
-	struct event_list	*sched_switch_event;
-	struct event_list	*sched_wakeup_event;
-	struct event_list	*sched_wakeup_new_event;
-
-	const char		*plugin;
-	struct func_list	*filter_funcs;
-	struct func_list	*notrace_funcs;
-
-	const char		*clock;
-
-	struct trace_seq	*s_save;
-	struct trace_seq	*s_print;
-
-	struct tracecmd_input	*handle;
-
-	int			tracing_on_init_val;
-	int			tracing_on_fd;
-	int			keep;
-	int			buffer_size;
-	int			profile;
-};
-
-extern struct buffer_instance top_instance;
-extern struct buffer_instance *buffer_instances;
-extern struct buffer_instance *first_instance;
-
-#define for_each_instance(i) for (i = buffer_instances; i; i = (i)->next)
-#define for_all_instances(i) for (i = first_instance; i; \
-				  i = i == &top_instance ? buffer_instances : (i)->next)
-
-struct buffer_instance *create_instance(const char *name);
-void add_instance(struct buffer_instance *instance);
-char *get_instance_file(struct buffer_instance *instance, const char *file);
-void update_first_instance(struct buffer_instance *instance, int topt);
-
-void show_instance_file(struct buffer_instance *instance, const char *name);
 int count_cpus(void);
 
 #endif /* __TRACE_LOCAL_H */
diff --git a/trace-record.c b/trace-record.c
index 616e17b..4ab0783 100644
--- a/trace-record.c
+++ b/trace-record.c
@@ -85,7 +85,6 @@ static int sleep_time = 1000;
 static int cpu_count;
 static int recorder_threads;
 static struct pid_record_data *pids;
-static int buffers;
 
 /* Clear all function filters */
 static int clear_function_filters;
@@ -113,7 +112,7 @@ static unsigned recorder_flags;
 /* Try a few times to get an accurate date */
 static int date2ts_tries = 5;
 
-static struct func_list *graph_funcs;
+static struct tracecmd_func_list *graph_funcs;
 
 static int func_stack;
 
@@ -173,28 +172,10 @@ static struct reset_file *reset_files;
 /* Triggers need to be cleared in a special way */
 static struct reset_file *reset_triggers;
 
-struct buffer_instance top_instance = { .keep = 1 };
-struct buffer_instance *buffer_instances;
-struct buffer_instance *first_instance;
-
 static struct tracecmd_recorder *recorder;
 
 static int ignore_event_not_found = 0;
 
-static inline int is_top_instance(struct buffer_instance *instance)
-{
-	return instance == &top_instance;
-}
-
-static inline int no_top_instance(void)
-{
-	return first_instance != &top_instance;
-}
-
-static void init_instance(struct buffer_instance *instance)
-{
-	instance->event_next = &instance->events;
-}
 
 enum {
 	RESET_DEFAULT_PRIO	= 0,
@@ -275,38 +256,6 @@ static void reset_save_file_cond(const char *file, int prio,
 	free(content);
 }
 
-/**
- * add_instance - add a buffer instance to the internal list
- * @instance: The buffer instance to add
- */
-void add_instance(struct buffer_instance *instance)
-{
-	init_instance(instance);
-	instance->next = buffer_instances;
-	if (first_instance == buffer_instances)
-		first_instance = instance;
-	buffer_instances = instance;
-	buffers++;
-}
-
-/**
- * create_instance - allocate a new buffer instance
- * @name: The name of the instance (instance will point to this)
- *
- * Returns a newly allocated instance. Note that @name will not be
- * copied, and the instance buffer will point to the string itself.
- */
-struct buffer_instance *create_instance(const char *name)
-{
-	struct buffer_instance *instance;
-
-	instance = malloc_or_die(sizeof(*instance));
-	memset(instance, 0, sizeof(*instance));
-	instance->name = name;
-
-	return instance;
-}
-
 static int __add_all_instances(const char *tracing_dir)
 {
 	struct dirent *dent;
@@ -337,7 +286,7 @@ static int __add_all_instances(const char *tracing_dir)
 	while ((dent = readdir(dir))) {
 		const char *name = strdup(dent->d_name);
 		char *instance_path;
-		struct buffer_instance *instance;
+		struct tracecmd_buffer_instance *instance;
 
 		if (strcmp(name, ".") == 0 ||
 		    strcmp(name, "..") == 0)
@@ -351,8 +300,8 @@ static int __add_all_instances(const char *tracing_dir)
 		}
 		free(instance_path);
 
-		instance = create_instance(name);
-		add_instance(instance);
+		instance = tracecmd_create_instance(name);
+		tracecmd_add_instance(instance);
 	}
 
 	closedir(dir);
@@ -386,7 +335,7 @@ void add_all_instances(void)
  * @cpu: the CPU to stat
  *
  */
-void tracecmd_stat_cpu_instance(struct buffer_instance *instance,
+void tracecmd_stat_cpu_instance(struct tracecmd_buffer_instance *instance,
 				struct trace_seq *s, int cpu)
 {
 	char buf[BUFSIZ];
@@ -400,7 +349,7 @@ void tracecmd_stat_cpu_instance(struct buffer_instance *instance,
 		return;
 	snprintf(file, 40, "per_cpu/cpu%d/stats", cpu);
 
-	path = get_instance_file(instance, file);
+	path = tracecmd_get_instance_file(instance, file);
 	free(file);
 	fd = open(path, O_RDONLY);
 	tracecmd_put_tracing_file(path);
@@ -424,20 +373,21 @@ void tracecmd_stat_cpu(struct trace_seq *s, int cpu)
 	tracecmd_stat_cpu_instance(&top_instance, s, cpu);
 }
 
-static void add_event(struct buffer_instance *instance, struct event_list *event)
+static void add_event(struct tracecmd_buffer_instance *instance,
+		      struct event_list *event)
 {
 	*instance->event_next = event;
 	instance->event_next = &event->next;
 	event->next = NULL;
 }
 
-static void reset_event_list(struct buffer_instance *instance)
+static void reset_event_list(struct tracecmd_buffer_instance *instance)
 {
 	instance->events = NULL;
-	init_instance(instance);
+	tracecmd_init_instance(instance);
 }
 
-static char *get_temp_file(struct buffer_instance *instance, int cpu)
+static char *get_temp_file(struct tracecmd_buffer_instance *instance, int cpu)
 {
 	const char *name = instance->name;
 	char *file = NULL;
@@ -461,7 +411,8 @@ static void put_temp_file(char *file)
 	free(file);
 }
 
-static void delete_temp_file(struct buffer_instance *instance, int cpu)
+static void delete_temp_file(struct tracecmd_buffer_instance *instance,
+			     int cpu)
 {
 	const char *name = instance->name;
 	char file[MAX_PATH];
@@ -473,7 +424,8 @@ static void delete_temp_file(struct buffer_instance *instance, int cpu)
 	unlink(file);
 }
 
-static int kill_thread_instance(int start, struct buffer_instance *instance)
+static int
+kill_thread_instance(int start, struct tracecmd_buffer_instance *instance)
 {
 	int n = start;
 	int i;
@@ -494,7 +446,7 @@ static int kill_thread_instance(int start, struct buffer_instance *instance)
 
 static void kill_threads(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 	int i = 0;
 
 	if (!recorder_threads || !pids)
@@ -524,7 +476,8 @@ void die(const char *fmt, ...)
 	exit(ret);
 }
 
-static int delete_thread_instance(int start, struct buffer_instance *instance)
+static int delete_thread_instance(int start,
+				  struct tracecmd_buffer_instance *instance)
 {
 	int n = start;
 	int i;
@@ -546,7 +499,7 @@ static int delete_thread_instance(int start, struct buffer_instance *instance)
 
 static void delete_thread_data(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 	int i = 0;
 
 	for_all_instances(instance)
@@ -555,7 +508,7 @@ static void delete_thread_data(void)
 	 * Top instance temp files are still created even if it
 	 * isn't used.
 	 */
-	if (no_top_instance()) {
+	if (tracecmd_no_top_instance()) {
 		for (i = 0; i < cpu_count; i++)
 			delete_temp_file(&top_instance, i);
 	}
@@ -593,12 +546,12 @@ static void stop_threads(enum trace_type type)
 	}
 }
 
-static int create_recorder(struct buffer_instance *instance, int cpu,
+static int create_recorder(struct tracecmd_buffer_instance *instance, int cpu,
 			   enum trace_type type, int *brass);
 
 static void flush_threads(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 	long ret;
 	int i;
 
@@ -670,61 +623,14 @@ static int set_ftrace(int set, int use_proc)
 	return 0;
 }
 
-/**
- * get_instance_file - return the path to a instance file.
- * @instance: buffer instance for the file
- * @file: name of file to return
- *
- * Returns the path name of the @file for the given @instance.
- *
- * Must use tracecmd_put_tracing_file() to free the returned string.
- */
-char *
-get_instance_file(struct buffer_instance *instance, const char *file)
-{
-	char *buf;
-	char *path;
 
-	if (instance->name) {
-		buf = malloc_or_die(strlen(instance->name) +
-			     strlen(file) + strlen("instances//") + 1);
-		sprintf(buf, "instances/%s/%s", instance->name, file);
-
-		path = tracecmd_get_tracing_file(buf);
-		free(buf);
-	} else
-		path = tracecmd_get_tracing_file(file);
-
-	return path;
-}
-
-static char *
-get_instance_dir(struct buffer_instance *instance)
-{
-	char *buf;
-	char *path;
-
-	/* only works for instances */
-	if (!instance->name)
-		return NULL;
-
-	buf = malloc_or_die(strlen(instance->name) +
-			    strlen("instances/") + 1);
-	sprintf(buf, "instances/%s", instance->name);
-
-	path = tracecmd_get_tracing_file(buf);
-	free(buf);
-
-	return path;
-}
-
-static void __clear_trace(struct buffer_instance *instance)
+static void __clear_trace(struct tracecmd_buffer_instance *instance)
 {
 	FILE *fp;
 	char *path;
 
 	/* reset the trace */
-	path = get_instance_file(instance, "trace");
+	path = tracecmd_get_instance_file(instance, "trace");
 	fp = fopen(path, "w");
 	if (!fp)
 		die("writing to '%s'", path);
@@ -735,7 +641,7 @@ static void __clear_trace(struct buffer_instance *instance)
 
 static void clear_trace(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 
 	for_all_instances(instance)
 		__clear_trace(instance);
@@ -839,8 +745,8 @@ static void update_ftrace_pids(int reset)
 	}
 }
 
-static void update_event_filters(struct buffer_instance *instance);
-static void update_pid_event_filters(struct buffer_instance *instance);
+static void update_event_filters(struct tracecmd_buffer_instance *instance);
+static void update_pid_event_filters(struct tracecmd_buffer_instance *instance);
 static void enable_tracing(void);
 
 /**
@@ -897,7 +803,7 @@ static char *make_pid_filter(char *curr_filter, const char *field)
 
 static void update_task_filter(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 	int pid = getpid();
 
 	if (filter_task)
@@ -971,7 +877,8 @@ static void append_sched_event(struct event_list *event, const char *field, int
 	event->pid_filter = append_pid_filter(event->pid_filter, field, pid);
 }
 
-static void update_sched_events(struct buffer_instance *instance, int pid)
+static void
+update_sched_events(struct tracecmd_buffer_instance *instance, int pid)
 {
 	/*
 	 * Also make sure that the sched_switch to this pid
@@ -985,7 +892,7 @@ static void update_sched_events(struct buffer_instance *instance, int pid)
 
 static void add_new_filter_pid(int pid)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 	char buf[100];
 
 	add_filter_pid(pid);
@@ -1132,13 +1039,13 @@ static void run_cmd(enum trace_type type, int argc, char **argv)
 }
 
 static void
-set_plugin_instance(struct buffer_instance *instance, const char *name)
+set_plugin_instance(struct tracecmd_buffer_instance *instance, const char *name)
 {
 	FILE *fp;
 	char *path;
 	char zero = '0';
 
-	path = get_instance_file(instance, "current_tracer");
+	path = tracecmd_get_instance_file(instance, "current_tracer");
 	fp = fopen(path, "w");
 	if (!fp) {
 		/*
@@ -1162,7 +1069,7 @@ set_plugin_instance(struct buffer_instance *instance, const char *name)
 
 	/* Make sure func_stack_trace option is disabled */
 	/* First try instance file, then top level */
-	path = get_instance_file(instance, "options/func_stack_trace");
+	path = tracecmd_get_instance_file(instance, "options/func_stack_trace");
 	fp = fopen(path, "w");
 	if (!fp) {
 		tracecmd_put_tracing_file(path);
@@ -1185,7 +1092,7 @@ set_plugin_instance(struct buffer_instance *instance, const char *name)
 
 static void set_plugin(const char *name)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 
 	for_all_instances(instance)
 		set_plugin_instance(instance, name);
@@ -1221,9 +1128,11 @@ static int set_option(const char *option)
 	return 0;
 }
 
-static char *read_instance_file(struct buffer_instance *instance, char *file, int *psize);
+static char *read_instance_file(struct tracecmd_buffer_instance *instance,
+				char *file, int *psize);
 
-static void disable_func_stack_trace_instance(struct buffer_instance *instance)
+static void
+disable_func_stack_trace_instance(struct tracecmd_buffer_instance *instance)
 {
 	struct stat st;
 	char *content;
@@ -1232,7 +1141,7 @@ static void disable_func_stack_trace_instance(struct buffer_instance *instance)
 	int size;
 	int ret;
 
-	path = get_instance_file(instance, "current_tracer");
+	path = tracecmd_get_instance_file(instance, "current_tracer");
 	ret = stat(path, &st);
 	tracecmd_put_tracing_file(path);
 	if (ret < 0)
@@ -1250,7 +1159,7 @@ static void disable_func_stack_trace_instance(struct buffer_instance *instance)
 
 static void disable_func_stack_trace(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 
 	for_all_instances(instance)
 		disable_func_stack_trace_instance(instance);
@@ -1352,13 +1261,14 @@ static void set_options(void)
 	}
 }
 
-static int trace_check_file_exists(struct buffer_instance *instance, char *file)
+static int trace_check_file_exists(struct tracecmd_buffer_instance *instance,
+				   char *file)
 {
 	struct stat st;
 	char *path;
 	int ret;
 
-	path = get_instance_file(instance, file);
+	path = tracecmd_get_instance_file(instance, file);
 	ret = stat(path, &st);
 	tracecmd_put_tracing_file(path);
 
@@ -1416,7 +1326,7 @@ static void old_update_events(const char *name, char update)
 }
 
 static void
-reset_events_instance(struct buffer_instance *instance)
+reset_events_instance(struct tracecmd_buffer_instance *instance)
 {
 	glob_t globbuf;
 	char *path;
@@ -1427,14 +1337,14 @@ reset_events_instance(struct buffer_instance *instance)
 
 	if (use_old_event_method()) {
 		/* old way only had top instance */
-		if (!is_top_instance(instance))
+		if (!tracecmd_is_top_instance(instance))
 			return;
 		old_update_events("all", '0');
 		return;
 	}
 
 	c = '0';
-	path = get_instance_file(instance, "events/enable");
+	path = tracecmd_get_instance_file(instance, "events/enable");
 	fd = open(path, O_WRONLY);
 	if (fd < 0)
 		die("opening to '%s'", path);
@@ -1442,7 +1352,7 @@ reset_events_instance(struct buffer_instance *instance)
 	close(fd);
 	tracecmd_put_tracing_file(path);
 
-	path = get_instance_file(instance, "events/*/filter");
+	path = tracecmd_get_instance_file(instance, "events/*/filter");
 	globbuf.gl_offs = 0;
 	ret = glob(path, 0, NULL, &globbuf);
 	tracecmd_put_tracing_file(path);
@@ -1462,7 +1372,7 @@ reset_events_instance(struct buffer_instance *instance)
 
 static void reset_events(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 
 	for_all_instances(instance)
 		reset_events_instance(instance);
@@ -1494,13 +1404,13 @@ static int write_file(const char *file, const char *str, const char *type)
 }
 
 static int
-write_instance_file(struct buffer_instance *instance,
+write_instance_file(struct tracecmd_buffer_instance *instance,
 		    const char *file, const char *str, const char *type)
 {
 	char *path;
 	int ret;
 
-	path = get_instance_file(instance, file);
+	path = tracecmd_get_instance_file(instance, file);
 	ret = write_file(path, str, type);
 	tracecmd_put_tracing_file(path);
 
@@ -1735,7 +1645,7 @@ static void check_tracing_enabled(void)
 	write(fd, "1", 1);
 }
 
-static int open_tracing_on(struct buffer_instance *instance)
+static int open_tracing_on(struct tracecmd_buffer_instance *instance)
 {
 	int fd = instance->tracing_on_fd;
 	char *path;
@@ -1744,11 +1654,11 @@ static int open_tracing_on(struct buffer_instance *instance)
 	if (fd > 0)
 		return fd;
 
-	path = get_instance_file(instance, "tracing_on");
+	path = tracecmd_get_instance_file(instance, "tracing_on");
 	fd = open(path, O_RDWR | O_CLOEXEC);
 	if (fd < 0) {
 		/* instances may not be created yet */
-		if (is_top_instance(instance))
+		if (tracecmd_is_top_instance(instance))
 			die("opening '%s'", path);
 		return fd;
 	}
@@ -1758,7 +1668,7 @@ static int open_tracing_on(struct buffer_instance *instance)
 	return fd;
 }
 
-static void write_tracing_on(struct buffer_instance *instance, int on)
+static void write_tracing_on(struct tracecmd_buffer_instance *instance, int on)
 {
 	int ret;
 	int fd;
@@ -1776,7 +1686,7 @@ static void write_tracing_on(struct buffer_instance *instance, int on)
 		die("writing 'tracing_on'");
 }
 
-static int read_tracing_on(struct buffer_instance *instance)
+static int read_tracing_on(struct tracecmd_buffer_instance *instance)
 {
 	int fd;
 	char buf[10];
@@ -1797,7 +1707,7 @@ static int read_tracing_on(struct buffer_instance *instance)
 
 static void enable_tracing(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 
 	check_tracing_enabled();
 
@@ -1810,7 +1720,7 @@ static void enable_tracing(void)
 
 static void disable_tracing(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 
 	for_all_instances(instance)
 		write_tracing_on(instance, 0);
@@ -1843,7 +1753,7 @@ update_sched_event(struct event_list *event, const char *field)
 	event->pid_filter = make_pid_filter(event->pid_filter, field);
 }
 
-static void update_event_filters(struct buffer_instance *instance)
+static void update_event_filters(struct tracecmd_buffer_instance *instance)
 {
 	struct event_list *event;
 	char *event_filter;
@@ -1905,7 +1815,7 @@ static void update_event_filters(struct buffer_instance *instance)
 	}
 }
 
-static void update_pid_event_filters(struct buffer_instance *instance)
+static void update_pid_event_filters(struct tracecmd_buffer_instance *instance)
 {
 	/*
 	 * Also make sure that the sched_switch to this pid
@@ -1919,7 +1829,7 @@ static void update_pid_event_filters(struct buffer_instance *instance)
 	update_event_filters(instance);
 }
 
-static void set_mask(struct buffer_instance *instance)
+static void set_mask(struct tracecmd_buffer_instance *instance)
 {
 	const char *mask = instance->cpumask;
 	struct stat st;
@@ -1952,7 +1862,7 @@ static void set_mask(struct buffer_instance *instance)
 		mask = cpumask;
 	}
 
-	path = get_instance_file(instance, "tracing_cpumask");
+	path = tracecmd_get_instance_file(instance, "tracing_cpumask");
 	if (!path)
 		die("could not allocate path");
 
@@ -1975,7 +1885,7 @@ static void set_mask(struct buffer_instance *instance)
 	tracecmd_put_tracing_file(path);
 }
 
-static void enable_events(struct buffer_instance *instance)
+static void enable_events(struct tracecmd_buffer_instance *instance)
 {
 	struct event_list *event;
 
@@ -1991,7 +1901,7 @@ static void enable_events(struct buffer_instance *instance)
 	}
 }
 
-static void set_clock(struct buffer_instance *instance)
+static void set_clock(struct tracecmd_buffer_instance *instance)
 {
 	char *path;
 	char *content;
@@ -2012,7 +1922,7 @@ static void set_clock(struct buffer_instance *instance)
 			die("Can not find clock in trace_clock");
 		str = strtok(NULL, "]");
 	}
-	path = get_instance_file(instance, "trace_clock");
+	path = tracecmd_get_instance_file(instance, "trace_clock");
 	add_reset_file(path, str, RESET_DEFAULT_PRIO);
 
 	free(content);
@@ -2022,7 +1932,8 @@ static void set_clock(struct buffer_instance *instance)
 }
 
 static struct event_list *
-create_event(struct buffer_instance *instance, char *path, struct event_list *old_event)
+create_event(struct tracecmd_buffer_instance *instance, char *path,
+	     struct event_list *old_event)
 {
 	struct event_list *event;
 	struct stat st;
@@ -2062,7 +1973,7 @@ create_event(struct buffer_instance *instance, char *path, struct event_list *ol
 	return event;
 }
 
-static void make_sched_event(struct buffer_instance *instance,
+static void make_sched_event(struct tracecmd_buffer_instance *instance,
 			     struct event_list **event, struct event_list *sched,
 			     const char *sched_path)
 {
@@ -2096,7 +2007,7 @@ static void test_event(struct event_list *event, const char *path,
 	*save = event;
 }
 
-static int expand_event_files(struct buffer_instance *instance,
+static int expand_event_files(struct tracecmd_buffer_instance *instance,
 			      const char *file, struct event_list *old_event)
 {
 	struct event_list **save_event_tail = instance->event_next;
@@ -2111,7 +2022,7 @@ static int expand_event_files(struct buffer_instance *instance,
 	p = malloc_or_die(strlen(file) + strlen("events//filter") + 1);
 	sprintf(p, "events/%s/filter", file);
 
-	path = get_instance_file(instance, p);
+	path = tracecmd_get_instance_file(instance, p);
 
 	globbuf.gl_offs = 0;
 	ret = glob(path, 0, NULL, &globbuf);
@@ -2155,7 +2066,8 @@ static int expand_event_files(struct buffer_instance *instance,
 	return save_event_tail == instance->event_next;
 }
 
-static void expand_event(struct buffer_instance *instance, struct event_list *event)
+static void expand_event(struct tracecmd_buffer_instance *instance,
+			 struct event_list *event)
 {
 	const char *name = event->event;
 	char *str;
@@ -2206,7 +2118,7 @@ static void expand_event(struct buffer_instance *instance, struct event_list *ev
 		die("No events enabled with %s", name);
 }
 
-static void expand_event_instance(struct buffer_instance *instance)
+static void expand_event_instance(struct tracecmd_buffer_instance *instance)
 {
 	struct event_list *compressed_list = instance->events;
 	struct event_list *event;
@@ -2223,7 +2135,7 @@ static void expand_event_instance(struct buffer_instance *instance)
 
 static void expand_event_list(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 
 	if (use_old_event_method())
 		return;
@@ -2334,7 +2246,7 @@ static void set_prio(int prio)
 }
 
 static struct tracecmd_recorder *
-create_recorder_instance_pipe(struct buffer_instance *instance,
+create_recorder_instance_pipe(struct tracecmd_buffer_instance *instance,
 			      int cpu, int *brass)
 {
 	struct tracecmd_recorder *recorder;
@@ -2342,7 +2254,7 @@ create_recorder_instance_pipe(struct buffer_instance *instance,
 	char *path;
 
 	if (instance->name)
-		path = get_instance_dir(instance);
+		path = tracecmd_get_instance_dir(instance);
 	else
 		path = tracecmd_find_tracing_dir();
 
@@ -2361,8 +2273,8 @@ create_recorder_instance_pipe(struct buffer_instance *instance,
 }
 
 static struct tracecmd_recorder *
-create_recorder_instance(struct buffer_instance *instance, const char *file, int cpu,
-			 int *brass)
+create_recorder_instance(struct tracecmd_buffer_instance *instance,
+			 const char *file, int cpu, int *brass)
 {
 	struct tracecmd_recorder *record;
 	char *path;
@@ -2373,7 +2285,7 @@ create_recorder_instance(struct buffer_instance *instance, const char *file, int
 	if (!instance->name)
 		return tracecmd_create_recorder_maxkb(file, cpu, recorder_flags, max_kb);
 
-	path = get_instance_dir(instance);
+	path = tracecmd_get_instance_dir(instance);
 
 	record = tracecmd_create_buffer_recorder_maxkb(file, cpu, recorder_flags,
 						       path, max_kb);
@@ -2386,7 +2298,7 @@ create_recorder_instance(struct buffer_instance *instance, const char *file, int
  * If extract is set, then this is going to set up the recorder,
  * connections and exit as the tracing is serialized by a single thread.
  */
-static int create_recorder(struct buffer_instance *instance, int cpu,
+static int create_recorder(struct tracecmd_buffer_instance *instance, int cpu,
 			   enum trace_type type, int *brass)
 {
 	long ret;
@@ -2573,7 +2485,7 @@ static void finish_network(void)
 static void start_threads(enum trace_type type, int global)
 {
 	int profile = (type & TRACE_TYPE_PROFILE) == TRACE_TYPE_PROFILE;
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 	int *brass = NULL;
 	int i = 0;
 	int ret;
@@ -2582,9 +2494,11 @@ static void start_threads(enum trace_type type, int global)
 		setup_network();
 
 	/* make a thread for every CPU we have */
-	pids = malloc_or_die(sizeof(*pids) * cpu_count * (buffers + 1));
+	pids = malloc_or_die(sizeof(*pids) * cpu_count *
+			     (tracecmd_num_instances() + 1));
 
-	memset(pids, 0, sizeof(*pids) * cpu_count * (buffers + 1));
+	memset(pids, 0, sizeof(*pids) * cpu_count *
+	       (tracecmd_num_instances() + 1));
 
 	for_all_instances(instance) {
 		int x;
@@ -2616,7 +2530,7 @@ static void start_threads(enum trace_type type, int global)
 
 static void append_buffer(struct tracecmd_output *handle,
 			  struct tracecmd_option *buffer_option,
-			  struct buffer_instance *instance,
+			  struct tracecmd_buffer_instance *instance,
 			  char **temp_files)
 {
 	int i;
@@ -2631,7 +2545,8 @@ static void append_buffer(struct tracecmd_output *handle,
 }
 
 static void
-add_buffer_stat(struct tracecmd_output *handle, struct buffer_instance *instance)
+add_buffer_stat(struct tracecmd_output *handle,
+		struct tracecmd_buffer_instance *instance)
 {
 	struct trace_seq s;
 	int i;
@@ -2692,11 +2607,11 @@ static void touch_file(const char *file)
 	close(fd);
 }
 
-static void print_stat(struct buffer_instance *instance)
+static void print_stat(struct tracecmd_buffer_instance *instance)
 {
 	int cpu;
 
-	if (!is_top_instance(instance))
+	if (!tracecmd_is_top_instance(instance))
 		printf("\nBuffer: %s\n\n", instance->name);
 
 	for (cpu = 0; cpu < cpu_count; cpu++)
@@ -2707,7 +2622,7 @@ static void record_data(char *date2ts)
 {
 	struct tracecmd_option **buffer_options;
 	struct tracecmd_output *handle;
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 	char **temp_files;
 	int i;
 
@@ -2731,7 +2646,7 @@ static void record_data(char *date2ts)
 		 * If top_instance was not used, we still need to create
 		 * empty trace.dat files for it.
 		 */
-		if (no_top_instance()) {
+		if (tracecmd_no_top_instance()) {
 			for (i = 0; i < cpu_count; i++)
 				touch_file(temp_files[i]);
 		}
@@ -2745,7 +2660,7 @@ static void record_data(char *date2ts)
 					    strlen(date2ts)+1, date2ts);
 
 		/* Only record the top instance under TRACECMD_OPTION_CPUSTAT*/
-		if (!no_top_instance()) {
+		if (!tracecmd_no_top_instance()) {
 			struct trace_seq *s = top_instance.s_save;
 
 			for (i = 0; i < cpu_count; i++)
@@ -2760,8 +2675,9 @@ static void record_data(char *date2ts)
 
 		add_uname(handle);
 
-		if (buffers) {
-			buffer_options = malloc_or_die(sizeof(*buffer_options) * buffers);
+		if (tracecmd_num_instances()) {
+			buffer_options = malloc_or_die(sizeof(*buffer_options) *
+						       tracecmd_num_instances());
 			i = 0;
 			for_each_instance(instance) {
 				buffer_options[i++] = tracecmd_add_buffer_option(handle, instance->name);
@@ -2769,7 +2685,7 @@ static void record_data(char *date2ts)
 			}
 		}
 
-		if (!no_top_instance())
+		if (!tracecmd_no_top_instance())
 			print_stat(&top_instance);
 
 		tracecmd_append_cpu_data(handle, cpu_count, temp_files);
@@ -2777,7 +2693,7 @@ static void record_data(char *date2ts)
 		for (i = 0; i < cpu_count; i++)
 			put_temp_file(temp_files[i]);
 
-		if (buffers) {
+		if (tracecmd_num_instances()) {
 			i = 0;
 			for_each_instance(instance) {
 				print_stat(instance);
@@ -2792,15 +2708,15 @@ static void record_data(char *date2ts)
 	tracecmd_output_close(handle);
 }
 
-static void write_func_file(struct buffer_instance *instance,
-			    const char *file, struct func_list **list)
+static void write_func_file(struct tracecmd_buffer_instance *instance,
+			    const char *file, struct tracecmd_func_list **list)
 {
-	struct func_list *item;
+	struct tracecmd_func_list *item;
 	char *path;
 	int fd;
 	int ret;
 
-	path = get_instance_file(instance, file);
+	path = tracecmd_get_instance_file(instance, file);
 
 	fd = open(path, O_WRONLY | O_TRUNC);
 	if (fd < 0)
@@ -2829,17 +2745,17 @@ static void write_func_file(struct buffer_instance *instance,
 	    item->func, file, item->func);
 }
 
-static int functions_filtered(struct buffer_instance *instance)
+static int functions_filtered(struct tracecmd_buffer_instance *instance)
 {
 	char buf[1] = { '#' };
 	char *path;
 	int fd;
 
-	path = get_instance_file(instance, "set_ftrace_filter");
+	path = tracecmd_get_instance_file(instance, "set_ftrace_filter");
 	fd = open(path, O_RDONLY);
 	tracecmd_put_tracing_file(path);
 	if (fd < 0) {
-		if (is_top_instance(instance))
+		if (tracecmd_is_top_instance(instance))
 			warning("Can not set set_ftrace_filter");
 		else
 			warning("Can not set set_ftrace_filter for %s",
@@ -2859,16 +2775,16 @@ static int functions_filtered(struct buffer_instance *instance)
 	return 1;
 }
 
-static void set_funcs(struct buffer_instance *instance)
+static void set_funcs(struct tracecmd_buffer_instance *instance)
 {
 	write_func_file(instance, "set_ftrace_filter", &instance->filter_funcs);
 	write_func_file(instance, "set_ftrace_notrace", &instance->notrace_funcs);
 	/* graph tracing currently only works for top instance */
-	if (is_top_instance(instance))
+	if (tracecmd_is_top_instance(instance))
 		write_func_file(instance, "set_graph_function", &graph_funcs);
 
 	/* make sure we are filtering functions */
-	if (func_stack && is_top_instance(instance)) {
+	if (func_stack && tracecmd_is_top_instance(instance)) {
 		if (!functions_filtered(instance))
 			die("Function stack trace set, but functions not filtered");
 		save_option(FUNC_STACK_TRACE);
@@ -2876,9 +2792,9 @@ static void set_funcs(struct buffer_instance *instance)
 	clear_function_filters = 1;
 }
 
-static void add_func(struct func_list **list, const char *func)
+static void add_func(struct tracecmd_func_list **list, const char *func)
 {
-	struct func_list *item;
+	struct tracecmd_func_list *item;
 
 	item = malloc_or_die(sizeof(*item));
 	item->func = func;
@@ -2973,7 +2889,8 @@ static unsigned long long find_time_stamp(struct pevent *pevent)
 	return ts;
 }
 
-static char *read_instance_file(struct buffer_instance *instance, char *file, int *psize)
+static char *read_instance_file(struct tracecmd_buffer_instance *instance,
+				char *file, int *psize)
 {
 	char buffer[BUFSIZ];
 	char *path;
@@ -2982,7 +2899,7 @@ static char *read_instance_file(struct buffer_instance *instance, char *file, in
 	int fd;
 	int r;
 
-	path = get_instance_file(instance, file);
+	path = tracecmd_get_instance_file(instance, file);
 	fd = open(path, O_RDONLY);
 	tracecmd_put_tracing_file(path);
 	if (fd < 0) {
@@ -3124,7 +3041,7 @@ static char *get_date_to_ts(void)
 	return date2ts;
 }
 
-static void set_buffer_size_instance(struct buffer_instance *instance)
+static void set_buffer_size_instance(struct tracecmd_buffer_instance *instance)
 {
 	int buffer_size = instance->buffer_size;
 	char buf[BUFSIZ];
@@ -3140,7 +3057,7 @@ static void set_buffer_size_instance(struct buffer_instance *instance)
 
 	snprintf(buf, BUFSIZ, "%d", buffer_size);
 
-	path = get_instance_file(instance, "buffer_size_kb");
+	path = tracecmd_get_instance_file(instance, "buffer_size_kb");
 	fd = open(path, O_WRONLY);
 	if (fd < 0) {
 		warning("can't open %s", path);
@@ -3157,7 +3074,7 @@ static void set_buffer_size_instance(struct buffer_instance *instance)
 
 void set_buffer_size(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 
 	for_all_instances(instance)
 		set_buffer_size_instance(instance);
@@ -3193,7 +3110,7 @@ process_event_trigger(char *path, struct event_iter *iter, enum event_process *p
 	free(file);
 }
 
-static void clear_instance_triggers(struct buffer_instance *instance)
+static void clear_instance_triggers(struct tracecmd_buffer_instance *instance)
 {
 	struct event_iter *iter;
 	char *path;
@@ -3201,7 +3118,7 @@ static void clear_instance_triggers(struct buffer_instance *instance)
 	enum event_iter_type type;
 	enum event_process processed = PROCESSED_NONE;
 
-	path = get_instance_file(instance, "events");
+	path = tracecmd_get_instance_file(instance, "events");
 	if (!path)
 		die("malloc");
 
@@ -3254,7 +3171,7 @@ process_event_filter(char *path, struct event_iter *iter, enum event_process *pr
 	free(file);
 }
 
-static void clear_instance_filters(struct buffer_instance *instance)
+static void clear_instance_filters(struct tracecmd_buffer_instance *instance)
 {
 	struct event_iter *iter;
 	char *path;
@@ -3262,7 +3179,7 @@ static void clear_instance_filters(struct buffer_instance *instance)
 	enum event_iter_type type;
 	enum event_process processed = PROCESSED_NONE;
 
-	path = get_instance_file(instance, "events");
+	path = tracecmd_get_instance_file(instance, "events");
 	if (!path)
 		die("malloc");
 
@@ -3287,7 +3204,7 @@ static void clear_instance_filters(struct buffer_instance *instance)
 
 static void clear_filters(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 
 	for_all_instances(instance)
 		clear_instance_filters(instance);
@@ -3295,7 +3212,7 @@ static void clear_filters(void)
 
 static void clear_triggers(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 
 	for_all_instances(instance)
 		clear_instance_triggers(instance);
@@ -3303,7 +3220,7 @@ static void clear_triggers(void)
 
 static void clear_func_filters(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 	char *path;
 	int i;
 	const char const *files[] = { "set_ftrace_filter",
@@ -3314,55 +3231,13 @@ static void clear_func_filters(void)
 
 	for_all_instances(instance) {
 		for (i = 0; files[i]; i++) {
-			path = get_instance_file(instance, files[i]);
+			path = tracecmd_get_instance_file(instance, files[i]);
 			clear_func_filter(path);
 			tracecmd_put_tracing_file(path);
 		}
 	}
 }
 
-static void make_instances(void)
-{
-	struct buffer_instance *instance;
-	struct stat st;
-	char *path;
-	int ret;
-
-	for_each_instance(instance) {
-		path = get_instance_dir(instance);
-		ret = stat(path, &st);
-		if (ret < 0) {
-			ret = mkdir(path, 0777);
-			if (ret < 0)
-				die("mkdir %s", path);
-		} else
-			/* Don't delete instances that already exist */
-			instance->keep = 1;
-		tracecmd_put_tracing_file(path);
-	}
-}
-
-static void remove_instances(void)
-{
-	struct buffer_instance *instance;
-	char *path;
-	int ret;
-
-	for_each_instance(instance) {
-		/* Only delete what we created */
-		if (instance->keep)
-			continue;
-		if (instance->tracing_on_fd > 0) {
-			close(instance->tracing_on_fd);
-			instance->tracing_on_fd = 0;
-		}
-		path = get_instance_dir(instance);
-		ret = rmdir(path);
-		if (ret < 0)
-			die("rmdir %s", path);
-		tracecmd_put_tracing_file(path);
-	}
-}
 
 static void check_plugin(const char *plugin)
 {
@@ -3398,7 +3273,7 @@ static void check_function_plugin(void)
 	const char *plugin;
 
 	/* We only care about the top_instance */
-	if (no_top_instance())
+	if (tracecmd_no_top_instance())
 		return;
 
 	plugin = top_instance.plugin;
@@ -3410,14 +3285,14 @@ static void check_function_plugin(void)
 		die("Must supply function filtering with --func-stack\n");
 }
 
-static int __check_doing_something(struct buffer_instance *instance)
+static int __check_doing_something(struct tracecmd_buffer_instance *instance)
 {
 	return instance->profile || instance->plugin || instance->events;
 }
 
 static void check_doing_something(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 
 	for_all_instances(instance) {
 		if (__check_doing_something(instance))
@@ -3428,7 +3303,7 @@ static void check_doing_something(void)
 }
 
 static void
-update_plugin_instance(struct buffer_instance *instance,
+update_plugin_instance(struct tracecmd_buffer_instance *instance,
 		       enum trace_type type)
 {
 	const char *plugin = instance->plugin;
@@ -3467,7 +3342,7 @@ update_plugin_instance(struct buffer_instance *instance,
 
 static void update_plugins(enum trace_type type)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 
 	for_all_instances(instance)
 		update_plugin_instance(instance, type);
@@ -3475,7 +3350,7 @@ static void update_plugins(enum trace_type type)
 
 static void allocate_seq(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 
 	for_all_instances(instance) {
 		instance->s_save = malloc_or_die(sizeof(struct trace_seq) * cpu_count);
@@ -3524,7 +3399,7 @@ static void add_overrun(int cpu, struct trace_seq *src, struct trace_seq *dst)
 
 static void record_stats(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 	struct trace_seq *s_save;
 	struct trace_seq *s_print;
 	int cpu;
@@ -3544,7 +3419,7 @@ static void record_stats(void)
 
 static void print_stats(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 
 	for_all_instances(instance)
 		print_stat(instance);
@@ -3552,7 +3427,7 @@ static void print_stats(void)
 
 static void destroy_stats(void)
 {
-	struct buffer_instance *instance;
+	struct tracecmd_buffer_instance *instance;
 	int cpu;
 
 	for_all_instances(instance) {
@@ -3609,13 +3484,13 @@ static void add_trigger(struct event_list *event, const char *trigger)
 	}
 }
 
-static int test_stacktrace_trigger(struct buffer_instance *instance)
+static int test_stacktrace_trigger(struct tracecmd_buffer_instance *instance)
 {
 	char *path;
 	int ret = 0;
 	int fd;
 
-	path = get_instance_file(instance, "events/sched/sched_switch/trigger");
+	path = tracecmd_get_instance_file(instance, "events/sched/sched_switch/trigger");
 
 	clear_trigger(path);
 
@@ -3636,7 +3511,7 @@ static int test_stacktrace_trigger(struct buffer_instance *instance)
 }
 
 static int
-profile_add_event(struct buffer_instance *instance, const char *event_str, int stack)
+profile_add_event(struct tracecmd_buffer_instance *instance, const char *event_str, int stack)
 {
 	struct event_list *event;
 	char buf[BUFSIZ];
@@ -3680,7 +3555,7 @@ profile_add_event(struct buffer_instance *instance, const char *event_str, int s
 	return 0;
 }
 
-static void enable_profile(struct buffer_instance *instance)
+static void enable_profile(struct tracecmd_buffer_instance *instance)
 {
 	int stacktrace = 0;
 	int ret;
@@ -3733,7 +3608,7 @@ static void enable_profile(struct buffer_instance *instance)
 }
 
 static struct event_list *
-create_hook_event(struct buffer_instance *instance,
+create_hook_event(struct tracecmd_buffer_instance *instance,
 		  const char *system, const char *event)
 {
 	struct event_list *event_list;
@@ -3759,7 +3634,7 @@ create_hook_event(struct buffer_instance *instance,
 	return event_list;
 }
 
-static void add_hook(struct buffer_instance *instance, const char *arg)
+static void add_hook(struct tracecmd_buffer_instance *instance, const char *arg)
 {
 	struct event_list *event;
 	struct hook_list *hook;
@@ -3780,14 +3655,6 @@ static void add_hook(struct buffer_instance *instance, const char *arg)
 	}
 }
 
-void update_first_instance(struct buffer_instance *instance, int topt)
-{
-	if (topt || instance == &top_instance)
-		first_instance = &top_instance;
-	else
-		first_instance = buffer_instances;
-}
-
 enum {
 	OPT_bycomm	= 250,
 	OPT_stderr	= 251,
@@ -3804,7 +3671,7 @@ void trace_record (int argc, char **argv)
 	const char *option;
 	struct event_list *event = NULL;
 	struct event_list *last_event;
-	struct buffer_instance *instance = &top_instance;
+	struct tracecmd_buffer_instance *instance = &top_instance;
 	enum trace_type type = 0;
 	char *pids;
 	char *pid;
@@ -3828,7 +3695,7 @@ void trace_record (int argc, char **argv)
 
 	int c;
 
-	init_instance(instance);
+	tracecmd_init_instance(instance);
 
 	cpu_count = count_cpus();
 
@@ -3855,8 +3722,8 @@ void trace_record (int argc, char **argv)
 				usage(argv);
 				break;
 			case 'B':
-				instance = create_instance(optarg);
-				add_instance(instance);
+				instance = tracecmd_create_instance(optarg);
+				tracecmd_add_instance(instance);
 				break;
 			case 'a':
 				add_all_instances();
@@ -3871,7 +3738,7 @@ void trace_record (int argc, char **argv)
 			}
 
 		}
-		update_first_instance(instance, topt);
+		tracecmd_update_first_instance(instance, topt);
 		disable_tracing();
 		exit(0);
 	} else if (strcmp(argv[1], "restart") == 0) {
@@ -3886,8 +3753,8 @@ void trace_record (int argc, char **argv)
 				usage(argv);
 				break;
 			case 'B':
-				instance = create_instance(optarg);
-				add_instance(instance);
+				instance = tracecmd_create_instance(optarg);
+				tracecmd_add_instance(instance);
 				break;
 			case 'a':
 				add_all_instances();
@@ -3902,13 +3769,13 @@ void trace_record (int argc, char **argv)
 			}
 
 		}
-		update_first_instance(instance, topt);
+		tracecmd_update_first_instance(instance, topt);
 		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 */
+		struct tracecmd_buffer_instance *inst; /* iterator */
 
 		while ((c = getopt(argc-1, argv+1, "hab:B:td")) >= 0) {
 
@@ -3933,8 +3800,8 @@ void trace_record (int argc, char **argv)
 			}
 			case 'B':
 				last_specified_all = 0;
-				instance = create_instance(optarg);
-				add_instance(instance);
+				instance = tracecmd_create_instance(optarg);
+				tracecmd_add_instance(instance);
 				/* -d will remove keep */
 				instance->keep = 1;
 				break;
@@ -3957,19 +3824,19 @@ void trace_record (int argc, char **argv)
 						inst->keep = 0;
 					}
 				} else {
-					if (is_top_instance(instance))
+					if (tracecmd_is_top_instance(instance))
 						die("Can not delete top level buffer");
 					instance->keep = 0;
 				}
 				break;
 			}
 		}
-		update_first_instance(instance, topt);
+		tracecmd_update_first_instance(instance, topt);
 		disable_all(1);
 		set_buffer_size();
 		clear_filters();
 		clear_triggers();
-		remove_instances();
+		tracecmd_remove_instances();
 		clear_func_filters();
 		exit(0);
 	} else
@@ -4189,8 +4056,8 @@ void trace_record (int argc, char **argv)
 			instance->buffer_size = atoi(optarg);
 			break;
 		case 'B':
-			instance = create_instance(optarg);
-			add_instance(instance);
+			instance = tracecmd_create_instance(optarg);
+			tracecmd_add_instance(instance);
 			if (profile)
 				instance->profile = 1;
 			break;
@@ -4260,7 +4127,7 @@ void trace_record (int argc, char **argv)
 	} else
 		topt = 1;
 
-	update_first_instance(instance, topt);
+	tracecmd_update_first_instance(instance, topt);
 
 	if (!extract)
 		check_doing_something();
@@ -4270,7 +4137,7 @@ void trace_record (int argc, char **argv)
 		output_file = output;
 
 	if (!extract)
-		make_instances();
+		tracecmd_make_instances();
 
 	/* Save the state of tracing_on before starting */
 	for_all_instances(instance) {
@@ -4402,7 +4269,7 @@ void trace_record (int argc, char **argv)
 
 	set_plugin("nop");
 
-	remove_instances();
+	tracecmd_remove_instances();
 
 	/* If tracing_on was enabled before we started, set it on now */
 	for_all_instances(instance) {
diff --git a/trace-stat.c b/trace-stat.c
index 4d96b02..1add6a8 100644
--- a/trace-stat.c
+++ b/trace-stat.c
@@ -33,18 +33,13 @@
 #define BUFSIZ 1024
 #endif
 
-static inline int is_top_instance(struct buffer_instance *instance)
-{
-	return instance == &top_instance;
-}
-
-static int get_instance_file_fd(struct buffer_instance *instance,
+static int get_instance_file_fd(struct tracecmd_buffer_instance *instance,
 				const char *file)
 {
 	char *path;
 	int fd;
 
-	path = get_instance_file(instance, file);
+	path = tracecmd_get_instance_file(instance, file);
 	fd = open(path, O_RDONLY);
 	tracecmd_put_tracing_file(path);
 
@@ -118,8 +113,9 @@ char *get_file_content(const char *file)
 	return str;
 }
 
-static char *get_instance_file_content(struct buffer_instance *instance,
-				       const char *file)
+static char *
+get_instance_file_content(struct tracecmd_buffer_instance *instance,
+			  const char *file)
 {
 	char *str = NULL;
 	int fd;
@@ -134,7 +130,7 @@ static char *get_instance_file_content(struct buffer_instance *instance,
 	return str;
 }
 
-static void report_plugin(struct buffer_instance *instance)
+static void report_plugin(struct tracecmd_buffer_instance *instance)
 {
 	char *str;
 	char *cont;
@@ -326,7 +322,7 @@ process_event_enable(char *path, const char *system, const char *name,
 	free(file);
 }
 
-static void report_events(struct buffer_instance *instance)
+static void report_events(struct tracecmd_buffer_instance *instance)
 {
 	struct event_iter *iter;
 	char *str;
@@ -357,7 +353,7 @@ static void report_events(struct buffer_instance *instance)
 
 	free(str);
 
-	path = get_instance_file(instance, "events");
+	path = tracecmd_get_instance_file(instance, "events");
 	if (!path)
 		die("malloc");
 
@@ -439,7 +435,7 @@ process_event_filter(char *path, struct event_iter *iter, enum event_process *pr
 	free(file);
 }
 
-static void report_event_filters(struct buffer_instance *instance)
+static void report_event_filters(struct tracecmd_buffer_instance *instance)
 {
 	struct event_iter *iter;
 	char *path;
@@ -447,7 +443,7 @@ static void report_event_filters(struct buffer_instance *instance)
 	enum event_iter_type type;
 	enum event_process processed = PROCESSED_NONE;
 
-	path = get_instance_file(instance, "events");
+	path = tracecmd_get_instance_file(instance, "events");
 	if (!path)
 		die("malloc");
 
@@ -512,7 +508,7 @@ process_event_trigger(char *path, struct event_iter *iter, enum event_process *p
 	free(file);
 }
 
-static void report_event_triggers(struct buffer_instance *instance)
+static void report_event_triggers(struct tracecmd_buffer_instance *instance)
 {
 	struct event_iter *iter;
 	char *path;
@@ -520,7 +516,7 @@ static void report_event_triggers(struct buffer_instance *instance)
 	enum event_iter_type type;
 	enum event_process processed = PROCESSED_NONE;
 
-	path = get_instance_file(instance, "events");
+	path = tracecmd_get_instance_file(instance, "events");
 	if (!path)
 		die("malloc");
 
@@ -605,11 +601,11 @@ static void list_functions(const char *path, char *string)
 	free(str);
 }
 
-static void report_graph_funcs(struct buffer_instance *instance)
+static void report_graph_funcs(struct tracecmd_buffer_instance *instance)
 {
 	char *path;
 
-	path = get_instance_file(instance, "set_graph_function");
+	path = tracecmd_get_instance_file(instance, "set_graph_function");
 	if (!path)
 		die("malloc");
 
@@ -617,7 +613,7 @@ static void report_graph_funcs(struct buffer_instance *instance)
 	
 	tracecmd_put_tracing_file(path);
 
-	path = get_instance_file(instance, "set_graph_notrace");
+	path = tracecmd_get_instance_file(instance, "set_graph_notrace");
 	if (!path)
 		die("malloc");
 
@@ -626,11 +622,11 @@ static void report_graph_funcs(struct buffer_instance *instance)
 	tracecmd_put_tracing_file(path);
 }
 
-static void report_ftrace_filters(struct buffer_instance *instance)
+static void report_ftrace_filters(struct tracecmd_buffer_instance *instance)
 {
 	char *path;
 
-	path = get_instance_file(instance, "set_ftrace_filter");
+	path = tracecmd_get_instance_file(instance, "set_ftrace_filter");
 	if (!path)
 		die("malloc");
 
@@ -638,7 +634,7 @@ static void report_ftrace_filters(struct buffer_instance *instance)
 	
 	tracecmd_put_tracing_file(path);
 
-	path = get_instance_file(instance, "set_ftrace_notrace");
+	path = tracecmd_get_instance_file(instance, "set_ftrace_notrace");
 	if (!path)
 		die("malloc");
 
@@ -647,7 +643,7 @@ static void report_ftrace_filters(struct buffer_instance *instance)
 	tracecmd_put_tracing_file(path);
 }
 
-static void report_buffers(struct buffer_instance *instance)
+static void report_buffers(struct tracecmd_buffer_instance *instance)
 {
 #define FILE_SIZE 100
 	char *str;
@@ -702,7 +698,7 @@ static void report_buffers(struct buffer_instance *instance)
 	free(str);
 }
 
-static void report_clock(struct buffer_instance *instance)
+static void report_clock(struct tracecmd_buffer_instance *instance)
 {
 	char *str;
 	char *cont;
@@ -733,7 +729,7 @@ static void report_clock(struct buffer_instance *instance)
 	free(str);
 }
 
-static void report_cpumask(struct buffer_instance *instance)
+static void report_cpumask(struct tracecmd_buffer_instance *instance)
 {
 	char *str;
 	char *cont;
@@ -783,7 +779,7 @@ static void report_cpumask(struct buffer_instance *instance)
 	free(str);
 }
 
-static void report_latency(struct buffer_instance *instance)
+static void report_latency(struct tracecmd_buffer_instance *instance)
 {
 	char *str;
 	char *cont;
@@ -800,7 +796,7 @@ static void report_latency(struct buffer_instance *instance)
 	free(str);
 }
 
-static void report_probes(struct buffer_instance *instance,
+static void report_probes(struct tracecmd_buffer_instance *instance,
 			  const char *file, const char *string)
 {
 	char *str;
@@ -833,17 +829,17 @@ static void report_probes(struct buffer_instance *instance,
 	free(str);
 }
 
-static void report_kprobes(struct buffer_instance *instance)
+static void report_kprobes(struct tracecmd_buffer_instance *instance)
 {
 	report_probes(instance, "kprobe_events", "Kprobe events");
 }
 
-static void report_uprobes(struct buffer_instance *instance)
+static void report_uprobes(struct tracecmd_buffer_instance *instance)
 {
 	report_probes(instance, "uprobe_events", "Uprobe events");
 }
 
-static void report_traceon(struct buffer_instance *instance)
+static void report_traceon(struct tracecmd_buffer_instance *instance)
 {
 	char *str;
 	char *cont;
@@ -863,7 +859,7 @@ static void report_traceon(struct buffer_instance *instance)
 	free(str);
 }
 
-static void stat_instance(struct buffer_instance *instance)
+static void stat_instance(struct tracecmd_buffer_instance *instance)
 {
 	if (instance != &top_instance) {
 		if (instance != first_instance)
@@ -888,7 +884,7 @@ static void stat_instance(struct buffer_instance *instance)
 
 void trace_stat (int argc, char **argv)
 {
-	struct buffer_instance *instance = &top_instance;
+	struct tracecmd_buffer_instance *instance = &top_instance;
 	int topt = 0;
 	int c;
 
@@ -901,10 +897,10 @@ void trace_stat (int argc, char **argv)
 			usage(argv);
 			break;
 		case 'B':
-			instance = create_instance(optarg);
-			add_instance(instance);
+			instance = tracecmd_create_instance(optarg);
+			tracecmd_add_instance(instance);
 			/* top instance requires direct access */
-			if (!topt && is_top_instance(first_instance))
+			if (!topt && tracecmd_is_top_instance(first_instance))
 				first_instance = instance;
 			break;
 		case 't':
@@ -917,7 +913,7 @@ void trace_stat (int argc, char **argv)
 		}
 	}
 
-	update_first_instance(instance, topt);
+	tracecmd_update_first_instance(instance, topt);
 
 	for_all_instances(instance) {
 		stat_instance(instance);
diff --git a/trace-stream.c b/trace-stream.c
index 9ebe65b..924fb03 100644
--- a/trace-stream.c
+++ b/trace-stream.c
@@ -34,8 +34,8 @@
  * it to create the pevent and handle.
  */
 struct tracecmd_input *
-trace_stream_init(struct buffer_instance *instance, int cpu, int fd, int cpus,
-		  int profile, struct hook_list *hooks, int global)
+trace_stream_init(struct tracecmd_buffer_instance *instance, int cpu, int fd,
+		  int cpus, int profile, struct hook_list *hooks, int global)
 {
 	struct tracecmd_input *trace_input;
 	struct tracecmd_output *trace_output;
-- 
2.1.0

--
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