diff options
| author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2005-03-30 16:41:23 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-03-30 16:41:23 -0800 |
| commit | 79568b259e375ca02af4263b18abfb5d91e626c7 (patch) | |
| tree | 0196c19c950d574a9d0c9af37c2213b68e482973 /kernel | |
| parent | 5c373c0215bd782a874318673a8e5193ad21a107 (diff) | |
[PATCH] vt: don't call unblank at irq time
This patch removes the call to unblank() from printk, and avoids calling
unblank at irq() time _unless_ oops_in_progress is 1. I also export
oops_in_progress() so drivers who care like radeonfb can test it and know
what to do. I audited call sites of unblank_screen(), console_unblank(),
etc... and I _hope_ I got them all, the patch includes a small patch to
the s390 bust_spinlocks code that sets oops_in_progress back to 0 _after_
unblanking for example.
I added a few might_sleep() to help us catch possible remaining callers.
I'll soon write a document explaining fbdev locking. The current situation
after this patch is that:
- All callbacks have console_semaphore held (fbdev's are fully
serialised).
- Everything is called in schedule'able context, except the cfb_*
rendering operations and cursor operations, with the special case of
unblank who can be called at any time when "oops_in_progress" is true. A
driver that needs to sleep in it's unblank implementation is welcome to
test that variable and use a fallback path (or just do nothing if it's
not simple).
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>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/printk.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/kernel/printk.c b/kernel/printk.c index 5d5754964bf4..1498689548d1 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -54,7 +54,12 @@ int console_printk[4] = { EXPORT_SYMBOL(console_printk); +/* + * Low lever drivers may need that to know if they can schedule in + * their unblank() callback or not. So let's export it. + */ int oops_in_progress; +EXPORT_SYMBOL(oops_in_progress); /* * console_sem protects the console_drivers list, and also @@ -751,12 +756,15 @@ void console_unblank(void) struct console *c; /* - * Try to get the console semaphore. If someone else owns it - * we have to return without unblanking because console_unblank - * may be called in interrupt context. + * console_unblank can no longer be called in interrupt context unless + * oops_in_progress is set to 1.. */ - if (down_trylock(&console_sem) != 0) - return; + if (oops_in_progress) { + if (down_trylock(&console_sem) != 0) + return; + } else + acquire_console_sem(); + console_locked = 1; console_may_schedule = 0; for (c = console_drivers; c != NULL; c = c->next) |
