Merge tag 'printk-for-4.18' of git://git.kernel.org/pub/scm/linux/kernel/git/pmladek/printk
Pull printk updates from Petr Mladek: - Help userspace log daemons to catch up with a flood of messages. They will get woken after each message even if the console is far behind and handled by another process. - Flush printk safe buffers safely even when panic() happens in the normal context. - Fix possible va_list reuse when race happened in printk_safe(). - Remove %pCr printf format to prevent sleeping in the atomic context. - Misc vsprintf code cleanup. * tag 'printk-for-4.18' of git://git.kernel.org/pub/scm/linux/kernel/git/pmladek/printk: printk: drop in_nmi check from printk_safe_flush_on_panic() lib/vsprintf: Remove atomic-unsafe support for %pCr serial: sh-sci: Stop using printk format %pCr thermal: bcm2835: Stop using printk format %pCr clk: renesas: cpg-mssr: Stop using printk format %pCr printk: fix possible reuse of va_list variable printk: wake up klogd in vprintk_emit vsprintf: Tweak pF/pf comment lib/vsprintf: Mark expected switch fall-through lib/vsprintf: Replace space with '_' before crng is ready lib/vsprintf: Deduplicate pointer_string() lib/vsprintf: Move pointer_string() upper lib/vsprintf: Make flag_spec global lib/vsprintf: Make strspec global lib/vsprintf: Make dec_spec global lib/test_printf: Mark big constant with UL
This commit is contained in:
@@ -1908,6 +1908,7 @@ asmlinkage int vprintk_emit(int facility, int level,
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
wake_up_klogd();
|
||||
return printed_len;
|
||||
}
|
||||
EXPORT_SYMBOL(vprintk_emit);
|
||||
@@ -2289,9 +2290,7 @@ void console_unlock(void)
|
||||
{
|
||||
static char ext_text[CONSOLE_EXT_LOG_MAX];
|
||||
static char text[LOG_LINE_MAX + PREFIX_MAX];
|
||||
static u64 seen_seq;
|
||||
unsigned long flags;
|
||||
bool wake_klogd = false;
|
||||
bool do_cond_resched, retry;
|
||||
|
||||
if (console_suspended) {
|
||||
@@ -2335,11 +2334,6 @@ again:
|
||||
|
||||
printk_safe_enter_irqsave(flags);
|
||||
raw_spin_lock(&logbuf_lock);
|
||||
if (seen_seq != log_next_seq) {
|
||||
wake_klogd = true;
|
||||
seen_seq = log_next_seq;
|
||||
}
|
||||
|
||||
if (console_seq < log_first_seq) {
|
||||
len = sprintf(text, "** %u printk messages dropped **\n",
|
||||
(unsigned)(log_first_seq - console_seq));
|
||||
@@ -2397,7 +2391,7 @@ skip:
|
||||
|
||||
if (console_lock_spinning_disable_and_check()) {
|
||||
printk_safe_exit_irqrestore(flags);
|
||||
goto out;
|
||||
return;
|
||||
}
|
||||
|
||||
printk_safe_exit_irqrestore(flags);
|
||||
@@ -2429,10 +2423,6 @@ skip:
|
||||
|
||||
if (retry && console_trylock())
|
||||
goto again;
|
||||
|
||||
out:
|
||||
if (wake_klogd)
|
||||
wake_up_klogd();
|
||||
}
|
||||
EXPORT_SYMBOL(console_unlock);
|
||||
|
||||
|
@@ -82,6 +82,7 @@ static __printf(2, 0) int printk_safe_log_store(struct printk_safe_seq_buf *s,
|
||||
{
|
||||
int add;
|
||||
size_t len;
|
||||
va_list ap;
|
||||
|
||||
again:
|
||||
len = atomic_read(&s->len);
|
||||
@@ -100,7 +101,9 @@ again:
|
||||
if (!len)
|
||||
smp_rmb();
|
||||
|
||||
add = vscnprintf(s->buffer + len, sizeof(s->buffer) - len, fmt, args);
|
||||
va_copy(ap, args);
|
||||
add = vscnprintf(s->buffer + len, sizeof(s->buffer) - len, fmt, ap);
|
||||
va_end(ap);
|
||||
if (!add)
|
||||
return 0;
|
||||
|
||||
@@ -278,7 +281,7 @@ void printk_safe_flush_on_panic(void)
|
||||
* Make sure that we could access the main ring buffer.
|
||||
* Do not risk a double release when more CPUs are up.
|
||||
*/
|
||||
if (in_nmi() && raw_spin_is_locked(&logbuf_lock)) {
|
||||
if (raw_spin_is_locked(&logbuf_lock)) {
|
||||
if (num_online_cpus() > 1)
|
||||
return;
|
||||
|
||||
|
Reference in New Issue
Block a user