Re: [PATCH v2 5/7] sched: move CPU field back into thread_info if THREAD_INFO_IN_TASK=y

From: Ard Biesheuvel
Date: Thu Sep 30 2021 - 09:12:43 EST


On Thu, 30 Sept 2021 at 15:09, Christophe Leroy
<christophe.leroy@xxxxxxxxxx> wrote:
>
>
>
> Le 30/09/2021 à 14:58, Ard Biesheuvel a écrit :
> > THREAD_INFO_IN_TASK moved the CPU field out of thread_info, but this
> > causes some issues on architectures that define raw_smp_processor_id()
> > in terms of this field, due to the fact that #include'ing linux/sched.h
> > to get at struct task_struct is problematic in terms of circular
> > dependencies.
> >
> > Given that thread_info and task_struct are the same data structure
> > anyway when THREAD_INFO_IN_TASK=y, let's move it back so that having
> > access to the type definition of struct thread_info is sufficient to
> > reference the CPU number of the current task.
> >
> > Note that this requires THREAD_INFO_IN_TASK's definition of the
> > task_thread_info() helper to be updated, as task_cpu() takes a
> > pointer-to-const, whereas task_thread_info() (which is used to generate
> > lvalues as well), needs a non-const pointer. So make it a macro instead.
> >
> > Signed-off-by: Ard Biesheuvel <ardb@xxxxxxxxxx>
> > Acked-by: Catalin Marinas <catalin.marinas@xxxxxxx>
> > Acked-by: Mark Rutland <mark.rutland@xxxxxxx>
> > Acked-by: Michael Ellerman <mpe@xxxxxxxxxxxxxx>
> > ---
> > arch/arm64/kernel/asm-offsets.c | 1 -
> > arch/arm64/kernel/head.S | 2 +-
> > arch/powerpc/kernel/asm-offsets.c | 2 +-
> > arch/powerpc/kernel/smp.c | 2 +-
> > include/linux/sched.h | 13 +------------
> > kernel/sched/sched.h | 4 ----
> > 6 files changed, 4 insertions(+), 20 deletions(-)
> >
> > diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c
> > index cee9f3e9f906..0bfc048221af 100644
> > --- a/arch/arm64/kernel/asm-offsets.c
> > +++ b/arch/arm64/kernel/asm-offsets.c
> > @@ -27,7 +27,6 @@
> > int main(void)
> > {
> > DEFINE(TSK_ACTIVE_MM, offsetof(struct task_struct, active_mm));
> > - DEFINE(TSK_CPU, offsetof(struct task_struct, cpu));
> > BLANK();
> > DEFINE(TSK_TI_CPU, offsetof(struct task_struct, thread_info.cpu));
> > DEFINE(TSK_TI_FLAGS, offsetof(struct task_struct, thread_info.flags));
> > diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
> > index 17962452e31d..6a98f1a38c29 100644
> > --- a/arch/arm64/kernel/head.S
> > +++ b/arch/arm64/kernel/head.S
> > @@ -412,7 +412,7 @@ SYM_FUNC_END(__create_page_tables)
> > scs_load \tsk
> >
> > adr_l \tmp1, __per_cpu_offset
> > - ldr w\tmp2, [\tsk, #TSK_CPU]
> > + ldr w\tmp2, [\tsk, #TSK_TI_CPU]
>
> Why do you need to change the name ?
>
> For powerpc64, you leave TASK_CPU.
>

Because arm64 has a clear idiom here, where TSK_TI_ is used for
thread_info fields accessed via a task_struct pointer. Also, it only
occurs once in the code.

Power does not seem to have this idiom, and TASK_CPU is used in many
more places, so I don't think it makes sense to change its name.


> > ldr \tmp1, [\tmp1, \tmp2, lsl #3]
> > set_this_cpu_offset \tmp1
> > .endm
> > diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
> > index e563d3222d69..e37e4546034e 100644
> > --- a/arch/powerpc/kernel/asm-offsets.c
> > +++ b/arch/powerpc/kernel/asm-offsets.c
> > @@ -93,7 +93,7 @@ int main(void)
> > #endif /* CONFIG_PPC64 */
> > OFFSET(TASK_STACK, task_struct, stack);
> > #ifdef CONFIG_SMP
> > - OFFSET(TASK_CPU, task_struct, cpu);
> > + OFFSET(TASK_CPU, task_struct, thread_info.cpu);
> > #endif
> >
> > #ifdef CONFIG_LIVEPATCH
>
> ...