| From 4b301af5df16203e515be1ad887d6820c8d3e6a2 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 31 Aug 2021 13:48:34 +0200 |
| Subject: drivers: base: cacheinfo: Get rid of DEFINE_SMP_CALL_CACHE_FUNCTION() |
| |
| From: Thomas Gleixner <tglx@linutronix.de> |
| |
| [ Upstream commit 4b92d4add5f6dcf21275185c997d6ecb800054cd ] |
| |
| DEFINE_SMP_CALL_CACHE_FUNCTION() was usefel before the CPU hotplug rework |
| to ensure that the cache related functions are called on the upcoming CPU |
| because the notifier itself could run on any online CPU. |
| |
| The hotplug state machine guarantees that the callbacks are invoked on the |
| upcoming CPU. So there is no need to have this SMP function call |
| obfuscation. That indirection was missed when the hotplug notifiers were |
| converted. |
| |
| This also solves the problem of ARM64 init_cache_level() invoking ACPI |
| functions which take a semaphore in that context. That's invalid as SMP |
| function calls run with interrupts disabled. Running it just from the |
| callback in context of the CPU hotplug thread solves this. |
| |
| Fixes: 8571890e1513 ("arm64: Add support for ACPI based firmware tables") |
| Reported-by: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Tested-by: Guenter Roeck <linux@roeck-us.net> |
| Acked-by: Will Deacon <will@kernel.org> |
| Acked-by: Peter Zijlstra <peterz@infradead.org> |
| Link: https://lore.kernel.org/r/871r69ersb.ffs@tglx |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/arm64/kernel/cacheinfo.c | 7 ++----- |
| arch/mips/kernel/cacheinfo.c | 7 ++----- |
| arch/riscv/kernel/cacheinfo.c | 7 ++----- |
| arch/x86/kernel/cpu/cacheinfo.c | 7 ++----- |
| include/linux/cacheinfo.h | 18 ------------------ |
| 5 files changed, 8 insertions(+), 38 deletions(-) |
| |
| diff --git a/arch/arm64/kernel/cacheinfo.c b/arch/arm64/kernel/cacheinfo.c |
| index 0bf0a835122f..d17414cbb89a 100644 |
| --- a/arch/arm64/kernel/cacheinfo.c |
| +++ b/arch/arm64/kernel/cacheinfo.c |
| @@ -45,7 +45,7 @@ static void ci_leaf_init(struct cacheinfo *this_leaf, |
| this_leaf->type = type; |
| } |
| |
| -static int __init_cache_level(unsigned int cpu) |
| +int init_cache_level(unsigned int cpu) |
| { |
| unsigned int ctype, level, leaves, fw_level; |
| struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu); |
| @@ -80,7 +80,7 @@ static int __init_cache_level(unsigned int cpu) |
| return 0; |
| } |
| |
| -static int __populate_cache_leaves(unsigned int cpu) |
| +int populate_cache_leaves(unsigned int cpu) |
| { |
| unsigned int level, idx; |
| enum cache_type type; |
| @@ -99,6 +99,3 @@ static int __populate_cache_leaves(unsigned int cpu) |
| } |
| return 0; |
| } |
| - |
| -DEFINE_SMP_CALL_CACHE_FUNCTION(init_cache_level) |
| -DEFINE_SMP_CALL_CACHE_FUNCTION(populate_cache_leaves) |
| diff --git a/arch/mips/kernel/cacheinfo.c b/arch/mips/kernel/cacheinfo.c |
| index 3ea95568ece4..1c19a0698308 100644 |
| --- a/arch/mips/kernel/cacheinfo.c |
| +++ b/arch/mips/kernel/cacheinfo.c |
| @@ -28,7 +28,7 @@ do { \ |
| leaf++; \ |
| } while (0) |
| |
| -static int __init_cache_level(unsigned int cpu) |
| +int init_cache_level(unsigned int cpu) |
| { |
| struct cpuinfo_mips *c = ¤t_cpu_data; |
| struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu); |
| @@ -80,7 +80,7 @@ static void fill_cpumask_cluster(int cpu, cpumask_t *cpu_map) |
| cpumask_set_cpu(cpu1, cpu_map); |
| } |
| |
| -static int __populate_cache_leaves(unsigned int cpu) |
| +int populate_cache_leaves(unsigned int cpu) |
| { |
| struct cpuinfo_mips *c = ¤t_cpu_data; |
| struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu); |
| @@ -109,6 +109,3 @@ static int __populate_cache_leaves(unsigned int cpu) |
| |
| return 0; |
| } |
| - |
| -DEFINE_SMP_CALL_CACHE_FUNCTION(init_cache_level) |
| -DEFINE_SMP_CALL_CACHE_FUNCTION(populate_cache_leaves) |
| diff --git a/arch/riscv/kernel/cacheinfo.c b/arch/riscv/kernel/cacheinfo.c |
| index 0bc86e5f8f3f..9d46c8575a61 100644 |
| --- a/arch/riscv/kernel/cacheinfo.c |
| +++ b/arch/riscv/kernel/cacheinfo.c |
| @@ -31,7 +31,7 @@ static void ci_leaf_init(struct cacheinfo *this_leaf, |
| | CACHE_WRITE_ALLOCATE; |
| } |
| |
| -static int __init_cache_level(unsigned int cpu) |
| +int init_cache_level(unsigned int cpu) |
| { |
| struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu); |
| struct device_node *np = of_cpu_device_node_get(cpu); |
| @@ -67,7 +67,7 @@ static int __init_cache_level(unsigned int cpu) |
| return 0; |
| } |
| |
| -static int __populate_cache_leaves(unsigned int cpu) |
| +int populate_cache_leaves(unsigned int cpu) |
| { |
| struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu); |
| struct cacheinfo *this_leaf = this_cpu_ci->info_list; |
| @@ -99,6 +99,3 @@ static int __populate_cache_leaves(unsigned int cpu) |
| |
| return 0; |
| } |
| - |
| -DEFINE_SMP_CALL_CACHE_FUNCTION(init_cache_level) |
| -DEFINE_SMP_CALL_CACHE_FUNCTION(populate_cache_leaves) |
| diff --git a/arch/x86/kernel/cpu/cacheinfo.c b/arch/x86/kernel/cpu/cacheinfo.c |
| index 9d863e8f9b3f..4a393023f5ac 100644 |
| --- a/arch/x86/kernel/cpu/cacheinfo.c |
| +++ b/arch/x86/kernel/cpu/cacheinfo.c |
| @@ -956,7 +956,7 @@ static void ci_leaf_init(struct cacheinfo *this_leaf, |
| this_leaf->priv = base->nb; |
| } |
| |
| -static int __init_cache_level(unsigned int cpu) |
| +int init_cache_level(unsigned int cpu) |
| { |
| struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu); |
| |
| @@ -985,7 +985,7 @@ static void get_cache_id(int cpu, struct _cpuid4_info_regs *id4_regs) |
| id4_regs->id = c->apicid >> index_msb; |
| } |
| |
| -static int __populate_cache_leaves(unsigned int cpu) |
| +int populate_cache_leaves(unsigned int cpu) |
| { |
| unsigned int idx, ret; |
| struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu); |
| @@ -1004,6 +1004,3 @@ static int __populate_cache_leaves(unsigned int cpu) |
| |
| return 0; |
| } |
| - |
| -DEFINE_SMP_CALL_CACHE_FUNCTION(init_cache_level) |
| -DEFINE_SMP_CALL_CACHE_FUNCTION(populate_cache_leaves) |
| diff --git a/include/linux/cacheinfo.h b/include/linux/cacheinfo.h |
| index 70e19bc6cc9f..66654e6f9605 100644 |
| --- a/include/linux/cacheinfo.h |
| +++ b/include/linux/cacheinfo.h |
| @@ -76,24 +76,6 @@ struct cpu_cacheinfo { |
| bool cpu_map_populated; |
| }; |
| |
| -/* |
| - * Helpers to make sure "func" is executed on the cpu whose cache |
| - * attributes are being detected |
| - */ |
| -#define DEFINE_SMP_CALL_CACHE_FUNCTION(func) \ |
| -static inline void _##func(void *ret) \ |
| -{ \ |
| - int cpu = smp_processor_id(); \ |
| - *(int *)ret = __##func(cpu); \ |
| -} \ |
| - \ |
| -int func(unsigned int cpu) \ |
| -{ \ |
| - int ret; \ |
| - smp_call_function_single(cpu, _##func, &ret, true); \ |
| - return ret; \ |
| -} |
| - |
| struct cpu_cacheinfo *get_cpu_cacheinfo(unsigned int cpu); |
| int init_cache_level(unsigned int cpu); |
| int populate_cache_leaves(unsigned int cpu); |
| -- |
| 2.33.0 |
| |