1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
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).
|