On Thu, Jul 17, 2025 at 6:35 AM Alexei Starovoitov <alexei.starovoitov@xxxxxxxxx> wrote: > > 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. I had a try. The struct rq is not visible to asm-offsets.c, so we can't define it in arch/xx/kernel/asm-offsets.c. Do you mean to define a similar rq-offsets.c in kernel/sched/ ? It will be more complex than the way 2, and I think the second way 2 is easier :/ > > 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.