Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 093a07e2 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Fix locking bug in "acquire_console_semaphore_for_printk()"

When I cleaned up printk() and split up the printk locking logic in
commit 266c2e0a ("Make printk() console
semaphore accesses sensible") I had incorrectly moved the call to
have_callable_console() outside of the console semaphore.

That was buggy.  The console semaphore protects the console_drivers list
that is used by have_callable_console().

Thanks go to Bongani Hlope who saw this as a hang on shutdown and reboot
and bisected the bug to the right commit, and tested this patch. See

	http://lkml.org/lkml/2008/4/11/315



Bisected-and-tested-by: default avatarBongani Hlope <bonganilinux@mweb.co.za>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 0de19a45
Loading
Loading
Loading
Loading
+15 −2
Original line number Original line Diff line number Diff line
@@ -643,8 +643,21 @@ static int acquire_console_semaphore_for_printk(unsigned int cpu)
{
{
	int retval = 0;
	int retval = 0;


	if (can_use_console(cpu))
	if (!try_acquire_console_sem()) {
		retval = !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;
	printk_cpu = UINT_MAX;
	spin_unlock(&logbuf_lock);
	spin_unlock(&logbuf_lock);
	return retval;
	return retval;