Re: [PATCH] semaphore: Add might_sleep() to down_*() family
From: Will Deacon <will@kernel.org>
Date: 2021-08-31 12:34:10
Also in:
lkml
On Tue, Aug 31, 2021 at 02:13:08PM +0200, Thomas Gleixner wrote:
On Tue, Aug 31 2021 at 04:13, Guenter Roeck wrote:quoted
On Mon, Aug 09, 2021 at 10:12:15AM +0800, Xiaoming Ni wrote:quoted
Semaphore is sleeping lock. Add might_sleep() to down*() family (with exception of down_trylock()) to detect atomic context sleep. Previously discussed with Peter Zijlstra, see link: https://lore.kernel.org/lkml/20210806082320.GD22037@worktop.programming.kicks-ass.net (local) Signed-off-by: Xiaoming Ni <redacted> Acked-by: Will Deacon <will@kernel.org>This patch results in the following traceback on all arm64 boots with EFI BIOS.That's what this change was supposed to catch :)quoted
The problem is only seen with CONFIG_ACPI_PPTT=y, and thus only on arm64.The below should fix this. Thanks, tglx --- Subject: drivers: base: cacheinfo: Get rid of DEFINE_SMP_CALL_CACHE_FUNCTION() From: Thomas Gleixner <redacted> Date: Tue, 31 Aug 2021 13:48:34 +0200 DEFINE_SMP_CALL_CACHE_FUNCTION() was usefel before the CPU hotplug rework
typo: "usefel"
quoted hunk ↗ jump to hunk
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. Reported-by: Guenter Roeck <linux@roeck-us.net> Fixes: 8571890e1513 ("arm64: Add support for ACPI based firmware tables") Signed-off-by: Thomas Gleixner <redacted> --- 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(-)--- a/arch/arm64/kernel/cacheinfo.c +++ b/arch/arm64/kernel/cacheinfo.c@@ -43,7 +43,7 @@ static void ci_leaf_init(struct cacheinf 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 i 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(unsig } return 0; } - -DEFINE_SMP_CALL_CACHE_FUNCTION(init_cache_level) -DEFINE_SMP_CALL_CACHE_FUNCTION(populate_cache_leaves)
Glad to see the back of this: Acked-by: Will Deacon <will@kernel.org> Will