hulk inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IB963V
CVE: NA
--------------------------------
In nmi_trigger_cpumask_backtrace(), printk_safe_flush() is called after
sending NMI to flush the logs. When logbuf_lock is already held and the
current CPU is in printk-safe context (e.g., NMI context), attempting to
acquire the lock again can lead to deadlock.
Modify the function to return early when detecting logbuf_lock is held
and current CPU is in printk-safe context. This prevents deadlock scenarios
where CPU0 holds the lock while other CPUs try to acquire it in NMI
context.
Fixes: 099f1c84c005 ("printk: introduce per-cpu safe_print seq buffer")
Signed-off-by: Xiaomeng Zhang <zhangxiaomeng13(a)huawei.com>
---
kernel/printk/printk_safe.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/kernel/printk/printk_safe.c b/kernel/printk/printk_safe.c
index 809f92492ec7..c97845688fe1 100644
--- a/kernel/printk/printk_safe.c
+++ b/kernel/printk/printk_safe.c
@@ -256,6 +256,10 @@ void printk_safe_flush(void)
{
int cpu;
+ if (raw_spin_is_locked(&logbuf_lock) &&
+ (this_cpu_read(printk_context) & PRINTK_SAFE_CONTEXT_MASK))
+ return;
+
for_each_possible_cpu(cpu) {
#ifdef CONFIG_PRINTK_NMI
__printk_safe_flush(&per_cpu(nmi_print_seq, cpu).work);
--
2.34.1