libtracefs(3)
=============

NAME
----
tracefs_instance_get_subbuf_size, tracefs_instance_set_subbuf_size - Helper functions for working with ring buffer sub buffers.

SYNOPSIS
--------
[verse]
--
*#include <tracefs.h>*

size_t *tracefs_instance_get_subbuf_size*(struct tracefs_instance pass:[*]_instance_);
int *tracefs_instance_set_subbuf_size*(struct tracefs_instance pass:[*]_instance_, size_t _size_);
--

DESCRIPTION
-----------
Helper functions for working with the sub-buffers of the tracing ring buffer.
The tracing ring buffer is broken up into *sub-buffers*. An event can not be
bigger than the data section of the sub-buffer (see *tep_get_sub_buffer_data_size*(3)).
By default, the ring buffer uses the architectures *page_size* as the default
size of the sub-buffer, but this can be limiting if there is a need for large
events, for example, the application wants to write large strings into
the trace_marker file.

The *tracefs_instance_get_subbuf_size()* returns the current size in kilobytes
fo the ring buffer sub-buffers.

The *tracefs_instance_set_subbuf_size()* will write the size in kilobytes of
what the new sub-buffer size should be. Note, that this is only a hint to what
the minimum sub-buffer size should be. It also does not take into account the
meta-data that is used by the sub-buffer, so the size written should be no less
than 16 bytes more than the maximum event size that will be used. The kernel
will likely make the sub-buffer size larger than specified, as it may need to
align the size for implementation purposes.

RETURN VALUE
------------
The *tracefs_instance_get_subbuf_size()* returns the size of the current
sub-buffer for the given _instance_ ring buffer or -1 on error.

The *tracefs_instance_set_subbuf_size()* will return 0 if it successfully set
the _instance_ ring buffer sub-buffer size in kilobytes, or -1 on error.

EXAMPLE
-------
[source,c]
--
#include <stdlib.h>
#include <tracefs.h>
#include <errno.h>

int main(int argc, char **argv)
{
	struct tep_handle *tep;
	ssize_t save_subsize;
	ssize_t subsize;
	char *trace;
	char buf[3000];
	int meta_size;
	int ret;
	int i;

	tep = tep_alloc();
	ret = tracefs_load_headers(NULL, tep);
	tep_free(tep);

	if (ret < 0) {
		perror("reading headers");
		exit(-1);
	}

	meta_size = tep_get_sub_buffer_size(tep) - tep_get_sub_buffer_data_size(tep);

	save_subsize = tracefs_instance_get_subbuf_size(NULL);
	if (save_subsize < 0) {
		printf("Changing sub-buffer size not available\n");
		exit(-1);
	}

	subsize = save_subsize * 1024;

	/* Have at least 4 writes fit on a sub-buffer */
	if (subsize - meta_size < sizeof(buf) *4 ) {
		subsize = ((sizeof(buf) * 4 + meta_size) + 1023) / 1024;
		tracefs_instance_set_subbuf_size(NULL, subsize);
	}

	for (i = 0; i < sizeof(buf) - 1; i++) {
		buf[i] = '0' + i % 10;
	}
	buf[i] = '\0';

	tracefs_instance_clear(NULL);

	for (i = 0; i < 4; i++) {
		ret = tracefs_printf(NULL, "%s\n", buf);
		if (ret < 0)
			perror("write");
	}

	trace = tracefs_instance_file_read(NULL, "trace", NULL);
	printf("%s\n", trace);
	free(trace);

	printf("Buffer size was: %zd * 1024\n",
	       tracefs_instance_get_subbuf_size(NULL));

	tracefs_instance_set_subbuf_size(NULL, save_subsize);
}
--
FILES
-----
[verse]
--
*tracefs.h*
	Header file to include in order to have access to the library APIs.
*-ltracefs*
	Linker switch to add when building a program that uses the library.
--

SEE ALSO
--------
*libtracefs*(3),
*libtraceevent*(3),
*trace-cmd*(1)

AUTHOR
------
[verse]
--
*Steven Rostedt* <rostedt@goodmis.org>
*Tzvetomir Stoyanov* <tz.stoyanov@gmail.com>
--
REPORTING BUGS
--------------
Report bugs to  <linux-trace-devel@vger.kernel.org>

LICENSE
-------
libtracefs is Free Software licensed under the GNU LGPL 2.1

RESOURCES
---------
https://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git/

COPYING
-------
Copyright \(C) 2020 VMware, Inc. Free use of this software is granted under
the terms of the GNU Public License (GPL).
