Re: [PATCH 5/7] powerpc, arm64: Mark __switch_to() as __sched

From: Mark Rutland
Date: Fri Oct 22 2021 - 13:40:20 EST


On Fri, Oct 22, 2021 at 05:09:38PM +0200, Peter Zijlstra wrote:
> Unlike most of the other architectures, PowerPC and ARM64 have
> __switch_to() as a C function which remains on the stack.

For clarity, could we say:

Unlike most of the other architectures, PowerPC and ARM64 have
__switch_to() as a C function which is visible when unwinding from
their assembly switch function.

... since both arm64 and powerpc are branch-and-link architectures, and
this isn't stacked; it's in the GPR context saved by the switch
assembly.

> Their
> respective __get_wchan() skips one stack frame unconditionally,
> without testing is_sched_functions().

and similarly s/stack frame/caller/ here.

>
> Mark them __sched such that we can forgo that special case.
>
> Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx>
> ---
> arch/arm64/kernel/process.c | 4 ++--
> arch/powerpc/kernel/process.c | 4 ++--
> 2 files changed, 4 insertions(+), 4 deletions(-)
>
> --- a/arch/arm64/kernel/process.c
> +++ b/arch/arm64/kernel/process.c
> @@ -490,8 +490,8 @@ void update_sctlr_el1(u64 sctlr)
> /*
> * Thread switching.
> */
> -__notrace_funcgraph struct task_struct *__switch_to(struct task_struct *prev,
> - struct task_struct *next)
> +__notrace_funcgraph __sched
> +struct task_struct *__switch_to(struct task_struct *prev, struct task_struct *next)

As this only matters for the call to our cpu_switch_to() assembly, this
looks sufficient to me. This only changes the placement of the function
and doesn't affect the existing tracing restrictions, so I don't think
this should have any adverse effect.

For testing, this doesn't adversly affect the existing unwinder (which
should obviously be true since we skip the entry anyway, but hey..).

Regardless of the commit message wording:

Reviewed-by: Mark Rutland <mark.rutland@xxxxxxx> [arm64]
Tested-by: Mark Rutland <mark.rutland@xxxxxxx> [arm64]

Thanks,
Mark.

> {
> struct task_struct *last;
>
> --- a/arch/powerpc/kernel/process.c
> +++ b/arch/powerpc/kernel/process.c
> @@ -1201,8 +1201,8 @@ static inline void restore_sprs(struct t
>
> }
>
> -struct task_struct *__switch_to(struct task_struct *prev,
> - struct task_struct *new)
> +__sched struct task_struct *__switch_to(struct task_struct *prev,
> + struct task_struct *new)
> {
> struct thread_struct *new_thread, *old_thread;
> struct task_struct *last;
>
>