mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.1 KiB
52 lines
1.1 KiB
// SPDX-License-Identifier: GPL-2.0-or-later |
|
/* |
|
* printk_safe.c - Safe printk for printk-deadlock-prone contexts |
|
*/ |
|
|
|
#include <linux/preempt.h> |
|
#include <linux/kdb.h> |
|
#include <linux/smp.h> |
|
#include <linux/cpumask.h> |
|
#include <linux/printk.h> |
|
#include <linux/kprobes.h> |
|
|
|
#include "internal.h" |
|
|
|
static DEFINE_PER_CPU(int, printk_context); |
|
|
|
/* Can be preempted by NMI. */ |
|
void __printk_safe_enter(void) |
|
{ |
|
this_cpu_inc(printk_context); |
|
} |
|
|
|
/* Can be preempted by NMI. */ |
|
void __printk_safe_exit(void) |
|
{ |
|
this_cpu_dec(printk_context); |
|
} |
|
|
|
asmlinkage int vprintk(const char *fmt, va_list args) |
|
{ |
|
#ifdef CONFIG_KGDB_KDB |
|
/* Allow to pass printk() to kdb but avoid a recursion. */ |
|
if (unlikely(kdb_trap_printk && kdb_printf_cpu < 0)) |
|
return vkdb_printf(KDB_MSGSRC_PRINTK, fmt, args); |
|
#endif |
|
|
|
/* |
|
* Use the main logbuf even in NMI. But avoid calling console |
|
* drivers that might have their own locks. |
|
*/ |
|
if (this_cpu_read(printk_context) || in_nmi()) { |
|
int len; |
|
|
|
len = vprintk_store(0, LOGLEVEL_DEFAULT, NULL, fmt, args); |
|
defer_console_output(); |
|
return len; |
|
} |
|
|
|
/* No obstacles. */ |
|
return vprintk_default(fmt, args); |
|
} |
|
EXPORT_SYMBOL(vprintk);
|
|
|