tracefs_instance_get_subbuf_size - Man Page

Helper functions for working with ring buffer sub buffers.

Synopsis

#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);

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

#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

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

Steven Rostedt <rostedt@goodmis.org[1]>
Tzvetomir Stoyanov <tz.stoyanov@gmail.com[2]>

Reporting Bugs

Report bugs to <linux-trace-devel@vger.kernel.org[3]>

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

Notes

  1. rostedt@goodmis.org
    mailto:rostedt@goodmis.org
  2. tz.stoyanov@gmail.com
    mailto:tz.stoyanov@gmail.com
  3. linux-trace-devel@vger.kernel.org
    mailto:linux-trace-devel@vger.kernel.org

Referenced By

The man page tracefs_instance_set_subbuf_size(3) is an alias of tracefs_instance_get_subbuf_size(3).

10/17/2024 libtracefs 1.8.1 libtracefs Manual