rtla: Add --trace-buffer-size option
authorDaniel Bristot de Oliveira <bristot@kernel.org>
Thu, 16 May 2024 14:15:22 +0000 (16:15 +0200)
committerDaniel Bristot de Oliveira <bristot@kernel.org>
Thu, 16 May 2024 14:44:34 +0000 (16:44 +0200)
Add the option allow the users to set a different buffer size for the
trace. For example, in large systems, the user might be interested on
reducing the trace buffer to avoid large tracing files.

The buffer size is specified in kB, and it is only affecting
the tracing instance.

The function trace_set_buffer_size() appears on libtracefs v1.6,
so increase the minimum required version on Makefile.config.

Link: https://lkml.kernel.org/r/e7c9ca5b3865f28e131a49ec3b984fadf2d056c6.1715860611.git.bristot@kernel.org
Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: John Kacur <jkacur@redhat.com>
Signed-off-by: Daniel Bristot de Oliveira <bristot@kernel.org>
Documentation/tools/rtla/common_options.rst
tools/tracing/rtla/Makefile.config
tools/tracing/rtla/src/osnoise_hist.c
tools/tracing/rtla/src/osnoise_top.c
tools/tracing/rtla/src/timerlat_hist.c
tools/tracing/rtla/src/timerlat_top.c
tools/tracing/rtla/src/trace.c
tools/tracing/rtla/src/trace.h

index a96ea0e..7ac7b75 100644 (file)
@@ -54,6 +54,9 @@
 
         After starting the workload, let it run for *s* seconds before starting collecting the data, allowing the system to warm-up. Statistical data generated during warm-up is discarded.
 
+**--trace-buffer-size** *kB*
+        Set the per-cpu trace buffer size in kB for the tracing output.
+
 **-h**, **--help**
 
         Print help menu.
index 6d4ba77..0b7ecfb 100644 (file)
@@ -3,7 +3,7 @@
 STOP_ERROR :=
 
 LIBTRACEEVENT_MIN_VERSION = 1.5
-LIBTRACEFS_MIN_VERSION = 1.3
+LIBTRACEFS_MIN_VERSION = 1.6
 
 define lib_setup
   $(eval LIB_INCLUDES += $(shell sh -c "$(PKG_CONFIG) --cflags lib$(1)"))
index c6100ff..198a17a 100644 (file)
@@ -43,6 +43,7 @@ struct osnoise_hist_params {
        int                     bucket_size;
        int                     entries;
        int                     warmup;
+       int                     buffer_size;
 };
 
 struct osnoise_hist_cpu {
@@ -469,6 +470,7 @@ static void osnoise_hist_usage(char *usage)
                "               d:runtime[us|ms|s]:period[us|ms|s] - use SCHED_DEADLINE with runtime and period",
                "                                                      in nanoseconds",
                "            --warm-up: let the workload run for s seconds before collecting data",
+               "            --trace-buffer-size kB: set the per-cpu trace buffer size in kB",
                NULL,
        };
 
@@ -533,13 +535,14 @@ static struct osnoise_hist_params
                        {"trigger",             required_argument,      0, '4'},
                        {"filter",              required_argument,      0, '5'},
                        {"warm-up",             required_argument,      0, '6'},
+                       {"trace-buffer-size",   required_argument,      0, '7'},
                        {0, 0, 0, 0}
                };
 
                /* getopt_long stores the option index here. */
                int option_index = 0;
 
-               c = getopt_long(argc, argv, "a:c:C::b:d:e:E:DhH:p:P:r:s:S:t::T:01234:5:6:",
+               c = getopt_long(argc, argv, "a:c:C::b:d:e:E:DhH:p:P:r:s:S:t::T:01234:5:6:7:",
                                 long_options, &option_index);
 
                /* detect the end of the options. */
@@ -685,6 +688,9 @@ static struct osnoise_hist_params
                case '6':
                        params->warmup = get_llong_from_str(optarg);
                        break;
+               case '7':
+                       params->buffer_size = get_llong_from_str(optarg);
+                       break;
                default:
                        osnoise_hist_usage("Invalid option");
                }
