|
@@ -63,8 +63,6 @@ void asmlinkage __attribute__((weak)) early_printk(const char *fmt, ...)
|
|
|
#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
|
|
|
#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */
|
|
|
|
|
|
-DECLARE_WAIT_QUEUE_HEAD(log_wait);
|
|
|
-
|
|
|
int console_printk[4] = {
|
|
|
DEFAULT_CONSOLE_LOGLEVEL, /* console_loglevel */
|
|
|
DEFAULT_MESSAGE_LOGLEVEL, /* default_message_loglevel */
|
|
@@ -224,6 +222,7 @@ struct log {
|
|
|
static DEFINE_RAW_SPINLOCK(logbuf_lock);
|
|
|
|
|
|
#ifdef CONFIG_PRINTK
|
|
|
+DECLARE_WAIT_QUEUE_HEAD(log_wait);
|
|
|
/* the next printk record to read by syslog(READ) or /proc/kmsg */
|
|
|
static u64 syslog_seq;
|
|
|
static u32 syslog_idx;
|
|
@@ -1957,45 +1956,6 @@ int is_console_locked(void)
|
|
|
return console_locked;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * Delayed printk version, for scheduler-internal messages:
|
|
|
- */
|
|
|
-#define PRINTK_BUF_SIZE 512
|
|
|
-
|
|
|
-#define PRINTK_PENDING_WAKEUP 0x01
|
|
|
-#define PRINTK_PENDING_SCHED 0x02
|
|
|
-
|
|
|
-static DEFINE_PER_CPU(int, printk_pending);
|
|
|
-static DEFINE_PER_CPU(char [PRINTK_BUF_SIZE], printk_sched_buf);
|
|
|
-
|
|
|
-static void wake_up_klogd_work_func(struct irq_work *irq_work)
|
|
|
-{
|
|
|
- int pending = __this_cpu_xchg(printk_pending, 0);
|
|
|
-
|
|
|
- if (pending & PRINTK_PENDING_SCHED) {
|
|
|
- char *buf = __get_cpu_var(printk_sched_buf);
|
|
|
- printk(KERN_WARNING "[sched_delayed] %s", buf);
|
|
|
- }
|
|
|
-
|
|
|
- if (pending & PRINTK_PENDING_WAKEUP)
|
|
|
- wake_up_interruptible(&log_wait);
|
|
|
-}
|
|
|
-
|
|
|
-static DEFINE_PER_CPU(struct irq_work, wake_up_klogd_work) = {
|
|
|
- .func = wake_up_klogd_work_func,
|
|
|
- .flags = IRQ_WORK_LAZY,
|
|
|
-};
|
|
|
-
|
|
|
-void wake_up_klogd(void)
|
|
|
-{
|
|
|
- preempt_disable();
|
|
|
- if (waitqueue_active(&log_wait)) {
|
|
|
- this_cpu_or(printk_pending, PRINTK_PENDING_WAKEUP);
|
|
|
- irq_work_queue(&__get_cpu_var(wake_up_klogd_work));
|
|
|
- }
|
|
|
- preempt_enable();
|
|
|
-}
|
|
|
-
|
|
|
static void console_cont_flush(char *text, size_t size)
|
|
|
{
|
|
|
unsigned long flags;
|
|
@@ -2458,6 +2418,44 @@ static int __init printk_late_init(void)
|
|
|
late_initcall(printk_late_init);
|
|
|
|
|
|
#if defined CONFIG_PRINTK
|
|
|
+/*
|
|
|
+ * Delayed printk version, for scheduler-internal messages:
|
|
|
+ */
|
|
|
+#define PRINTK_BUF_SIZE 512
|
|
|
+
|
|
|
+#define PRINTK_PENDING_WAKEUP 0x01
|
|
|
+#define PRINTK_PENDING_SCHED 0x02
|
|
|
+
|
|
|
+static DEFINE_PER_CPU(int, printk_pending);
|
|
|
+static DEFINE_PER_CPU(char [PRINTK_BUF_SIZE], printk_sched_buf);
|
|
|
+
|
|
|
+static void wake_up_klogd_work_func(struct irq_work *irq_work)
|
|
|
+{
|
|
|
+ int pending = __this_cpu_xchg(printk_pending, 0);
|
|
|
+
|
|
|
+ if (pending & PRINTK_PENDING_SCHED) {
|
|
|
+ char *buf = __get_cpu_var(printk_sched_buf);
|
|
|
+ printk(KERN_WARNING "[sched_delayed] %s", buf);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pending & PRINTK_PENDING_WAKEUP)
|
|
|
+ wake_up_interruptible(&log_wait);
|
|
|
+}
|
|
|
+
|
|
|
+static DEFINE_PER_CPU(struct irq_work, wake_up_klogd_work) = {
|
|
|
+ .func = wake_up_klogd_work_func,
|
|
|
+ .flags = IRQ_WORK_LAZY,
|
|
|
+};
|
|
|
+
|
|
|
+void wake_up_klogd(void)
|
|
|
+{
|
|
|
+ preempt_disable();
|
|
|
+ if (waitqueue_active(&log_wait)) {
|
|
|
+ this_cpu_or(printk_pending, PRINTK_PENDING_WAKEUP);
|
|
|
+ irq_work_queue(&__get_cpu_var(wake_up_klogd_work));
|
|
|
+ }
|
|
|
+ preempt_enable();
|
|
|
+}
|
|
|
|
|
|
int printk_sched(const char *fmt, ...)
|
|
|
{
|