tracefs_instance_get_subbuf_size, tracefs_instance_set_subbuf_size − Helper functions for working with ring buffer sub buffers.
#include <tracefs.h>
size_t
tracefs_instance_get_subbuf_size(struct
tracefs_instance *instance);
int tracefs_instance_set_subbuf_size(struct
tracefs_instance *instance, size_t size);
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.
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.
#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);
}
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.
libtracefs(3), libtraceevent(3), trace−cmd(1)
Steven
Rostedt
<[email protected]
[1]
>
Tzvetomir Stoyanov
<[email protected]
[2]
>
Report bugs to <linux−trace−[email protected] [3] >
libtracefs is Free Software licensed under the GNU LGPL 2.1
https://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git/
Copyright (C) 2020 VMware, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL).
|
1. |
mailto:[email protected]
|
2. |
mailto:[email protected]
|
3. |
mailto:[email protected]