diff options
Diffstat (limited to 'kernel/printk.c')
-rw-r--r-- | kernel/printk.c | 18 |
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 | ||
786 | void 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 | } |
831 | EXPORT_SYMBOL(release_console_sem); | 837 | EXPORT_SYMBOL(release_console_sem); |
832 | 838 | ||