On Mon, Jul 28, 2025 at 2:20 AM Menglong Dong <menglong8.dong@xxxxxxxxx> wrote: > > 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 :/ 2 maybe easier, but it's an overkill. I still think asm-offset is cleaner. arch/xx shouldn't be used, of course, since this nr_pinned should be generic for all archs. We can do something similar to drivers/memory/emif-asm-offsets.c and do that within kernel/sched/. rq-offsets.c as you said. It will generate rq-offsets.h in a build dir that can be #include-d. I thought about another alternative (as a derivative of 1): split nr_pinned from 'struct rq' into its own per-cpu variable, but I don't think that will work, since rq_has_pinned_tasks() doesn't always operate on this_rq(). So the acceptable choices are realistically 1 and 3 and rq-offsets.c seems cleaner. Pls give it another try.