Skip to content

Commit

Permalink
rtla: Add --trace-buffer-size option
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Daniel Bristot de Oliveira committed May 16, 2024
1 parent fb9e90a commit e9a4062
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 5 deletions.
3 changes: 3 additions & 0 deletions Documentation/tools/rtla/common_options.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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.
2 changes: 1 addition & 1 deletion tools/tracing/rtla/Makefile.config
Original file line number Diff line number Diff line change
Expand Up @@ -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)"))
Expand Down
13 changes: 12 additions & 1 deletion tools/tracing/rtla/src/osnoise_hist.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ struct osnoise_hist_params {
int bucket_size;
int entries;
int warmup;
int buffer_size;
};

struct osnoise_hist_cpu {
Expand Down Expand Up @@ -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,
};

Expand Down Expand Up @@ -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. */
Expand Down Expand Up @@ -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");
}
Expand Down Expand Up @@ -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;
}
}

/*
Expand Down
14 changes: 13 additions & 1 deletion tools/tracing/rtla/src/osnoise_top.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
};

Expand Down Expand Up @@ -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. */
Expand Down Expand Up @@ -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");
}
Expand Down Expand Up @@ -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;
}
}

/*
Expand Down
14 changes: 13 additions & 1 deletion tools/tracing/rtla/src/timerlat_hist.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ struct timerlat_hist_params {
int bucket_size;
int entries;
int warmup;
int buffer_size;
};

struct timerlat_hist_cpu {
Expand Down Expand Up @@ -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,
};

Expand Down Expand Up @@ -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. */
Expand Down Expand Up @@ -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");
}
Expand Down Expand Up @@ -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) {
Expand Down
14 changes: 13 additions & 1 deletion tools/tracing/rtla/src/timerlat_top.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
};

Expand Down Expand Up @@ -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. */
Expand Down Expand Up @@ -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");
}
Expand Down Expand Up @@ -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) {
Expand Down
15 changes: 15 additions & 0 deletions tools/tracing/rtla/src/trace.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
1 change: 1 addition & 0 deletions tools/tracing/rtla/src/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

0 comments on commit e9a4062

Please sign in to comment.