On Wed, Jul 16, 2025 at 11:24 AM Peter Zijlstra <peterz@xxxxxxxxxxxxx> wrote: > > On Wed, Jul 16, 2025 at 09:56:11AM -0700, Alexei Starovoitov wrote: > > > Maybe Peter has better ideas ? > > Is it possible to express runqueues::nr_pinned as an alias? > > extern unsigned int __attribute__((alias("runqueues.nr_pinned"))) this_nr_pinned; > > And use: > > __this_cpu_inc(&this_nr_pinned); > > > This syntax doesn't actually seem to work; but can we construct > something like that? Yeah. Iant is right. It's a string and not a pointer dereference. It never worked. Few options: 1. struct rq { +#ifdef CONFIG_SMP + unsigned int nr_pinned; +#endif /* runqueue lock: */ raw_spinlock_t __lock; @@ -1271,9 +1274,6 @@ struct rq { struct cpuidle_state *idle_state; #endif -#ifdef CONFIG_SMP - unsigned int nr_pinned; -#endif but ugly... 2. static unsigned int nr_pinned_offset __ro_after_init __used; RUNTIME_CONST(nr_pinned_offset, nr_pinned_offset) overkill for what's needed 3. OFFSET(RQ_nr_pinned, rq, nr_pinned); then #include <generated/asm-offsets.h> imo the best. 4. Maybe we should extend clang/gcc to support attr(preserve_access_index) on x86 and other architectures ;) We rely heavily on it in bpf backend. Then one can simply write: struct rq___my { unsigned int nr_pinned; } __attribute__((preserve_access_index)); struct rq___my *rq; rq = this_rq(); rq->nr_pinned++; and the compiler will do its magic of offset adjustment. That's how BPF CORE works.