[PATCH 4/7] ARM: Use hack from powerpc to get current cpu number
flat view
STALE1864d
From: Keith Packard <hidden>
Date: 2021-09-07 22:00:47
Also in:
linux-arm-kernel, lkml
Subsystem:
arm port, the rest · Maintainers:
Russell King, Linus Torvalds
When we enable THREAD_INFO_IN_TASK, the cpu number will disappear from thread_info and reappear in task_struct. As we cannot include linux/sched.h in asm/smp.h, there's no way to use that struct type in the raw_smp_processor_id macro. Instead, a hack from the powerpc code is used. This pulls the TI_CPU offset out of asm-offsets.h and uses that to find the cpu value. Signed-off-by: Keith Packard <redacted> --- arch/arm/Makefile | 8 ++++++++ arch/arm/include/asm/smp.h | 18 +++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 415c3514573a..6752995d2914 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile@@ -284,6 +284,14 @@ stack_protector_prepare: prepare0 $(eval GCC_PLUGINS_CFLAGS += $(SSP_PLUGIN_CFLAGS)) endif +ifdef CONFIG_SMP +prepare: task_cpu_prepare + +PHONY += task_cpu_prepare +task_cpu_prepare: prepare0 + $(eval KBUILD_CFLAGS += -D_TI_CPU=$(shell awk '{if ($$2 == "TI_CPU") print $$3;}' include/generated/asm-offsets.h)) +endif + all: $(notdir $(KBUILD_IMAGE))
diff --git a/arch/arm/include/asm/smp.h b/arch/arm/include/asm/smp.h
index d43b64635d77..f77ba3753bc4 100644
--- a/arch/arm/include/asm/smp.h
+++ b/arch/arm/include/asm/smp.h@@ -15,7 +15,23 @@ # error "<asm/smp.h> included in non-SMP build" #endif -#define raw_smp_processor_id() (current_thread_info()->cpu) +/* + * This is particularly ugly: it appears we can't actually get the + * definition of task_struct here, but we need access to the CPU this + * task is running on, which is stored in task_struct when + * THREAD_INFO_IN_TASK is set. Instead of using task_struct we're + * using TI_CPU which is extracted from asm-offsets.h by kbuild to get + * the current processor ID. + * + * This also needs to be safeguarded when building asm-offsets.s + * because at that time TI_CPU is not defined yet. + */ +#ifndef _TI_CPU +#define raw_smp_processor_id() (0) +#else +#define raw_smp_processor_id() \ + (*(unsigned int *)((void *)current_thread_info() + _TI_CPU)) +#endif struct seq_file;
--
2.33.0