[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAM9d7cijyKgCt7su96yM9OWgHP5Hh1UMQh+iBskO+m+rb_y5ww@mail.gmail.com>
Date: Tue, 14 Jun 2022 14:54:41 -0700
From: Namhyung Kim <namhyung@...nel.org>
To: Yang Jihong <yangjihong1@...wei.com>
Cc: Peter Zijlstra <peterz@...radead.org>,
Ingo Molnar <mingo@...hat.com>,
Arnaldo Carvalho de Melo <acme@...nel.org>,
Mark Rutland <mark.rutland@....com>,
Alexander Shishkin <alexander.shishkin@...ux.intel.com>,
Jiri Olsa <jolsa@...nel.org>,
linux-kernel <linux-kernel@...r.kernel.org>,
linux-perf-users <linux-perf-users@...r.kernel.org>
Subject: Re: [RFC 09/13] perf kwork: Add workqueue report support
On Mon, Jun 13, 2022 at 2:48 AM Yang Jihong <yangjihong1@...wei.com> wrote:
>
> Implements workqueue report function.
>
> test case:
>
> # perf kwork -k workqueue rep
>
> Kwork Name | Cpu | Total Runtime | Frequency | Max runtime | Max runtime start | Max runtime end |
> ---------------------------------------------------------------------------------------------------------------------------
> (w)0xffffffff83e09fa0 | 0001 | 2152.678 ms | 194 | 12.376 ms | 2059361.546621 s | 2059361.558997 s |
> (w)0xffff888332fea180 | 0000 | 17.125 ms | 301 | 1.018 ms | 2059358.441070 s | 2059358.442089 s |
> (w)0xffff8881035a83d8 | 0007 | 7.556 ms | 3 | 3.212 ms | 2059362.614643 s | 2059362.617855 s |
> (w)0xffff888102fc14a0 | 0002 | 7.080 ms | 5 | 1.962 ms | 2059365.421753 s | 2059365.423714 s |
> (w)0xffffffff82f7da00 | 0000 | 4.277 ms | 7 | 3.778 ms | 2059360.851063 s | 2059360.854841 s |
> (w)0xffffffff8305d680 | 0006 | 1.796 ms | 1 | 1.796 ms | 2059360.046818 s | 2059360.048613 s |
> (w)0xffff8883339e9040 | 0005 | 1.659 ms | 2 | 1.619 ms | 2059361.266051 s | 2059361.267670 s |
> (w)0xffff888333de9040 | 0007 | 1.121 ms | 5 | 0.783 ms | 2059368.238059 s | 2059368.238842 s |
> (w)0xffff888332fe9040 | 0000 | 0.990 ms | 4 | 0.911 ms | 2059359.604075 s | 2059359.604986 s |
> (w)0xffff8883331e9040 | 0001 | 0.244 ms | 6 | 0.046 ms | 2059362.689277 s | 2059362.689323 s |
> (w)0xffff888102e44400 | 0007 | 0.239 ms | 2 | 0.137 ms | 2059363.117537 s | 2059363.117674 s |
> (w)0xffff8883333ea180 | 0002 | 0.141 ms | 5 | 0.049 ms | 2059365.423784 s | 2059365.423833 s |
> (w)0xffffffff83062f28 | 0006 | 0.084 ms | 2 | 0.047 ms | 2059358.208033 s | 2059358.208080 s |
> (w)0xffffffff8305ca48 | 0003 | 0.078 ms | 2 | 0.041 ms | 2059361.071371 s | 2059361.071412 s |
> (w)0xffff8883337e9040 | 0004 | 0.062 ms | 1 | 0.062 ms | 2059362.605723 s | 2059362.605785 s |
> (w)0xffff8881035a81e8 | 0001 | 0.056 ms | 1 | 0.056 ms | 2059363.118231 s | 2059363.118287 s |
> (w)0xffff8883335e9040 | 0003 | 0.026 ms | 1 | 0.026 ms | 2059358.573397 s | 2059358.573423 s |
> (w)0xffffffff83062e70 | 0006 | 0.023 ms | 1 | 0.023 ms | 2059368.398864 s | 2059368.398888 s |
> (w)0xffffffff83e06480 | 0002 | 0.000 ms | 1 | 0.000 ms | 2059359.986792 s | 2059359.986792 s |
Using "function" in the tracepoint and symbolizing it would be
far more intuitive.
Thanks,
Namhyung
> ---------------------------------------------------------------------------------------------------------------------------
>
> Signed-off-by: Yang Jihong <yangjihong1@...wei.com>
> ---
> tools/perf/builtin-kwork.c | 65 ++++++++++++++++++++++++++++++++++++--
> 1 file changed, 63 insertions(+), 2 deletions(-)
>
> diff --git a/tools/perf/builtin-kwork.c b/tools/perf/builtin-kwork.c
> index 1eb416faf8ef..f27ffad223a3 100644
> --- a/tools/perf/builtin-kwork.c
> +++ b/tools/perf/builtin-kwork.c
> @@ -813,16 +813,77 @@ static struct kwork_class kwork_softirq = {
> .cluster_name = softirq_cluster_name,
> };
>
> +static struct kwork_class kwork_workqueue;
> +static int process_workqueue_execute_start_event(struct perf_tool *tool,
> + struct evsel *evsel,
> + struct perf_sample *sample,
> + struct machine *machine)
> +{
> + struct perf_kwork *kwork = container_of(tool, struct perf_kwork, tool);
> +
> + if (kwork->tp_handler->entry_event)
> + return kwork->tp_handler->entry_event(kwork, &kwork_workqueue,
> + evsel, sample, machine);
> +
> + return 0;
> +}
> +
> +static int process_workqueue_execute_end_event(struct perf_tool *tool,
> + struct evsel *evsel,
> + struct perf_sample *sample,
> + struct machine *machine)
> +{
> + struct perf_kwork *kwork = container_of(tool, struct perf_kwork, tool);
> +
> + if (kwork->tp_handler->exit_event)
> + return kwork->tp_handler->exit_event(kwork, &kwork_workqueue,
> + evsel, sample, machine);
> +
> + return 0;
> +}
> +
> const struct evsel_str_handler workqueue_tp_handlers[] = {
> { "workqueue:workqueue_activate_work", NULL, },
> - { "workqueue:workqueue_execute_start", NULL, },
> - { "workqueue:workqueue_execute_end", NULL, },
> + { "workqueue:workqueue_execute_start", process_workqueue_execute_start_event, },
> + { "workqueue:workqueue_execute_end", process_workqueue_execute_end_event, },
> };
>
> +static int workqueue_class_init(struct kwork_class *class,
> + struct perf_session *session)
> +{
> + if (perf_session__set_tracepoints_handlers(session,
> + workqueue_tp_handlers)) {
> + pr_debug("Failed to set workqueue tracepoints handlers\n");
> + return -1;
> + }
> +
> + class->cluster_root = RB_ROOT_CACHED;
> + return 0;
> +}
> +
> +static void workqueue_cluster_init(struct kwork_class *class,
> + struct kwork_cluster *cluster,
> + struct evsel *evsel,
> + struct perf_sample *sample)
> +{
> + cluster->name = NULL;
> + cluster->class = class;
> + cluster->cpu = sample->cpu;
> + cluster->id = evsel__intval(evsel, sample, "work");
> +}
> +
> +static void workqueue_cluster_name(struct kwork_cluster *cluster, char *buf, int len)
> +{
> + snprintf(buf, len, "(w)0x%" PRIx64, cluster->id);
> +}
> +
> static struct kwork_class kwork_workqueue = {
> .name = "workqueue",
> .nr_tracepoints = 3,
> .tp_handlers = workqueue_tp_handlers,
> + .class_init = workqueue_class_init,
> + .cluster_init = workqueue_cluster_init,
> + .cluster_name = workqueue_cluster_name,
> };
>
> static struct kwork_class *kwork_class_supported_list[KWORK_CLASS_MAX] = {
> --
> 2.30.GIT
>
Powered by blists - more mailing lists