@@ -891,6 +897,11 @@ int osnoise_hist_main(int argc, char *argv[])
                                goto out_hist;
                }
 
+               if (params->buffer_size > 0) {
+                       retval = trace_set_buffer_size(&record->trace, params->buffer_size);
+                       if (retval)
+                               goto out_hist;
+               }
        }
 
        /*
index 53a074c..7e5aab2 100644 (file)
@@ -41,6 +41,7 @@ struct osnoise_top_params {
        int                     cgroup;
        int                     hk_cpus;
        int                     warmup;
+       int                     buffer_size;
        cpu_set_t               hk_cpu_set;
        struct sched_attr       sched_param;
        struct trace_events     *events;
@@ -309,6 +310,7 @@ static void osnoise_top_usage(struct osnoise_top_params *params, char *usage)
                "               d:runtime[us|ms|s]:period[us|ms|s] - use SCHED_DEADLINE with runtime and period",
                "                                                      in nanoseconds",
                "            --warm-up s: let the workload run for s seconds before collecting data",
+               "            --trace-buffer-size kB: set the per-cpu trace buffer size in kB",
                NULL,
        };
 
@@ -384,13 +386,14 @@ struct osnoise_top_params *osnoise_top_parse_args(int argc, char **argv)
                        {"trigger",             required_argument,      0, '0'},
                        {"filter",              required_argument,      0, '1'},
                        {"warm-up",             required_argument,      0, '2'},
+                       {"trace-buffer-size",   required_argument,      0, '3'},
                        {0, 0, 0, 0}
                };
 
                /* getopt_long stores the option index here. */
                int option_index = 0;
 
-               c = getopt_long(argc, argv, "a:c:C::d:De:hH:p:P:qr:s:S:t::T:0:1:2:",
+               c = getopt_long(argc, argv, "a:c:C::d:De:hH:p:P:qr:s:S:t::T:0:1:2:3:",
                                 long_options, &option_index);
 
                /* Detect the end of the options. */
@@ -517,6 +520,9 @@ struct osnoise_top_params *osnoise_top_parse_args(int argc, char **argv)
                case '2':
                        params->warmup = get_llong_from_str(optarg);
                        break;
+               case '3':
+                       params->buffer_size = get_llong_from_str(optarg);
+                       break;
                default:
                        osnoise_top_usage(params, "Invalid option");
                }
@@ -725,6 +731,12 @@ int osnoise_top_main(int argc, char **argv)
                        if (retval)
                                goto out_top;
                }
+
+               if (params->buffer_size > 0) {
+                       retval = trace_set_buffer_size(&record->trace, params->buffer_size);
+                       if (retval)
+                               goto out_top;
+               }
        }
 
        /*
index 6eb6e38..d4bab86 100644 (file)
@@ -54,6 +54,7 @@ struct timerlat_hist_params {
        int                     bucket_size;
        int                     entries;
        int                     warmup;
+       int                     buffer_size;
 };
 
 struct timerlat_hist_cpu {
@@ -669,6 +670,7 @@ static void timerlat_hist_usage(char *usage)
                "         -k/--kernel-threads: use timerlat kernel-space threads instead of rtla user-space threads",
                "         -U/--user-load: enable timerlat for user-defined user-space workload",
                "            --warm-up s: let the workload run for s seconds before collecting data",
+               "            --trace-buffer-size kB: set the per-cpu trace buffer size in kB",
                NULL,
        };
 
@@ -745,13 +747,14 @@ static struct timerlat_hist_params
                        {"no-aa",               no_argument,            0, '9'},
                        {"dump-task",           no_argument,            0, '\1'},
                        {"warm-up",             required_argument,      0, '\2'},
+                       {"trace-buffer-size",   required_argument,      0, '\3'},
                        {0, 0, 0, 0}
                };
 
                /* getopt_long stores the option index here. */
                int option_index = 0;
 
