ab486bc9a5
Pull printk updates from Petr Mladek: - Add a console_msg_format command line option: The value "default" keeps the old "[time stamp] text\n" format. The value "syslog" allows to see the syslog-like "<log level>[timestamp] text" format. This feature was requested by people doing regression tests, for example, 0day robot. They want to have both filtered and full logs at hands. - Reduce the risk of softlockup: Pass the console owner in a busy loop. This is a new approach to the old problem. It was first proposed by Steven Rostedt on Kernel Summit 2017. It marks a context in which the console_lock owner calls console drivers and could not sleep. On the other side, printk() callers could detect this state and use a busy wait instead of a simple console_trylock(). Finally, the console_lock owner checks if there is a busy waiter at the end of the special context and eventually passes the console_lock to the waiter. The hand-off works surprisingly well and helps in many situations. Well, there is still a possibility of the softlockup, for example, when the flood of messages stops and the last owner still has too much to flush. There is increasing number of people having problems with printk-related softlockups. We might eventually need to get better solution. Anyway, this looks like a good start and promising direction. - Do not allow to schedule in console_unlock() called from printk(): This reverts an older controversial commit. The reschedule helped to avoid softlockups. But it also slowed down the console output. This patch is obsoleted by the new console waiter logic described above. In fact, the reschedule made the hand-off less effective. - Deprecate "%pf" and "%pF" format specifier: It was needed on ia64, ppc64 and parisc64 to dereference function descriptors and show the real function address. It is done transparently by "%ps" and "pS" format specifier now. Sergey Senozhatsky found that all the function descriptors were in a special elf section and could be easily detected. - Remove printk_symbol() API: It has been obsoleted by "%pS" format specifier, and this change helped to remove few continuous lines and a less intuitive old API. - Remove redundant memsets: Sergey removed unnecessary memset when processing printk.devkmsg command line option. * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/pmladek/printk: (27 commits) printk: drop redundant devkmsg_log_str memsets printk: Never set console_may_schedule in console_trylock() printk: Hide console waiter logic into helpers printk: Add console owner and waiter logic to load balance console writes kallsyms: remove print_symbol() function checkpatch: add pF/pf deprecation warning symbol lookup: introduce dereference_symbol_descriptor() parisc64: Add .opd based function descriptor dereference powerpc64: Add .opd based function descriptor dereference ia64: Add .opd based function descriptor dereference sections: split dereference_function_descriptor() openrisc: Fix conflicting types for _exext and _stext lib: do not use print_symbol() irq debug: do not use print_symbol() sysfs: do not use print_symbol() drivers: do not use print_symbol() x86: do not use print_symbol() unicore32: do not use print_symbol() sh: do not use print_symbol() mn10300: do not use print_symbol() ...
49 lines
1.2 KiB
C
49 lines
1.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Debugging printout:
|
|
*/
|
|
|
|
#define ___P(f) if (desc->status_use_accessors & f) printk("%14s set\n", #f)
|
|
#define ___PS(f) if (desc->istate & f) printk("%14s set\n", #f)
|
|
/* FIXME */
|
|
#define ___PD(f) do { } while (0)
|
|
|
|
static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc)
|
|
{
|
|
static DEFINE_RATELIMIT_STATE(ratelimit, 5 * HZ, 5);
|
|
|
|
if (!__ratelimit(&ratelimit))
|
|
return;
|
|
|
|
printk("irq %d, desc: %p, depth: %d, count: %d, unhandled: %d\n",
|
|
irq, desc, desc->depth, desc->irq_count, desc->irqs_unhandled);
|
|
printk("->handle_irq(): %p, %pS\n",
|
|
desc->handle_irq, desc->handle_irq);
|
|
printk("->irq_data.chip(): %p, %pS\n",
|
|
desc->irq_data.chip, desc->irq_data.chip);
|
|
printk("->action(): %p\n", desc->action);
|
|
if (desc->action) {
|
|
printk("->action->handler(): %p, %pS\n",
|
|
desc->action->handler, desc->action->handler);
|
|
}
|
|
|
|
___P(IRQ_LEVEL);
|
|
___P(IRQ_PER_CPU);
|
|
___P(IRQ_NOPROBE);
|
|
___P(IRQ_NOREQUEST);
|
|
___P(IRQ_NOTHREAD);
|
|
___P(IRQ_NOAUTOEN);
|
|
|
|
___PS(IRQS_AUTODETECT);
|
|
___PS(IRQS_REPLAY);
|
|
___PS(IRQS_WAITING);
|
|
___PS(IRQS_PENDING);
|
|
|
|
___PD(IRQS_INPROGRESS);
|
|
___PD(IRQS_DISABLED);
|
|
___PD(IRQS_MASKED);
|
|
}
|
|
|
|
#undef ___P
|
|
#undef ___PS
|
|
#undef ___PD
|