aboutsummaryrefslogtreecommitdiff
path: root/kernel/printk.c
diff options
context:
space:
mode:
authorSteve French <sfrench@us.ibm.com>2008-04-17 23:38:45 +0000
committerSteve French <sfrench@us.ibm.com>2008-04-17 23:38:45 +0000
commit20e673810c69d18bee2ed74d19af3806ec2504f5 (patch)
tree7c22dc5246295a82f2688a23ae1c7f3a4f424302 /kernel/printk.c
parent8d142137b4fe87188f211042b16a5993964226f9 (diff)
parent4b119e21d0c66c22e8ca03df05d9de623d0eb50f (diff)
Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6
Diffstat (limited to 'kernel/printk.c')
-rw-r--r--kernel/printk.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/kernel/printk.c b/kernel/printk.c
index c46a20a19a1..bdd4ea8c3f2 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -643,8 +643,21 @@ static int acquire_console_semaphore_for_printk(unsigned int cpu)
{
int retval = 0;
- if (can_use_console(cpu))
- retval = !try_acquire_console_sem();
+ if (!try_acquire_console_sem()) {
+ retval = 1;
+
+ /*
+ * If we can't use the console, we need to release
+ * the console semaphore by hand to avoid flushing
+ * the buffer. We need to hold the console semaphore
+ * in order to do this test safely.
+ */
+ if (!can_use_console(cpu)) {
+ console_locked = 0;
+ up(&console_sem);
+ retval = 0;
+ }
+ }
printk_cpu = UINT_MAX;
spin_unlock(&logbuf_lock);
return retval;