Home Home > GIT Browse
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2005-02-10 16:03:00 -0800
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-02-10 16:03:00 -0800
commit24ddf24c9a4621b69c7763226fb007cfcd1fc1b0 (patch)
tree4780928ad8010bc9a5e7dcf5a7c526c960e75357
parent3c503a0f7353b7223d9b973b72ad98a7ec73377e (diff)
[PATCH] Add try_acquire_console_sem
The new PowerMac sleep code provides an arch hook that can be used by video drivers on laptops to bring back the screen very early, pretty much before anything else. This basically turns reports of the style "my laptop doesn't wakeup" to "I get this or this oops/error/panic on wakeup", making fixing the PM related bugs possible on a whole range of them. However, the fbdev wakeup code triggers WARN_ON's in the VT subsystem if called without the console semaphore when redrawing the screen (I added those warnings a couple of kernel versions ago), and we can't call acquire_console_sem() since we are so early in the wakeup process that we are considered as in_atomic() (we hold irqs off too). This patch addds a try_acquire_console_sem() function that can be used by those video drivers that implement this early wakeup hook. If the acquire fails (which should never happen in practice), wakeup is delayed to the normal PCI callback which does a blocking acquire_console_sem(). Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--include/linux/console.h1
-rw-r--r--kernel/printk.c10
2 files changed, 11 insertions, 0 deletions
diff --git a/include/linux/console.h b/include/linux/console.h
index d5077755f78c..99fd8e4be694 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -105,6 +105,7 @@ extern void register_console(struct console *);
extern int unregister_console(struct console *);
extern struct console *console_drivers;
extern void acquire_console_sem(void);
+extern int try_acquire_console_sem(void);
extern void release_console_sem(void);
extern void console_conditional_schedule(void);
extern void console_unblank(void);
diff --git a/kernel/printk.c b/kernel/printk.c
index d914a90d6206..d981e7e4153a 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -611,6 +611,16 @@ void acquire_console_sem(void)
}
EXPORT_SYMBOL(acquire_console_sem);
+int try_acquire_console_sem(void)
+{
+ if (down_trylock(&console_sem))
+ return -1;
+ console_locked = 1;
+ console_may_schedule = 0;
+ return 0;
+}
+EXPORT_SYMBOL(try_acquire_console_sem);
+
int is_console_locked(void)
{
return console_locked;