-               c = getopt_long(argc, argv, "a:c:C::b:d:e:E:DhH:i:knp:P:s:t::T:uU0123456:7:8:9\1\2:",
+               c = getopt_long(argc, argv, "a:c:C::b:d:e:E:DhH:i:knp:P:s:t::T:uU0123456:7:8:9\1\2:\3",
                                 long_options, &option_index);
 
                /* detect the end of the options. */
@@ -926,6 +929,9 @@ static struct timerlat_hist_params
                case '\2':
                        params->warmup = get_llong_from_str(optarg);
                        break;
+               case '\3':
+                       params->buffer_size = get_llong_from_str(optarg);
+                       break;
                default:
                        timerlat_hist_usage("Invalid option");
                }
@@ -1179,6 +1185,12 @@ int timerlat_hist_main(int argc, char *argv[])
                        if (retval)
                                goto out_hist;
                }
+
+               if (params->buffer_size > 0) {
+                       retval = trace_set_buffer_size(&record->trace, params->buffer_size);
+                       if (retval)
+                               goto out_hist;
+               }
        }
 
        if (!params->no_aa) {
index 0acfefe..3a23e8d 100644 (file)
@@ -47,6 +47,7 @@ struct timerlat_top_params {
        int                     kernel_workload;
        int                     pretty_output;
        int                     warmup;
+       int                     buffer_size;
        cpu_set_t               hk_cpu_set;
        struct sched_attr       sched_param;
        struct trace_events     *events;
@@ -479,6 +480,7 @@ static void timerlat_top_usage(char *usage)
                "         -k/--kernel-threads: use timerlat kernel-space threads instead of rtla user-space threads",
                "         -U/--user-load: enable timerlat for user-defined user-space workload",
                "            --warm-up s: let the workload run for s seconds before collecting data",
+               "            --trace-buffer-size kB: set the per-cpu trace buffer size in kB",
                NULL,
        };
 
@@ -547,13 +549,14 @@ static struct timerlat_top_params
                        {"dump-tasks",          no_argument,            0, '4'},
                        {"aa-only",             required_argument,      0, '5'},
                        {"warm-up",             required_argument,      0, '6'},
+                       {"trace-buffer-size",   required_argument,      0, '7'},
                        {0, 0, 0, 0}
                };
 
                /* getopt_long stores the option index here. */
                int option_index = 0;
 
-               c = getopt_long(argc, argv, "a:c:C::d:De:hH:i:knp:P:qs:t::T:uU0:1:2:345:6:",
+               c = getopt_long(argc, argv, "a:c:C::d:De:hH:i:knp:P:qs:t::T:uU0:1:2:345:6:7:",
                                 long_options, &option_index);
 
                /* detect the end of the options. */
@@ -716,6 +719,9 @@ static struct timerlat_top_params
                case '6':
                        params->warmup = get_llong_from_str(optarg);
                        break;
+               case '7':
+                       params->buffer_size = get_llong_from_str(optarg);
+                       break;
                default:
                        timerlat_top_usage("Invalid option");
                }
@@ -973,6 +979,12 @@ int timerlat_top_main(int argc, char *argv[])
                        if (retval)
                                goto out_top;
                }
+
+               if (params->buffer_size > 0) {
+                       retval = trace_set_buffer_size(&record->trace, params->buffer_size);
+                       if (retval)
+                               goto out_top;
+               }
        }
 
        if (!params->no_aa) {
index e1ba6d9..170a706 100644 (file)
@@ -540,3 +540,18 @@ int trace_is_off(struct trace_instance *tool, struct trace_instance *trace)
 
        return 0;
 }
+
+/*
+ * trace_set_buffer_size - set the per-cpu tracing buffer size.
+ */
+int trace_set_buffer_size(struct trace_instance *trace, int size)
+{
+       int retval;
+
+       debug_msg("Setting trace buffer size to %d Kb\n", size);
+       retval = tracefs_instance_set_buffer_size(trace->inst, size, -1);
+       if (retval)
+               err_msg("Error setting trace buffer size\n");
+
+       return retval;
+}
index 2e9a89a..c7c92dc 100644 (file)
@@ -48,3 +48,4 @@ int trace_events_enable(struct trace_instance *instance,
 int trace_event_add_filter(struct trace_events *event, char *filter);
 int trace_event_add_trigger(struct trace_events *event, char *trigger);
 int trace_is_off(struct trace_instance *tool, struct trace_instance *trace);
+int trace_set_buffer_size(struct trace_instance *trace, int size);