[DTrace-devel] [PATCH 1/2] Add a cpuinfos BPF map
Eugene Loh
eugene.loh at oracle.com
Wed Apr 2 19:18:41 UTC 2025
On 4/2/25 05:37, Alan Maguire wrote:
> On 01/04/2025 23:54, Eugene Loh wrote:
>> Here is a proposal. First, two observations:
>>
>> 1. (As Alan pointed out to me in a facepalm moment), one can write a
>> simple D script to check enqueue_task_*()'s rq->cpu against the current
>> CPU. He and I both find that the two CPUs are generally -- but not
>> always -- the same. So, the strictly correct thing to do is use the rq-
>>> cpu value, even though you can just use the current CPU and be correct
>> "99%" of the time.
>>
>> 2. A BPF program can access per-cpu-array values on other CPUs. Well, I
>> guess you need commit 0734311 ("bpf: add bpf_map_lookup_percpu_elem for
>> percpu map"). That's in 5.18. That is, UEK9.
>>
> Nice find; this commit looks relatively standalone so you could file a
> bug to request backport to UEK7U3 if it'd help. No guarantees of course
> but it's not too distant from 5.15 and we've backported helpers before
> and managed to deal with kABI issues.
Kris was leaning to not relying on this helper since it's not ubiquitous
and I agree. In particular, it's not too hard just to have a global map
that one accesses by cpuid (self or other).
>> So my proposal is to leave the per-cpu cpuinfo BPF map alone. Perform a
>> runtime test whether bpf_map_lookup_percpu_elem() is available. If so,
>> do that cross-CPU lookup -- the 2/2 patch I posted -- but using the new
>> helper function. If not, use a simpler on-CPU lookup, which should be
>> right "99%" of the time. (I have a simple patch that uses the current
>> CPU. Pretty simple.)
> For what it's worth, I think it'd probably be more valuable to preserve
> an accurate CPU id
Kris agrees and I'm on board.
> and worry less about the other fields in the
> cpuinfo_t; i.e. when tracing, I mostly care about accurate cpu id info
> and never look at the other data in a cpuinfo_t. So if it wasn't
> possible to retrieve accurate cpuinfo_t info via a cross-cpu lookup via
> the 5.19 helper, it might be better to fake up a cpuinfo_t with a
> correct cpu id and other fields unset. I'm probably missing it, but I
> don't see where those fields are populated currently;
dt_conf.c sets sets cpu_id and cpu_chip.
https://docs.oracle.com/en/operating-systems/oracle-linux/dtrace-guide/dtrace-ref-DTraceProviders.html#dt_schedargs_prov
says cpu_pset and cpu_lgrp are unsupported.
Anyhow, I have a patch (will probably post today) that changes the
per-cpu array to a global map and so we should be able to get the CPUs
right.
> tried this a few
> times and they look to be unset for me aside from cpu id:
>
> # dtrace -n 'BEGIN { print((cpuinfo_t *)curcpu); } '
> dtrace: description 'BEGIN ' matched 1 probe
> CPU ID FUNCTION:NAME
> 5 1 :BEGIN 0xffffe05e7fb61b00 = *
> (cpuinfo_t) {
> .cpu_id = (processorid_t)5,
> }
>
> ^C
>
> # dtrace -n 'BEGIN { print((cpuinfo_t *)curcpu); } '
> dtrace: description 'BEGIN ' matched 1 probe
> CPU ID FUNCTION:NAME
> 7 1 :BEGIN 0xffffe05e7fbe1b00 = *
> (cpuinfo_t) {
> .cpu_id = (processorid_t)7,
> }
>
> ^C
>
> If those other fields are unset, maybe there would be a way to invoke a
> translator to create a cpuinfo_t from just the cpu id? Not sure about
> the mechanics here, but my worry would be that it could be exactly the
> times where we are on cpu x and enqueueing on cpu y we might be
> interested in, and if that info wasn't preserved we might miss something
> valuable about how the system was behaving. Anyway thanks for fixing up
> the sched provider, it's really useful!
>
> Alan
More information about the DTrace-devel
mailing list