| From 6b35ac0c314f47f71dd7856601f7ed454b0b07df 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 7fa6828bb488..587543c6c51c 100644 |
| --- a/arch/arm64/kernel/cacheinfo.c |
| +++ b/arch/arm64/kernel/cacheinfo.c |
| @@ -43,7 +43,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); |
| @@ -78,7 +78,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; |
| @@ -97,6 +97,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 53d8ea7d36e6..495dd058231d 100644 |
| --- a/arch/mips/kernel/cacheinfo.c |
| +++ b/arch/mips/kernel/cacheinfo.c |
| @@ -17,7 +17,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); |
| @@ -74,7 +74,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); |
| @@ -114,6 +114,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 d86781357044..90deabfe63ea 100644 |
| --- a/arch/riscv/kernel/cacheinfo.c |
| +++ b/arch/riscv/kernel/cacheinfo.c |
| @@ -113,7 +113,7 @@ static void fill_cacheinfo(struct cacheinfo **this_leaf, |
| } |
| } |
| |
| -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); |
| @@ -155,7 +155,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; |
| @@ -187,6 +187,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 d66af2950e06..b5e36bd0425b 100644 |
| --- a/arch/x86/kernel/cpu/cacheinfo.c |
| +++ b/arch/x86/kernel/cpu/cacheinfo.c |
| @@ -985,7 +985,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); |
| |
| @@ -1014,7 +1014,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); |
| @@ -1033,6 +1033,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 4f72b47973c3..2f909ed084c6 100644 |
| --- a/include/linux/cacheinfo.h |
| +++ b/include/linux/cacheinfo.h |
| @@ -79,24 +79,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 |
| |