Skip to content

Commit

Permalink
tools/rv: Allow rv list to filter for container
Browse files Browse the repository at this point in the history
Add possibility to supply the container name to rv list:

  # rv list sched
  mon1
  mon2
  mon3

This lists only monitors in sched, without indentation.
Supplying -h, any option (string starting with -) or more than 1
argument will still print the usage.
Passing a non-existent container prints nothing and passing no container
continues to print all monitors, showing indentation for nested
monitors, reported after their container.

Cc: Ingo Molnar <mingo@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Juri Lelli <juri.lelli@redhat.com>
Link: https://lore.kernel.org/20250305140406.350227-10-gmonaco@redhat.com
Signed-off-by: Gabriele Monaco <gmonaco@redhat.com>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
  • Loading branch information
Gabriele Monaco authored and Steven Rostedt (Google) committed Mar 24, 2025
1 parent 03abeaa commit 4ffef95
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 23 deletions.
2 changes: 1 addition & 1 deletion tools/verification/rv/include/in_kernel.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
// SPDX-License-Identifier: GPL-2.0
int ikm_list_monitors(void);
int ikm_list_monitors(char *container);
int ikm_run_monitor(char *monitor, int argc, char **argv);
36 changes: 27 additions & 9 deletions tools/verification/rv/src/in_kernel.c
Original file line number Diff line number Diff line change
Expand Up @@ -180,19 +180,25 @@ static char *ikm_read_desc(char *monitor_name)
/*
* ikm_fill_monitor_definition - fill monitor's definition
*
* Returns -1 on error, 0 otherwise.
* Returns -1 on error, 1 if the monitor does not belong in the container, 0 otherwise.
* container can be NULL
*/
static int ikm_fill_monitor_definition(char *name, struct monitor *ikm)
static int ikm_fill_monitor_definition(char *name, struct monitor *ikm, char *container)
{
int enabled;
char *desc, *nested_name;

nested_name = strstr(name, ":");
if (nested_name) {
/* it belongs in container if it starts with "container:" */
if (container && strstr(name, container) != name)
return 1;
*nested_name = '/';
++nested_name;
ikm->nested = 1;
} else {
if (container)
return 1;
nested_name = name;
ikm->nested = 0;
}
Expand Down Expand Up @@ -328,12 +334,12 @@ static int ikm_has_id(char *monitor_name)
*
* Returns 0 on success, -1 otherwise.
*/
int ikm_list_monitors(void)
int ikm_list_monitors(char *container)
{
char *available_monitors;
struct monitor ikm = {0};
char *curr, *next;
int retval;
int retval, list_monitor = 0;

available_monitors = tracefs_instance_file_read(NULL, "rv/available_monitors", NULL);

Expand All @@ -347,17 +353,29 @@ int ikm_list_monitors(void)
next = strstr(curr, "\n");
*next = '\0';

retval = ikm_fill_monitor_definition(curr, &ikm);
if (retval)
retval = ikm_fill_monitor_definition(curr, &ikm, container);
if (retval < 0)
err_msg("ikm: error reading %d in kernel monitor, skipping\n", curr);

printf("%s%-*s %s %s\n", ikm.nested ? " - " : "",
ikm.nested ? MAX_DA_NAME_LEN - 3 : MAX_DA_NAME_LEN,
ikm.name, ikm.desc, ikm.enabled ? "[ON]" : "[OFF]");
if (!retval) {
int indent = ikm.nested && !container;

list_monitor = 1;
printf("%s%-*s %s %s\n", indent ? " - " : "",
indent ? MAX_DA_NAME_LEN - 3 : MAX_DA_NAME_LEN,
ikm.name, ikm.desc, ikm.enabled ? "[ON]" : "[OFF]");
}
curr = ++next;

} while (strlen(curr));

if (!list_monitor) {
if (container)
printf("-- No monitor found in container %s --\n", container);
else
printf("-- No monitor found --\n");
}

free(available_monitors);

return 0;
Expand Down
38 changes: 25 additions & 13 deletions tools/verification/rv/src/rv.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,30 +41,42 @@ static void rv_list(int argc, char **argv)
{
static const char *const usage[] = {
"",
" usage: rv list [-h]",
" usage: rv list [-h] [container]",
"",
" list all available monitors",
"",
" -h/--help: print this menu",
"",
" [container]: list only monitors in this container",
NULL,
};
int i;

if (argc > 1) {
int i, print_help = 0, retval = 0;
char *container = NULL;

if (argc == 2) {
if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) {
print_help = 1;
retval = 0;
} else if (argv[1][0] == '-') {
/* assume invalid option */
print_help = 1;
retval = 1;
} else
container = argv[1];
} else if (argc > 2) {
/* more than 2 is always usage */
print_help = 1;
retval = 1;
}
if (print_help) {
fprintf(stderr, "rv version %s\n", VERSION);

/* more than 1 is always usage */
for (i = 0; usage[i]; i++)
fprintf(stderr, "%s\n", usage[i]);

/* but only -h is valid */
if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))
exit(0);
else
exit(1);
exit(retval);
}

ikm_list_monitors();
ikm_list_monitors(container);

exit(0);
}

Expand Down

0 comments on commit 4ffef95

Please sign in to comment.