mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-18 03:23:53 -04:00
rtla/timerlat_top: Add timerlat user-space support
Add the support for running timerlat threads in user-space. In this
mode, enabled with -u/--user-threads, timerlat dispatches user-space
processes that will loop in the timerlat_fd, measuring the overhead
for going to user-space and then returning to the kernel - in addition
to the existing measurements.
Here is one example of the tool's output with -u enabled:
$ sudo timerlat top -u -d 600 -q
Timer Latency
0 00:10:01 | IRQ Timer Latency (us) | Thread Timer Latency (us) | Ret user Timer Latency (us)
CPU COUNT | cur min avg max | cur min avg max | cur min avg max
0 #600001 | 0 0 0 3 | 2 1 2 9 | 3 2 3 15
1 #600001 | 0 0 0 2 | 2 1 2 13 | 2 2 3 18
2 #600001 | 0 0 0 10 | 2 1 2 16 | 3 2 3 20
3 #600001 | 0 0 0 7 | 2 1 2 10 | 3 2 3 11
4 #600000 | 0 0 0 16 | 2 1 2 41 | 3 2 3 58
5 #600000 | 0 0 0 3 | 2 1 2 10 | 3 2 3 13
6 #600000 | 0 0 0 5 | 2 1 2 7 | 3 2 3 10
7 #600000 | 0 0 0 1 | 2 1 2 7 | 3 2 3 10
The tuning setup like -p or -C work for the user-space threads as well.
Link: https://lkml.kernel.org/r/758ad2292a0a1d884138d08219e1a0f572d257a2.1686066600.git.bristot@kernel.org
Cc: William White <chwhite@redhat.com>
Cc: Jonathan Corbet <corbet@lwn.net>
Tested-by: Juri Lelli <juri.lelli@redhat.com>
Signed-off-by: Daniel Bristot de Oliveira <bristot@kernel.org>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
This commit is contained in:
committed by
Steven Rostedt (Google)
parent
7bc4d3089a
commit
cdca4f4e5e
@@ -626,6 +626,64 @@ static int get_self_cgroup(char *self_cg, int sizeof_self_cg)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* set_comm_cgroup - Set cgroup to pid_t pid
|
||||
*
|
||||
* If cgroup argument is not NULL, the threads will move to the given cgroup.
|
||||
* Otherwise, the cgroup of the calling, i.e., rtla, thread will be used.
|
||||
*
|
||||
* Supports cgroup v2.
|
||||
*
|
||||
* Returns 1 on success, 0 otherwise.
|
||||
*/
|
||||
int set_pid_cgroup(pid_t pid, const char *cgroup)
|
||||
{
|
||||
char cgroup_path[MAX_PATH - strlen("/cgroup.procs")];
|
||||
char cgroup_procs[MAX_PATH];
|
||||
char pid_str[24];
|
||||
int retval;
|
||||
int cg_fd;
|
||||
|
||||
retval = find_mount("cgroup2", cgroup_path, sizeof(cgroup_path));
|
||||
if (!retval) {
|
||||
err_msg("Did not find cgroupv2 mount point\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!cgroup) {
|
||||
retval = get_self_cgroup(&cgroup_path[strlen(cgroup_path)],
|
||||
sizeof(cgroup_path) - strlen(cgroup_path));
|
||||
if (!retval) {
|
||||
err_msg("Did not find self cgroup\n");
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
snprintf(&cgroup_path[strlen(cgroup_path)],
|
||||
sizeof(cgroup_path) - strlen(cgroup_path), "%s/", cgroup);
|
||||
}
|
||||
|
||||
snprintf(cgroup_procs, MAX_PATH, "%s/cgroup.procs", cgroup_path);
|
||||
|
||||
debug_msg("Using cgroup path at: %s\n", cgroup_procs);
|
||||
|
||||
cg_fd = open(cgroup_procs, O_RDWR);
|
||||
if (cg_fd < 0)
|
||||
return 0;
|
||||
|
||||
snprintf(pid_str, sizeof(pid_str), "%d\n", pid);
|
||||
|
||||
retval = write(cg_fd, pid_str, strlen(pid_str));
|
||||
if (retval < 0)
|
||||
err_msg("Error setting cgroup attributes for pid:%s - %s\n",
|
||||
pid_str, strerror(errno));
|
||||
else
|
||||
debug_msg("Set cgroup attributes for pid:%s\n", pid_str);
|
||||
|
||||
close(cg_fd);
|
||||
|
||||
return (retval >= 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* set_comm_cgroup - Set cgroup to threads starting with char *comm_prefix
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user