aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt (Google) <rostedt@goodmis.org>2022-11-14 15:45:21 -0500
committerSteven Rostedt (Google) <rostedt@goodmis.org>2022-11-14 15:54:51 -0500
commit48c026fbb430e712c489d7e5671b8711ef23fdf2 (patch)
tree07f263f39641c252b3eed9593044c2562d8c37a2
parent936193d852423321c0baf1ca7e09a8de50bd46ca (diff)
downloadlibtracefs-48c026fbb430e712c489d7e5671b8711ef23fdf2.tar.gz
libtracefs: Add tracefs_instance_set_buffer_size() API
Add functionality that sets the ring buffer size. Link: https://lore.kernel.org/linux-trace-devel/20221114204522.2433500-4-rostedt@goodmis.org Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
-rw-r--r--Documentation/libtracefs-instances-utils.txt10
-rw-r--r--Documentation/libtracefs.txt1
-rw-r--r--include/tracefs.h1
-rw-r--r--src/tracefs-instance.c27
4 files changed, 38 insertions, 1 deletions
diff --git a/Documentation/libtracefs-instances-utils.txt b/Documentation/libtracefs-instances-utils.txt
index 9bec8a9..bc8c9a7 100644
--- a/Documentation/libtracefs-instances-utils.txt
+++ b/Documentation/libtracefs-instances-utils.txt
@@ -4,7 +4,7 @@ libtracefs(3)
NAME
----
tracefs_instance_get_name, tracefs_instance_get_trace_dir, tracefs_instances_walk, tracefs_instance_exists,
-tracefs_instance_get_buffer_size - Helper functions for working with tracing instances.
+tracefs_instance_get_buffer_size, tracefs_instance_set_buffer_size - Helper functions for working with tracing instances.
SYNOPSIS
--------
@@ -17,6 +17,7 @@ const char pass:[*]*tracefs_instance_get_trace_dir*(struct tracefs_instance pass
int *tracefs_instances_walk*(int (pass:[*]_callback_)(const char pass:[*], void pass:[*]), void pass:[*]_context)_;
bool *tracefs_instance_exists*(const char pass:[*]_name_);
size_t *tracefs_instance_get_buffer_size*(struct tracefs_instance pass:[*]_instance_, int _cpu_);
+int *tracefs_instance_set_buffer_size*(struct tracefs_instance pass:[*]_instance_, size_t _size_, int _cpu_);
--
DESCRIPTION
@@ -42,6 +43,11 @@ The *tracefs_instace_get_buffer_size()* returns the size of the ring buffer. If
is negative, it returns the total size of all the per CPU ring buffers, otherwise
it returns the size of the per CPU ring buffer for _cpu_.
+The *tracefs_instance_set_buffer_size()* function sets the size of the ring buffer.
+If _cpu_ is negative, then it sets all the per CPU ring buffers to _size_ (note
+the total size is the number of CPUs * _size_). If _cpu_ is specified, then it only
+sets the size of the per CPU ring buffer.
+
RETURN VALUE
------------
The *tracefs_instance_get_name()* returns a string or NULL in case of the top
@@ -59,6 +65,8 @@ exists in the system or false otherwise.
The *tracefs_instance_get_buffer_size()* returns the size of the ring buffer depending on
the _cpu_ value passed in, or -1 on error.
+The *tracefs_instance_set_buffer_size()* returns zero on success and -1 on error.
+
EXAMPLE
-------
[source,c]
diff --git a/Documentation/libtracefs.txt b/Documentation/libtracefs.txt
index 3b485a0..73c4997 100644
--- a/Documentation/libtracefs.txt
+++ b/Documentation/libtracefs.txt
@@ -46,6 +46,7 @@ Trace instances:
int *tracefs_instance_get_affinity_set*(struct tracefs_instance pass:[*]_instance_, cpu_set_t pass:[*]_set_, size_t _set_size_);
char pass:[*]*tracefs_instance_get_affinity_raw*(struct tracefs_instance pass:[*]_instance_);
size_t *tracefs_instance_get_buffer_size*(struct tracefs_instance pass:[*]_instance_, int _cpu_);
+ int *tracefs_instance_set_buffer_size*(struct tracefs_instance pass:[*]_instance_, size_t _size_, int _cpu_);
Trace events:
char pass:[*]pass:[*]*tracefs_event_systems*(const char pass:[*]_tracing_dir_);
diff --git a/include/tracefs.h b/include/tracefs.h
index 3391deb..5ff0c6f 100644
--- a/include/tracefs.h
+++ b/include/tracefs.h
@@ -56,6 +56,7 @@ char *tracefs_instance_get_affinity_raw(struct tracefs_instance *instance);
int tracefs_instance_get_affinity_set(struct tracefs_instance *instance,
cpu_set_t *set, size_t set_size);
ssize_t tracefs_instance_get_buffer_size(struct tracefs_instance *instance, int cpu);
+int tracefs_instance_set_buffer_size(struct tracefs_instance *instance, size_t size, int cpu);
char **tracefs_instances(const char *regex);
bool tracefs_instance_exists(const char *name);
diff --git a/src/tracefs-instance.c b/src/tracefs-instance.c
index 206f8c9..6905f61 100644
--- a/src/tracefs-instance.c
+++ b/src/tracefs-instance.c
@@ -400,6 +400,33 @@ ssize_t tracefs_instance_get_buffer_size(struct tracefs_instance *instance, int
return size;
}
+int tracefs_instance_set_buffer_size(struct tracefs_instance *instance, size_t size, int cpu)
+{
+ char *path;
+ char *val;
+ int ret;
+
+ ret = asprintf(&val, "%zd", size);
+ if (ret < 0)
+ return ret;
+
+ if (cpu < 0) {
+ ret = tracefs_instance_file_write(instance, "buffer_size_kb", val);
+ } else {
+ ret = asprintf(&path, "per_cpu/cpu%d/buffer_size_kb", cpu);
+ if (ret < 0) {
+ free(val);
+ return ret;
+ }
+
+ ret = tracefs_instance_file_write(instance, path, "val");
+ free(path);
+ }
+ free(val);
+
+ return ret < 0 ? -1 : 0;
+}
+
/**
* tracefs_instance_get_trace_dir - return the top trace directory, where the instance is confuigred
* @instance: ftrace instance