Re: Inlining migrate_disable/enable. Was: [PATCH bpf-next v2 02/18] x86,bpf: add bpf_global_caller for global trampoline
From: Menglong Dong <hidden>
Date: 2025-08-01 01:43:08
Also in:
bpf, lkml
On Fri, Aug 1, 2025 at 12:15 AM Alexei Starovoitov [off-list ref] wrote:
On Mon, Jul 28, 2025 at 2:20 AM Menglong Dong [off-list ref] wrote:quoted
On Thu, Jul 17, 2025 at 6:35 AM Alexei Starovoitov [off-list ref] wrote:quoted
On Wed, Jul 16, 2025 at 11:24 AM Peter Zijlstra [off-list ref] wrote:quoted
On Wed, Jul 16, 2025 at 09:56:11AM -0700, Alexei Starovoitov wrote:quoted
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; -#endifbut 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.