aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/printk.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/printk.c')
-rw-r--r--kernel/printk.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/kernel/printk.c b/kernel/printk.c
index c770e1a4e882..0c151877ff71 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -483,7 +483,7 @@ static int have_callable_console(void)
483 * printk - print a kernel message 483 * printk - print a kernel message
484 * @fmt: format string 484 * @fmt: format string
485 * 485 *
486 * This is printk. It can be called from any context. We want it to work. 486 * This is printk(). It can be called from any context. We want it to work.
487 * 487 *
488 * We try to grab the console_sem. If we succeed, it's easy - we log the output and 488 * We try to grab the console_sem. If we succeed, it's easy - we log the output and
489 * call the console drivers. If we fail to get the semaphore we place the output 489 * call the console drivers. If we fail to get the semaphore we place the output
@@ -529,7 +529,7 @@ asmlinkage int vprintk(const char *fmt, va_list args)
529 zap_locks(); 529 zap_locks();
530 530
531 /* This stops the holder of console_sem just where we want him */ 531 /* This stops the holder of console_sem just where we want him */
532 local_irq_save(flags); 532 raw_local_irq_save(flags);
533 lockdep_off(); 533 lockdep_off();
534 spin_lock(&logbuf_lock); 534 spin_lock(&logbuf_lock);
535 printk_cpu = smp_processor_id(); 535 printk_cpu = smp_processor_id();
@@ -618,7 +618,7 @@ asmlinkage int vprintk(const char *fmt, va_list args)
618 up(&console_sem); 618 up(&console_sem);
619 } 619 }
620 lockdep_on(); 620 lockdep_on();
621 local_irq_restore(flags); 621 raw_local_irq_restore(flags);
622 } else { 622 } else {
623 /* 623 /*
624 * Someone else owns the drivers. We drop the spinlock, which 624 * Someone else owns the drivers. We drop the spinlock, which
@@ -628,7 +628,7 @@ asmlinkage int vprintk(const char *fmt, va_list args)
628 printk_cpu = UINT_MAX; 628 printk_cpu = UINT_MAX;
629 spin_unlock(&logbuf_lock); 629 spin_unlock(&logbuf_lock);
630 lockdep_on(); 630 lockdep_on();
631 local_irq_restore(flags); 631 raw_local_irq_restore(flags);
632 } 632 }
633 633
634 preempt_enable(); 634 preempt_enable();
@@ -783,6 +783,12 @@ int is_console_locked(void)
783 return console_locked; 783 return console_locked;
784} 784}
785 785
786void wake_up_klogd(void)
787{
788 if (!oops_in_progress && waitqueue_active(&log_wait))
789 wake_up_interruptible(&log_wait);
790}
791
786/** 792/**
787 * release_console_sem - unlock the console system 793 * release_console_sem - unlock the console system
788 * 794 *
@@ -825,8 +831,8 @@ void release_console_sem(void)
825 console_locked = 0; 831 console_locked = 0;
826 up(&console_sem); 832 up(&console_sem);
827 spin_unlock_irqrestore(&logbuf_lock, flags); 833 spin_unlock_irqrestore(&logbuf_lock, flags);
828 if (wake_klogd && !oops_in_progress && waitqueue_active(&log_wait)) 834 if (wake_klogd)
829 wake_up_interruptible(&log_wait); 835 wake_up_klogd();
830} 836}
831EXPORT_SYMBOL(release_console_sem); 837EXPORT_SYMBOL(release_console_sem);
832 838