On Fri, Aug 1, 2025 at 12:15 AM Alexei Starovoitov <alexei.starovoitov@xxxxxxxxx> wrote: > > 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 Great, I'll have a try on this way! > 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.