]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
perf kwork: Constify control data for BPF
authorNamhyung Kim <namhyung@kernel.org>
Mon, 2 Sep 2024 20:05:13 +0000 (13:05 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 3 Sep 2024 14:50:20 +0000 (11:50 -0300)
The control knobs set before loading BPF programs should be declared as
'const volatile' so that it can be optimized by the BPF core.

Committer testing:

  root@x1:~# perf kwork report --use-bpf
  Starting trace, Hit <Ctrl+C> to stop and report
  ^C
    Kwork Name                     | Cpu  | Total Runtime | Count     | Max runtime   | Max runtime start   | Max runtime end     |
   --------------------------------------------------------------------------------------------------------------------------------
    (w)intel_atomic_commit_work [  | 0009 |     18.680 ms |         2 |     18.553 ms |     362410.681580 s |     362410.700133 s |
    (w)pm_runtime_work             | 0007 |     13.300 ms |         1 |     13.300 ms |     362410.254996 s |     362410.268295 s |
    (w)intel_atomic_commit_work [  | 0009 |      9.846 ms |         2 |      9.717 ms |     362410.172352 s |     362410.182069 s |
    (w)acpi_ec_event_processor     | 0002 |      8.106 ms |         1 |      8.106 ms |     362410.463187 s |     362410.471293 s |
    (s)SCHED:7                     | 0000 |      1.351 ms |       106 |      0.063 ms |     362410.658017 s |     362410.658080 s |
    i915:157                       | 0008 |      0.994 ms |        13 |      0.361 ms |     362411.222125 s |     362411.222486 s |
    (s)SCHED:7                     | 0001 |      0.703 ms |        98 |      0.047 ms |     362410.245004 s |     362410.245051 s |
    (s)SCHED:7                     | 0005 |      0.674 ms |        42 |      0.074 ms |     362411.483039 s |     362411.483113 s |
    (s)NET_RX:3                    | 0001 |      0.556 ms |        10 |      0.079 ms |     362411.066388 s |     362411.066467 s |
  <SNIP>

  root@x1:~# perf trace -e bpf --max-events 5 perf kwork report --use-bpf
       0.000 ( 0.016 ms): perf/2948007 bpf(cmd: 36, uattr: 0x7ffededa6660, size: 8)          = -1 EOPNOTSUPP (Operation not supported)
       0.026 ( 0.106 ms): perf/2948007 bpf(cmd: PROG_LOAD, uattr: 0x7ffededa6390, size: 148) = 12
       0.152 ( 0.032 ms): perf/2948007 bpf(cmd: PROG_LOAD, uattr: 0x7ffededa6450, size: 148) = 12
      26.247 ( 0.138 ms): perf/2948007 bpf(cmd: PROG_LOAD, uattr: 0x7ffededa6300, size: 148) = 12
      26.396 ( 0.012 ms): perf/2948007 bpf(uattr: 0x7ffededa64b0, size: 80)                  = 12
  Starting trace, Hit <Ctrl+C> to stop and report
  root@x1:~#

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Song Liu <song@kernel.org>
Cc: Yang Jihong <yangjihong@bytedance.com>
Link: https://lore.kernel.org/r/20240902200515.2103769-4-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/bpf_kwork.c
tools/perf/util/bpf_kwork_top.c
tools/perf/util/bpf_skel/kwork_top.bpf.c
tools/perf/util/bpf_skel/kwork_trace.bpf.c

index 44f0f708a15d6a14f2f07eeed558ca26e35def3d..6c7126b7670dd0c9a2b0a5b55d74cbbc5f4ea5cd 100644 (file)
@@ -176,8 +176,6 @@ static int setup_filters(struct perf_kwork *kwork)
                        bpf_map_update_elem(fd, &cpu.cpu, &val, BPF_ANY);
                }
                perf_cpu_map__put(map);
-
-               skel->bss->has_cpu_filter = 1;
        }
 
        if (kwork->profile_name != NULL) {
@@ -197,8 +195,6 @@ static int setup_filters(struct perf_kwork *kwork)
 
                key = 0;
                bpf_map_update_elem(fd, &key, kwork->profile_name, BPF_ANY);
-
-               skel->bss->has_name_filter = 1;
        }
 
        return 0;
@@ -239,6 +235,11 @@ int perf_kwork__trace_prepare_bpf(struct perf_kwork *kwork)
                        class_bpf->load_prepare(kwork);
        }
 
+       if (kwork->cpu_list != NULL)
+               skel->rodata->has_cpu_filter = 1;
+       if (kwork->profile_name != NULL)
+               skel->rodata->has_name_filter = 1;
+
        if (kwork_trace_bpf__load(skel)) {
                pr_debug("Failed to load kwork trace skeleton\n");
                goto out;
index 22a3b00a1e23f92999b835649a73b7202af5edd7..7261cad43468d7a4cfcaf4df0e1849b6fb057e67 100644 (file)
@@ -151,14 +151,12 @@ static int setup_filters(struct perf_kwork *kwork)
                        bpf_map_update_elem(fd, &cpu.cpu, &val, BPF_ANY);
                }
                perf_cpu_map__put(map);
-
-               skel->bss->has_cpu_filter = 1;
        }
 
        return 0;
 }
 
-int perf_kwork__top_prepare_bpf(struct perf_kwork *kwork __maybe_unused)
+int perf_kwork__top_prepare_bpf(struct perf_kwork *kwork)
 {
        struct bpf_program *prog;
        struct kwork_class *class;
@@ -193,6 +191,9 @@ int perf_kwork__top_prepare_bpf(struct perf_kwork *kwork __maybe_unused)
                        class_bpf->load_prepare();
        }
 
+       if (kwork->cpu_list)
+               skel->rodata->has_cpu_filter = 1;
+
        if (kwork_top_bpf__load(skel)) {
                pr_debug("Failed to load kwork top skeleton\n");
                goto out;
index 84c15ccbab44ccc9668d7b85296ab3b0482412c2..594da91965a2f6c9e082d9ef7d183fbb923a479a 100644 (file)
@@ -84,7 +84,7 @@ struct {
 
 int enabled = 0;
 
-int has_cpu_filter = 0;
+const volatile int has_cpu_filter = 0;
 
 __u64 from_timestamp = 0;
 __u64 to_timestamp = 0;
index 063c124e099938edb1879cedebf9151e41999f2a..cbd79bc4b3302d812cf569781b66f64598d62e58 100644 (file)
@@ -68,8 +68,9 @@ struct {
 } perf_kwork_name_filter SEC(".maps");
 
 int enabled = 0;
-int has_cpu_filter = 0;
-int has_name_filter = 0;
+
+const volatile int has_cpu_filter = 0;
+const volatile int has_name_filter = 0;
 
 static __always_inline int local_strncmp(const char *s1,
                                         unsigned int sz, const char *s2)