diff options
| author | Steve French <sfrench@us.ibm.com> | 2006-06-20 16:36:38 -0400 | 
|---|---|---|
| committer | Steve French <sfrench@us.ibm.com> | 2006-06-20 16:36:38 -0400 | 
| commit | 75ba632a01d4dc70d0a0f3a92b5ec9b4a3644b2d (patch) | |
| tree | c2f02ee30609d0d69308b4ca80d68d02a5f85552 /kernel/printk.c | |
| parent | 0fd1ffe0633b4b039b343b753598e6df435e034d (diff) | |
| parent | 25f42b6af09e34c3f92107b36b5aa6edc2fdba2f (diff) | |
Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Diffstat (limited to 'kernel/printk.c')
| -rw-r--r-- | kernel/printk.c | 28 | 
1 files changed, 27 insertions, 1 deletions
| diff --git a/kernel/printk.c b/kernel/printk.c index c056f3324432..19a955619294 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
| @@ -67,6 +67,7 @@ EXPORT_SYMBOL(oops_in_progress); | |||
| 67 | * driver system. | 67 | * driver system. | 
| 68 | */ | 68 | */ | 
| 69 | static DECLARE_MUTEX(console_sem); | 69 | static DECLARE_MUTEX(console_sem); | 
| 70 | static DECLARE_MUTEX(secondary_console_sem); | ||
| 70 | struct console *console_drivers; | 71 | struct console *console_drivers; | 
| 71 | /* | 72 | /* | 
| 72 | * This is used for debugging the mess that is the VT code by | 73 | * This is used for debugging the mess that is the VT code by | 
| @@ -76,7 +77,7 @@ struct console *console_drivers; | |||
| 76 | * path in the console code where we end up in places I want | 77 | * path in the console code where we end up in places I want | 
| 77 | * locked without the console sempahore held | 78 | * locked without the console sempahore held | 
| 78 | */ | 79 | */ | 
| 79 | static int console_locked; | 80 | static int console_locked, console_suspended; | 
| 80 | 81 | ||
| 81 | /* | 82 | /* | 
| 82 | * logbuf_lock protects log_buf, log_start, log_end, con_start and logged_chars | 83 | * logbuf_lock protects log_buf, log_start, log_end, con_start and logged_chars | 
| @@ -698,6 +699,23 @@ int __init add_preferred_console(char *name, int idx, char *options) | |||
| 698 | } | 699 | } | 
| 699 | 700 | ||
| 700 | /** | 701 | /** | 
| 702 | * suspend_console - suspend the console subsystem | ||
| 703 | * | ||
| 704 | * This disables printk() while we go into suspend states | ||
| 705 | */ | ||
| 706 | void suspend_console(void) | ||
| 707 | { | ||
| 708 | acquire_console_sem(); | ||
| 709 | console_suspended = 1; | ||
| 710 | } | ||
| 711 | |||
| 712 | void resume_console(void) | ||
| 713 | { | ||
| 714 | console_suspended = 0; | ||
| 715 | release_console_sem(); | ||
| 716 | } | ||
| 717 | |||
| 718 | /** | ||
| 701 | * acquire_console_sem - lock the console system for exclusive use. | 719 | * acquire_console_sem - lock the console system for exclusive use. | 
| 702 | * | 720 | * | 
| 703 | * Acquires a semaphore which guarantees that the caller has | 721 | * Acquires a semaphore which guarantees that the caller has | 
| @@ -708,6 +726,10 @@ int __init add_preferred_console(char *name, int idx, char *options) | |||
| 708 | void acquire_console_sem(void) | 726 | void acquire_console_sem(void) | 
| 709 | { | 727 | { | 
| 710 | BUG_ON(in_interrupt()); | 728 | BUG_ON(in_interrupt()); | 
| 729 | if (console_suspended) { | ||
| 730 | down(&secondary_console_sem); | ||
| 731 | return; | ||
| 732 | } | ||
| 711 | down(&console_sem); | 733 | down(&console_sem); | 
| 712 | console_locked = 1; | 734 | console_locked = 1; | 
| 713 | console_may_schedule = 1; | 735 | console_may_schedule = 1; | 
| @@ -750,6 +772,10 @@ void release_console_sem(void) | |||
| 750 | unsigned long _con_start, _log_end; | 772 | unsigned long _con_start, _log_end; | 
| 751 | unsigned long wake_klogd = 0; | 773 | unsigned long wake_klogd = 0; | 
| 752 | 774 | ||
| 775 | if (console_suspended) { | ||
| 776 | up(&secondary_console_sem); | ||
| 777 | return; | ||
| 778 | } | ||
| 753 | for ( ; ; ) { | 779 | for ( ; ; ) { | 
| 754 | spin_lock_irqsave(&logbuf_lock, flags); | 780 | spin_lock_irqsave(&logbuf_lock, flags); | 
| 755 | wake_klogd |= log_start - log_end; | 781 | wake_klogd |= log_start - log_end; | 
