summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0013-printk-remove-deferred-printing.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-rt/0013-printk-remove-deferred-printing.patch')
-rw-r--r--debian/patches-rt/0013-printk-remove-deferred-printing.patch880
1 files changed, 880 insertions, 0 deletions
diff --git a/debian/patches-rt/0013-printk-remove-deferred-printing.patch b/debian/patches-rt/0013-printk-remove-deferred-printing.patch
new file mode 100644
index 000000000..2ad8aed59
--- /dev/null
+++ b/debian/patches-rt/0013-printk-remove-deferred-printing.patch
@@ -0,0 +1,880 @@
+From 0e9e3ca3628d40dae9366055879ce7dbc771e01c Mon Sep 17 00:00:00 2001
+From: John Ogness <john.ogness@linutronix.de>
+Date: Mon, 30 Nov 2020 01:42:08 +0106
+Subject: [PATCH 013/158] printk: remove deferred printing
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.15/older/patches-5.15.10-rt24.tar.xz
+
+Since printing occurs either atomically or from the printing
+kthread, there is no need for any deferring or tracking possible
+recursion paths. Remove all printk defer functions and context
+tracking.
+
+Signed-off-by: John Ogness <john.ogness@linutronix.de>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+---
+ arch/arm/kernel/smp.c | 2 -
+ arch/powerpc/kexec/crash.c | 3 --
+ arch/x86/kernel/dumpstack_32.c | 2 +-
+ arch/x86/kernel/dumpstack_64.c | 3 +-
+ arch/x86/kernel/i8259.c | 3 +-
+ arch/x86/kernel/unwind_frame.c | 16 ++++---
+ arch/x86/kernel/unwind_orc.c | 2 +-
+ drivers/char/random.c | 5 +--
+ include/linux/printk.h | 34 ---------------
+ include/linux/suspend.h | 10 +----
+ kernel/power/main.c | 10 ++---
+ kernel/printk/Makefile | 1 -
+ kernel/printk/internal.h | 36 ----------------
+ kernel/printk/printk.c | 74 +++++++++++----------------------
+ kernel/printk/printk_safe.c | 52 -----------------------
+ kernel/sched/core.c | 9 ++--
+ kernel/sched/deadline.c | 2 +-
+ kernel/sched/fair.c | 5 +--
+ kernel/sched/psi.c | 14 +++----
+ kernel/sched/rt.c | 2 +-
+ kernel/time/clockevents.c | 9 ++--
+ kernel/time/ntp.c | 14 +++----
+ kernel/time/timekeeping.c | 30 ++++++-------
+ kernel/time/timekeeping_debug.c | 2 +-
+ kernel/workqueue.c | 4 --
+ lib/ratelimit.c | 4 +-
+ 26 files changed, 83 insertions(+), 265 deletions(-)
+ delete mode 100644 kernel/printk/printk_safe.c
+
+diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
+index 842427ff2b3c..b943e2df9540 100644
+--- a/arch/arm/kernel/smp.c
++++ b/arch/arm/kernel/smp.c
+@@ -667,9 +667,7 @@ static void do_handle_IPI(int ipinr)
+ break;
+
+ case IPI_CPU_BACKTRACE:
+- printk_deferred_enter();
+ nmi_cpu_backtrace(get_irq_regs());
+- printk_deferred_exit();
+ break;
+
+ default:
+diff --git a/arch/powerpc/kexec/crash.c b/arch/powerpc/kexec/crash.c
+index 22ceeeb705ab..d5359701f787 100644
+--- a/arch/powerpc/kexec/crash.c
++++ b/arch/powerpc/kexec/crash.c
+@@ -312,9 +312,6 @@ void default_machine_crash_shutdown(struct pt_regs *regs)
+ unsigned int i;
+ int (*old_handler)(struct pt_regs *regs);
+
+- /* Avoid hardlocking with irresponsive CPU holding logbuf_lock */
+- printk_deferred_enter();
+-
+ /*
+ * This function is only called after the system
+ * has panicked or is otherwise in a critical state.
+diff --git a/arch/x86/kernel/dumpstack_32.c b/arch/x86/kernel/dumpstack_32.c
+index 722fd712e1cf..82cc3a7be6bd 100644
+--- a/arch/x86/kernel/dumpstack_32.c
++++ b/arch/x86/kernel/dumpstack_32.c
+@@ -141,7 +141,7 @@ int get_stack_info(unsigned long *stack, struct task_struct *task,
+ */
+ if (visit_mask) {
+ if (*visit_mask & (1UL << info->type)) {
+- printk_deferred_once(KERN_WARNING "WARNING: stack recursion on stack type %d\n", info->type);
++ pr_warn_once("WARNING: stack recursion on stack type %d\n", info->type);
+ goto unknown;
+ }
+ *visit_mask |= 1UL << info->type;
+diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c
+index 6c5defd6569a..5f725b0ceb29 100644
+--- a/arch/x86/kernel/dumpstack_64.c
++++ b/arch/x86/kernel/dumpstack_64.c
+@@ -207,7 +207,8 @@ int get_stack_info(unsigned long *stack, struct task_struct *task,
+ if (visit_mask) {
+ if (*visit_mask & (1UL << info->type)) {
+ if (task == current)
+- printk_deferred_once(KERN_WARNING "WARNING: stack recursion on stack type %d\n", info->type);
++ pr_warn_once("WARNING: stack recursion on stack type %d\n",
++ info->type);
+ goto unknown;
+ }
+ *visit_mask |= 1UL << info->type;
+diff --git a/arch/x86/kernel/i8259.c b/arch/x86/kernel/i8259.c
+index 15aefa3f3e18..52af9a89ad47 100644
+--- a/arch/x86/kernel/i8259.c
++++ b/arch/x86/kernel/i8259.c
+@@ -207,8 +207,7 @@ static void mask_and_ack_8259A(struct irq_data *data)
+ * lets ACK and report it. [once per IRQ]
+ */
+ if (!(spurious_irq_mask & irqmask)) {
+- printk_deferred(KERN_DEBUG
+- "spurious 8259A interrupt: IRQ%d.\n", irq);
++ printk(KERN_DEBUG "spurious 8259A interrupt: IRQ%d.\n", irq);
+ spurious_irq_mask |= irqmask;
+ }
+ atomic_inc(&irq_err_count);
+diff --git a/arch/x86/kernel/unwind_frame.c b/arch/x86/kernel/unwind_frame.c
+index d7c44b257f7f..2d0361cd304f 100644
+--- a/arch/x86/kernel/unwind_frame.c
++++ b/arch/x86/kernel/unwind_frame.c
+@@ -41,9 +41,9 @@ static void unwind_dump(struct unwind_state *state)
+
+ dumped_before = true;
+
+- printk_deferred("unwind stack type:%d next_sp:%p mask:0x%lx graph_idx:%d\n",
+- state->stack_info.type, state->stack_info.next_sp,
+- state->stack_mask, state->graph_idx);
++ printk("unwind stack type:%d next_sp:%p mask:0x%lx graph_idx:%d\n",
++ state->stack_info.type, state->stack_info.next_sp,
++ state->stack_mask, state->graph_idx);
+
+ for (sp = PTR_ALIGN(state->orig_sp, sizeof(long)); sp;
+ sp = PTR_ALIGN(stack_info.next_sp, sizeof(long))) {
+@@ -59,13 +59,11 @@ static void unwind_dump(struct unwind_state *state)
+
+ if (zero) {
+ if (!prev_zero)
+- printk_deferred("%p: %0*x ...\n",
+- sp, BITS_PER_LONG/4, 0);
++ printk("%p: %0*x ...\n", sp, BITS_PER_LONG/4, 0);
+ continue;
+ }
+
+- printk_deferred("%p: %0*lx (%pB)\n",
+- sp, BITS_PER_LONG/4, word, (void *)word);
++ printk("%p: %0*lx (%pB)\n", sp, BITS_PER_LONG/4, word, (void *)word);
+ }
+ }
+ }
+@@ -342,13 +340,13 @@ bool unwind_next_frame(struct unwind_state *state)
+ goto the_end;
+
+ if (state->regs) {
+- printk_deferred_once(KERN_WARNING
++ pr_warn_once(
+ "WARNING: kernel stack regs at %p in %s:%d has bad 'bp' value %p\n",
+ state->regs, state->task->comm,
+ state->task->pid, next_bp);
+ unwind_dump(state);
+ } else {
+- printk_deferred_once(KERN_WARNING
++ pr_warn_once(
+ "WARNING: kernel stack frame pointer at %p in %s:%d has bad value %p\n",
+ state->bp, state->task->comm,
+ state->task->pid, next_bp);
+diff --git a/arch/x86/kernel/unwind_orc.c b/arch/x86/kernel/unwind_orc.c
+index a1202536fc57..a26a7c3849f5 100644
+--- a/arch/x86/kernel/unwind_orc.c
++++ b/arch/x86/kernel/unwind_orc.c
+@@ -9,7 +9,7 @@
+ #include <asm/orc_lookup.h>
+
+ #define orc_warn(fmt, ...) \
+- printk_deferred_once(KERN_WARNING "WARNING: " fmt, ##__VA_ARGS__)
++ pr_warn_once("WARNING: " fmt, ##__VA_ARGS__)
+
+ #define orc_warn_current(args...) \
+ ({ \
+diff --git a/drivers/char/random.c b/drivers/char/random.c
+index 605969ed0f96..860900470e17 100644
+--- a/drivers/char/random.c
++++ b/drivers/char/random.c
+@@ -1507,9 +1507,8 @@ static void _warn_unseeded_randomness(const char *func_name, void *caller,
+ print_once = true;
+ #endif
+ if (__ratelimit(&unseeded_warning))
+- printk_deferred(KERN_NOTICE "random: %s called from %pS "
+- "with crng_init=%d\n", func_name, caller,
+- crng_init);
++ pr_notice("random: %s called from %pS with crng_init=%d\n",
++ func_name, caller, crng_init);
+ }
+
+ /*
+diff --git a/include/linux/printk.h b/include/linux/printk.h
+index db633f2a6c46..5f6eba74825f 100644
+--- a/include/linux/printk.h
++++ b/include/linux/printk.h
+@@ -161,21 +161,6 @@ int vprintk(const char *fmt, va_list args);
+ asmlinkage __printf(1, 2) __cold
+ int _printk(const char *fmt, ...);
+
+-/*
+- * Special printk facility for scheduler/timekeeping use only, _DO_NOT_USE_ !
+- */
+-__printf(1, 2) __cold int _printk_deferred(const char *fmt, ...);
+-
+-extern void __printk_safe_enter(void);
+-extern void __printk_safe_exit(void);
+-/*
+- * The printk_deferred_enter/exit macros are available only as a hack for
+- * some code paths that need to defer all printk console printing. Interrupts
+- * must be disabled for the deferred duration.
+- */
+-#define printk_deferred_enter __printk_safe_enter
+-#define printk_deferred_exit __printk_safe_exit
+-
+ /*
+ * Please don't use printk_ratelimit(), because it shares ratelimiting state
+ * with all other unrelated printk_ratelimit() callsites. Instead use
+@@ -216,19 +201,6 @@ int _printk(const char *s, ...)
+ {
+ return 0;
+ }
+-static inline __printf(1, 2) __cold
+-int _printk_deferred(const char *s, ...)
+-{
+- return 0;
+-}
+-
+-static inline void printk_deferred_enter(void)
+-{
+-}
+-
+-static inline void printk_deferred_exit(void)
+-{
+-}
+
+ static inline int printk_ratelimit(void)
+ {
+@@ -475,8 +447,6 @@ struct pi_entry {
+ * See the vsnprintf() documentation for format string extensions over C99.
+ */
+ #define printk(fmt, ...) printk_index_wrap(_printk, fmt, ##__VA_ARGS__)
+-#define printk_deferred(fmt, ...) \
+- printk_index_wrap(_printk_deferred, fmt, ##__VA_ARGS__)
+
+ /**
+ * pr_emerg - Print an emergency-level message
+@@ -614,13 +584,9 @@ struct pi_entry {
+ #ifdef CONFIG_PRINTK
+ #define printk_once(fmt, ...) \
+ DO_ONCE_LITE(printk, fmt, ##__VA_ARGS__)
+-#define printk_deferred_once(fmt, ...) \
+- DO_ONCE_LITE(printk_deferred, fmt, ##__VA_ARGS__)
+ #else
+ #define printk_once(fmt, ...) \
+ no_printk(fmt, ##__VA_ARGS__)
+-#define printk_deferred_once(fmt, ...) \
+- no_printk(fmt, ##__VA_ARGS__)
+ #endif
+
+ #define pr_emerg_once(fmt, ...) \
+diff --git a/include/linux/suspend.h b/include/linux/suspend.h
+index 8af13ba60c7e..79b6933ef8a0 100644
+--- a/include/linux/suspend.h
++++ b/include/linux/suspend.h
+@@ -550,23 +550,17 @@ static inline void unlock_system_sleep(void) {}
+ #ifdef CONFIG_PM_SLEEP_DEBUG
+ extern bool pm_print_times_enabled;
+ extern bool pm_debug_messages_on;
+-extern __printf(2, 3) void __pm_pr_dbg(bool defer, const char *fmt, ...);
++extern __printf(1, 2) void pm_pr_dbg(const char *fmt, ...);
+ #else
+ #define pm_print_times_enabled (false)
+ #define pm_debug_messages_on (false)
+
+ #include <linux/printk.h>
+
+-#define __pm_pr_dbg(defer, fmt, ...) \
++#define pm_pr_dbg(fmt, ...) \
+ no_printk(KERN_DEBUG fmt, ##__VA_ARGS__)
+ #endif
+
+-#define pm_pr_dbg(fmt, ...) \
+- __pm_pr_dbg(false, fmt, ##__VA_ARGS__)
+-
+-#define pm_deferred_pr_dbg(fmt, ...) \
+- __pm_pr_dbg(true, fmt, ##__VA_ARGS__)
+-
+ #ifdef CONFIG_PM_AUTOSLEEP
+
+ /* kernel/power/autosleep.c */
+diff --git a/kernel/power/main.c b/kernel/power/main.c
+index 44169f3081fd..eaa725ca079c 100644
+--- a/kernel/power/main.c
++++ b/kernel/power/main.c
+@@ -543,14 +543,13 @@ static int __init pm_debug_messages_setup(char *str)
+ __setup("pm_debug_messages", pm_debug_messages_setup);
+
+ /**
+- * __pm_pr_dbg - Print a suspend debug message to the kernel log.
+- * @defer: Whether or not to use printk_deferred() to print the message.
++ * pm_pr_dbg - Print a suspend debug message to the kernel log.
+ * @fmt: Message format.
+ *
+ * The message will be emitted if enabled through the pm_debug_messages
+ * sysfs attribute.
+ */
+-void __pm_pr_dbg(bool defer, const char *fmt, ...)
++void pm_pr_dbg(const char *fmt, ...)
+ {
+ struct va_format vaf;
+ va_list args;
+@@ -563,10 +562,7 @@ void __pm_pr_dbg(bool defer, const char *fmt, ...)
+ vaf.fmt = fmt;
+ vaf.va = &args;
+
+- if (defer)
+- printk_deferred(KERN_DEBUG "PM: %pV", &vaf);
+- else
+- printk(KERN_DEBUG "PM: %pV", &vaf);
++ printk(KERN_DEBUG "PM: %pV", &vaf);
+
+ va_end(args);
+ }
+diff --git a/kernel/printk/Makefile b/kernel/printk/Makefile
+index d118739874c0..bc6b856a0ff4 100644
+--- a/kernel/printk/Makefile
++++ b/kernel/printk/Makefile
+@@ -1,6 +1,5 @@
+ # SPDX-License-Identifier: GPL-2.0-only
+ obj-y = printk.o
+-obj-$(CONFIG_PRINTK) += printk_safe.o
+ obj-$(CONFIG_A11Y_BRAILLE_CONSOLE) += braille.o
+ obj-$(CONFIG_PRINTK) += printk_ringbuffer.o
+ obj-$(CONFIG_PRINTK_INDEX) += index.o
+diff --git a/kernel/printk/internal.h b/kernel/printk/internal.h
+index 9f3ed2fdb721..de8ab059dd96 100644
+--- a/kernel/printk/internal.h
++++ b/kernel/printk/internal.h
+@@ -2,7 +2,6 @@
+ /*
+ * internal.h - printk internal definitions
+ */
+-#include <linux/percpu.h>
+
+ #ifdef CONFIG_PRINTK
+
+@@ -12,41 +11,6 @@ enum printk_info_flags {
+ LOG_CONT = 8, /* text is a fragment of a continuation line */
+ };
+
+-__printf(4, 0)
+-int vprintk_store(int facility, int level,
+- const struct dev_printk_info *dev_info,
+- const char *fmt, va_list args);
+-
+-__printf(1, 0) int vprintk_default(const char *fmt, va_list args);
+-__printf(1, 0) int vprintk_deferred(const char *fmt, va_list args);
+-
+-bool printk_percpu_data_ready(void);
+-
+-#define printk_safe_enter_irqsave(flags) \
+- do { \
+- local_irq_save(flags); \
+- __printk_safe_enter(); \
+- } while (0)
+-
+-#define printk_safe_exit_irqrestore(flags) \
+- do { \
+- __printk_safe_exit(); \
+- local_irq_restore(flags); \
+- } while (0)
+-
+-void defer_console_output(void);
+-
+ u16 printk_parse_prefix(const char *text, int *level,
+ enum printk_info_flags *flags);
+-#else
+-
+-/*
+- * In !PRINTK builds we still export console_sem
+- * semaphore and some of console functions (console_unlock()/etc.), so
+- * printk-safe must preserve the existing local IRQ guarantees.
+- */
+-#define printk_safe_enter_irqsave(flags) local_irq_save(flags)
+-#define printk_safe_exit_irqrestore(flags) local_irq_restore(flags)
+-
+-static inline bool printk_percpu_data_ready(void) { return false; }
+ #endif /* CONFIG_PRINTK */
+diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
+index aefc850bff93..6bb0cab585d0 100644
+--- a/kernel/printk/printk.c
++++ b/kernel/printk/printk.c
+@@ -44,6 +44,7 @@
+ #include <linux/irq_work.h>
+ #include <linux/ctype.h>
+ #include <linux/uio.h>
++#include <linux/kdb.h>
+ #include <linux/kgdb.h>
+ #include <linux/kthread.h>
+ #include <linux/clocksource.h>
+@@ -228,19 +229,7 @@ static int nr_ext_console_drivers;
+
+ static int __down_trylock_console_sem(unsigned long ip)
+ {
+- int lock_failed;
+- unsigned long flags;
+-
+- /*
+- * Here and in __up_console_sem() we need to be in safe mode,
+- * because spindump/WARN/etc from under console ->lock will
+- * deadlock in printk()->down_trylock_console_sem() otherwise.
+- */
+- printk_safe_enter_irqsave(flags);
+- lock_failed = down_trylock(&console_sem);
+- printk_safe_exit_irqrestore(flags);
+-
+- if (lock_failed)
++ if (down_trylock(&console_sem))
+ return 1;
+ mutex_acquire(&console_lock_dep_map, 0, 1, ip);
+ return 0;
+@@ -249,13 +238,9 @@ static int __down_trylock_console_sem(unsigned long ip)
+
+ static void __up_console_sem(unsigned long ip)
+ {
+- unsigned long flags;
+-
+ mutex_release(&console_lock_dep_map, ip);
+
+- printk_safe_enter_irqsave(flags);
+ up(&console_sem);
+- printk_safe_exit_irqrestore(flags);
+ }
+ #define up_console_sem() __up_console_sem(_RET_IP_)
+
+@@ -417,7 +402,7 @@ static struct printk_ringbuffer *prb = &printk_rb_static;
+ */
+ static bool __printk_percpu_data_ready __read_mostly;
+
+-bool printk_percpu_data_ready(void)
++static bool printk_percpu_data_ready(void)
+ {
+ return __printk_percpu_data_ready;
+ }
+@@ -2023,9 +2008,9 @@ static u16 printk_sprint(char *text, u16 size, int facility,
+ }
+
+ __printf(4, 0)
+-int vprintk_store(int facility, int level,
+- const struct dev_printk_info *dev_info,
+- const char *fmt, va_list args)
++static int vprintk_store(int facility, int level,
++ const struct dev_printk_info *dev_info,
++ const char *fmt, va_list args)
+ {
+ const u32 caller_id = printk_caller_id();
+ struct prb_reserved_entry e;
+@@ -2171,11 +2156,28 @@ asmlinkage int vprintk_emit(int facility, int level,
+ }
+ EXPORT_SYMBOL(vprintk_emit);
+
+-int vprintk_default(const char *fmt, va_list args)
++__printf(1, 0)
++static int vprintk_default(const char *fmt, va_list args)
+ {
+ return vprintk_emit(0, LOGLEVEL_DEFAULT, NULL, fmt, args);
+ }
+-EXPORT_SYMBOL_GPL(vprintk_default);
++
++__printf(1, 0)
++static int vprintk_func(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
++ return vprintk_default(fmt, args);
++}
++
++asmlinkage int vprintk(const char *fmt, va_list args)
++{
++ return vprintk_func(fmt, args);
++}
++EXPORT_SYMBOL(vprintk);
+
+ asmlinkage __visible int _printk(const char *fmt, ...)
+ {
+@@ -3136,37 +3138,11 @@ void wake_up_klogd(void)
+ preempt_enable();
+ }
+
+-void defer_console_output(void)
+-{
+-}
+-
+ void printk_trigger_flush(void)
+ {
+ wake_up_klogd();
+ }
+
+-int vprintk_deferred(const char *fmt, va_list args)
+-{
+- int r;
+-
+- r = vprintk_emit(0, LOGLEVEL_SCHED, NULL, fmt, args);
+- defer_console_output();
+-
+- return r;
+-}
+-
+-int _printk_deferred(const char *fmt, ...)
+-{
+- va_list args;
+- int r;
+-
+- va_start(args, fmt);
+- r = vprintk_deferred(fmt, args);
+- va_end(args);
+-
+- return r;
+-}
+-
+ /*
+ * printk rate limiting, lifted from the networking subsystem.
+ *
+diff --git a/kernel/printk/printk_safe.c b/kernel/printk/printk_safe.c
+deleted file mode 100644
+index ef0f9a2044da..000000000000
+--- a/kernel/printk/printk_safe.c
++++ /dev/null
+@@ -1,52 +0,0 @@
+-// 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);
+diff --git a/kernel/sched/core.c b/kernel/sched/core.c
+index 0d12ec7be301..c5f12805300e 100644
+--- a/kernel/sched/core.c
++++ b/kernel/sched/core.c
+@@ -2944,9 +2944,8 @@ void force_compatible_cpus_allowed_ptr(struct task_struct *p)
+
+ out_set_mask:
+ if (printk_ratelimit()) {
+- printk_deferred("Overriding affinity for process %d (%s) to CPUs %*pbl\n",
+- task_pid_nr(p), p->comm,
+- cpumask_pr_args(override_mask));
++ printk("Overriding affinity for process %d (%s) to CPUs %*pbl\n",
++ task_pid_nr(p), p->comm, cpumask_pr_args(override_mask));
+ }
+
+ WARN_ON(set_cpus_allowed_ptr(p, override_mask));
+@@ -3376,8 +3375,8 @@ static int select_fallback_rq(int cpu, struct task_struct *p)
+ * leave kernel.
+ */
+ if (p->mm && printk_ratelimit()) {
+- printk_deferred("process %d (%s) no longer affine to cpu%d\n",
+- task_pid_nr(p), p->comm, cpu);
++ printk("process %d (%s) no longer affine to cpu%d\n",
++ task_pid_nr(p), p->comm, cpu);
+ }
+ }
+
+diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
+index e94314633b39..fd7c4f972aaf 100644
+--- a/kernel/sched/deadline.c
++++ b/kernel/sched/deadline.c
+@@ -800,7 +800,7 @@ static void replenish_dl_entity(struct sched_dl_entity *dl_se)
+ * entity.
+ */
+ if (dl_time_before(dl_se->deadline, rq_clock(rq))) {
+- printk_deferred_once("sched: DL replenish lagged too much\n");
++ printk_once("sched: DL replenish lagged too much\n");
+ dl_se->deadline = rq_clock(rq) + pi_of(dl_se)->dl_deadline;
+ dl_se->runtime = pi_of(dl_se)->dl_runtime;
+ }
+diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
+index 6f16dfb74246..e3e667b28f41 100644
+--- a/kernel/sched/fair.c
++++ b/kernel/sched/fair.c
+@@ -4237,10 +4237,7 @@ static inline void check_schedstat_required(void)
+ trace_sched_stat_iowait_enabled() ||
+ trace_sched_stat_blocked_enabled() ||
+ trace_sched_stat_runtime_enabled()) {
+- printk_deferred_once("Scheduler tracepoints stat_sleep, stat_iowait, "
+- "stat_blocked and stat_runtime require the "
+- "kernel parameter schedstats=enable or "
+- "kernel.sched_schedstats=1\n");
++ printk_once("Scheduler tracepoints stat_sleep, stat_iowait, stat_blocked and stat_runtime require the kernel parameter schedstats=enable or kernel.sched_schedstats=1\n");
+ }
+ #endif
+ }
+diff --git a/kernel/sched/psi.c b/kernel/sched/psi.c
+index 1652f2bb54b7..ab54b2012469 100644
+--- a/kernel/sched/psi.c
++++ b/kernel/sched/psi.c
+@@ -710,10 +710,10 @@ static void psi_group_change(struct psi_group *group, int cpu,
+ if (groupc->tasks[t]) {
+ groupc->tasks[t]--;
+ } else if (!psi_bug) {
+- printk_deferred(KERN_ERR "psi: task underflow! cpu=%d t=%d tasks=[%u %u %u %u] clear=%x set=%x\n",
+- cpu, t, groupc->tasks[0],
+- groupc->tasks[1], groupc->tasks[2],
+- groupc->tasks[3], clear, set);
++ pr_err("psi: task underflow! cpu=%d t=%d tasks=[%u %u %u %u] clear=%x set=%x\n",
++ cpu, t, groupc->tasks[0],
++ groupc->tasks[1], groupc->tasks[2],
++ groupc->tasks[3], clear, set);
+ psi_bug = 1;
+ }
+ }
+@@ -779,9 +779,9 @@ static void psi_flags_change(struct task_struct *task, int clear, int set)
+ if (((task->psi_flags & set) ||
+ (task->psi_flags & clear) != clear) &&
+ !psi_bug) {
+- printk_deferred(KERN_ERR "psi: inconsistent task state! task=%d:%s cpu=%d psi_flags=%x clear=%x set=%x\n",
+- task->pid, task->comm, task_cpu(task),
+- task->psi_flags, clear, set);
++ pr_err("psi: inconsistent task state! task=%d:%s cpu=%d psi_flags=%x clear=%x set=%x\n",
++ task->pid, task->comm, task_cpu(task),
++ task->psi_flags, clear, set);
+ psi_bug = 1;
+ }
+
+diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
+index bfef3f39b555..ef8228d19382 100644
+--- a/kernel/sched/rt.c
++++ b/kernel/sched/rt.c
+@@ -977,7 +977,7 @@ static int sched_rt_runtime_exceeded(struct rt_rq *rt_rq)
+ */
+ if (likely(rt_b->rt_runtime)) {
+ rt_rq->rt_throttled = 1;
+- printk_deferred_once("sched: RT throttling activated\n");
++ printk_once("sched: RT throttling activated\n");
+ } else {
+ /*
+ * In case we did anyway, make it go away,
+diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c
+index 003ccf338d20..00fc43605c6b 100644
+--- a/kernel/time/clockevents.c
++++ b/kernel/time/clockevents.c
+@@ -203,8 +203,7 @@ static int clockevents_increase_min_delta(struct clock_event_device *dev)
+ {
+ /* Nothing to do if we already reached the limit */
+ if (dev->min_delta_ns >= MIN_DELTA_LIMIT) {
+- printk_deferred(KERN_WARNING
+- "CE: Reprogramming failure. Giving up\n");
++ pr_warn("CE: Reprogramming failure. Giving up\n");
+ dev->next_event = KTIME_MAX;
+ return -ETIME;
+ }
+@@ -217,10 +216,8 @@ static int clockevents_increase_min_delta(struct clock_event_device *dev)
+ if (dev->min_delta_ns > MIN_DELTA_LIMIT)
+ dev->min_delta_ns = MIN_DELTA_LIMIT;
+
+- printk_deferred(KERN_WARNING
+- "CE: %s increased min_delta_ns to %llu nsec\n",
+- dev->name ? dev->name : "?",
+- (unsigned long long) dev->min_delta_ns);
++ pr_warn("CE: %s increased min_delta_ns to %llu nsec\n",
++ dev->name ? dev->name : "?", (unsigned long long) dev->min_delta_ns);
+ return 0;
+ }
+
+diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c
+index 406dccb79c2b..829d7797811f 100644
+--- a/kernel/time/ntp.c
++++ b/kernel/time/ntp.c
+@@ -939,9 +939,7 @@ static long hardpps_update_freq(struct pps_normtime freq_norm)
+ time_status |= STA_PPSERROR;
+ pps_errcnt++;
+ pps_dec_freq_interval();
+- printk_deferred(KERN_ERR
+- "hardpps: PPSERROR: interval too long - %lld s\n",
+- freq_norm.sec);
++ pr_err("hardpps: PPSERROR: interval too long - %lld s\n", freq_norm.sec);
+ return 0;
+ }
+
+@@ -954,8 +952,7 @@ static long hardpps_update_freq(struct pps_normtime freq_norm)
+ delta = shift_right(ftemp - pps_freq, NTP_SCALE_SHIFT);
+ pps_freq = ftemp;
+ if (delta > PPS_MAXWANDER || delta < -PPS_MAXWANDER) {
+- printk_deferred(KERN_WARNING
+- "hardpps: PPSWANDER: change=%ld\n", delta);
++ pr_warn("hardpps: PPSWANDER: change=%ld\n", delta);
+ time_status |= STA_PPSWANDER;
+ pps_stbcnt++;
+ pps_dec_freq_interval();
+@@ -999,9 +996,8 @@ static void hardpps_update_phase(long error)
+ * the time offset is updated.
+ */
+ if (jitter > (pps_jitter << PPS_POPCORN)) {
+- printk_deferred(KERN_WARNING
+- "hardpps: PPSJITTER: jitter=%ld, limit=%ld\n",
+- jitter, (pps_jitter << PPS_POPCORN));
++ pr_warn("hardpps: PPSJITTER: jitter=%ld, limit=%ld\n",
++ jitter, (pps_jitter << PPS_POPCORN));
+ time_status |= STA_PPSJITTER;
+ pps_jitcnt++;
+ } else if (time_status & STA_PPSTIME) {
+@@ -1058,7 +1054,7 @@ void __hardpps(const struct timespec64 *phase_ts, const struct timespec64 *raw_t
+ time_status |= STA_PPSJITTER;
+ /* restart the frequency calibration interval */
+ pps_fbase = *raw_ts;
+- printk_deferred(KERN_ERR "hardpps: PPSJITTER: bad pulse\n");
++ pr_err("hardpps: PPSJITTER: bad pulse\n");
+ return;
+ }
+
+diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
+index b348749a9fc6..a81beb312038 100644
+--- a/kernel/time/timekeeping.c
++++ b/kernel/time/timekeeping.c
+@@ -203,22 +203,23 @@ static void timekeeping_check_update(struct timekeeper *tk, u64 offset)
+ const char *name = tk->tkr_mono.clock->name;
+
+ if (offset > max_cycles) {
+- printk_deferred("WARNING: timekeeping: Cycle offset (%lld) is larger than allowed by the '%s' clock's max_cycles value (%lld): time overflow danger\n",
+- offset, name, max_cycles);
+- printk_deferred(" timekeeping: Your kernel is sick, but tries to cope by capping time updates\n");
++ printk("WARNING: timekeeping: Cycle offset (%lld) is larger than allowed by the '%s' clock's max_cycles value (%lld): time overflow danger\n",
++ offset, name, max_cycles);
++ printk(" timekeeping: Your kernel is sick, but tries to cope by capping time updates\n");
+ } else {
+ if (offset > (max_cycles >> 1)) {
+- printk_deferred("INFO: timekeeping: Cycle offset (%lld) is larger than the '%s' clock's 50%% safety margin (%lld)\n",
+- offset, name, max_cycles >> 1);
+- printk_deferred(" timekeeping: Your kernel is still fine, but is feeling a bit nervous\n");
++ printk("INFO: timekeeping: Cycle offset (%lld) is larger than the '%s' clock's 50%% safety margin (%lld)\n",
++ offset, name, max_cycles >> 1);
++ printk(" timekeeping: Your kernel is still fine, but is feeling a bit nervous\n");
+ }
+ }
+
+ if (tk->underflow_seen) {
+ if (jiffies - tk->last_warning > WARNING_FREQ) {
+- printk_deferred("WARNING: Underflow in clocksource '%s' observed, time update ignored.\n", name);
+- printk_deferred(" Please report this, consider using a different clocksource, if possible.\n");
+- printk_deferred(" Your kernel is probably still fine.\n");
++ printk("WARNING: Underflow in clocksource '%s' observed, time update ignored.\n",
++ name);
++ printk(" Please report this, consider using a different clocksource, if possible.\n");
++ printk(" Your kernel is probably still fine.\n");
+ tk->last_warning = jiffies;
+ }
+ tk->underflow_seen = 0;
+@@ -226,9 +227,10 @@ static void timekeeping_check_update(struct timekeeper *tk, u64 offset)
+
+ if (tk->overflow_seen) {
+ if (jiffies - tk->last_warning > WARNING_FREQ) {
+- printk_deferred("WARNING: Overflow in clocksource '%s' observed, time update capped.\n", name);
+- printk_deferred(" Please report this, consider using a different clocksource, if possible.\n");
+- printk_deferred(" Your kernel is probably still fine.\n");
++ printk("WARNING: Overflow in clocksource '%s' observed, time update capped.\n",
++ name);
++ printk(" Please report this, consider using a different clocksource, if possible.\n");
++ printk(" Your kernel is probably still fine.\n");
+ tk->last_warning = jiffies;
+ }
+ tk->overflow_seen = 0;
+@@ -1669,9 +1671,7 @@ static void __timekeeping_inject_sleeptime(struct timekeeper *tk,
+ const struct timespec64 *delta)
+ {
+ if (!timespec64_valid_strict(delta)) {
+- printk_deferred(KERN_WARNING
+- "__timekeeping_inject_sleeptime: Invalid "
+- "sleep delta value!\n");
++ pr_warn("%s: Invalid sleep delta value!\n", __func__);
+ return;
+ }
+ tk_xtime_add(tk, delta);
+diff --git a/kernel/time/timekeeping_debug.c b/kernel/time/timekeeping_debug.c
+index b73e8850e58d..149cc4b08d8e 100644
+--- a/kernel/time/timekeeping_debug.c
++++ b/kernel/time/timekeeping_debug.c
+@@ -49,7 +49,7 @@ void tk_debug_account_sleep_time(const struct timespec64 *t)
+ int bin = min(fls(t->tv_sec), NUM_BINS-1);
+
+ sleep_time_bin[bin]++;
+- pm_deferred_pr_dbg("Timekeeping suspended for %lld.%03lu seconds\n",
++ pm_pr_dbg("Timekeeping suspended for %lld.%03lu seconds\n",
+ (s64)t->tv_sec, t->tv_nsec / NSEC_PER_MSEC);
+ }
+
+diff --git a/kernel/workqueue.c b/kernel/workqueue.c
+index 76988f39ed5a..86b6c5a9b274 100644
+--- a/kernel/workqueue.c
++++ b/kernel/workqueue.c
+@@ -4836,9 +4836,7 @@ void show_workqueue_state(void)
+ * drivers that queue work while holding locks
+ * also taken in their write paths.
+ */
+- printk_deferred_enter();
+ show_pwq(pwq);
+- printk_deferred_exit();
+ }
+ raw_spin_unlock_irqrestore(&pwq->pool->lock, flags);
+ /*
+@@ -4862,7 +4860,6 @@ void show_workqueue_state(void)
+ * queue work while holding locks also taken in their write
+ * paths.
+ */
+- printk_deferred_enter();
+ pr_info("pool %d:", pool->id);
+ pr_cont_pool_info(pool);
+ pr_cont(" hung=%us workers=%d",
+@@ -4877,7 +4874,6 @@ void show_workqueue_state(void)
+ first = false;
+ }
+ pr_cont("\n");
+- printk_deferred_exit();
+ next_pool:
+ raw_spin_unlock_irqrestore(&pool->lock, flags);
+ /*
+diff --git a/lib/ratelimit.c b/lib/ratelimit.c
+index e01a93f46f83..524cf65dce53 100644
+--- a/lib/ratelimit.c
++++ b/lib/ratelimit.c
+@@ -47,9 +47,7 @@ int ___ratelimit(struct ratelimit_state *rs, const char *func)
+ if (time_is_before_jiffies(rs->begin + rs->interval)) {
+ if (rs->missed) {
+ if (!(rs->flags & RATELIMIT_MSG_ON_RELEASE)) {
+- printk_deferred(KERN_WARNING
+- "%s: %d callbacks suppressed\n",
+- func, rs->missed);
++ pr_warn("%s: %d callbacks suppressed\n", func, rs->missed);
+ rs->missed = 0;
+ }
+ }
+--
+2.33.1
+