diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2011-07-17 22:43:07 +0200 |
---|---|---|
committer | Clark Williams <williams@redhat.com> | 2012-04-13 11:01:49 -0500 |
commit | 88edc0eb4ba26aab0fa47e2acc2a847ce8f9e7c1 (patch) | |
tree | a9b41f41b44e2cea98cb75dd298058b3bed13c4f /kernel | |
parent | de300e79815874f625a381f7ab8a70014b6a4215 (diff) |
console-make-rt-friendly.patch
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/printk.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/kernel/printk.c b/kernel/printk.c index 9a27a9461cda..28baa3622fab 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -507,6 +507,7 @@ static void __call_console_drivers(unsigned start, unsigned end) { struct console *con; + migrate_disable(); for_each_console(con) { if (exclusive_console && con != exclusive_console) continue; @@ -515,6 +516,7 @@ static void __call_console_drivers(unsigned start, unsigned end) (con->flags & CON_ANYTIME))) con->write(con, &LOG_BUF(start), end - start); } + migrate_enable(); } #ifdef CONFIG_EARLY_PRINTK @@ -839,12 +841,18 @@ static inline int can_use_console(unsigned int cpu) * interrupts disabled. It should return with 'lockbuf_lock' * released but interrupts still disabled. */ -static int console_trylock_for_printk(unsigned int cpu) +static int console_trylock_for_printk(unsigned int cpu, unsigned long flags) __releases(&logbuf_lock) { int retval = 0, wake = 0; +#ifdef CONFIG_PREEMPT_RT_FULL + int lock = !early_boot_irqs_disabled && !irqs_disabled_flags(flags) && + !preempt_count(); +#else + int lock = 1; +#endif - if (console_trylock()) { + if (lock && console_trylock()) { retval = 1; /* @@ -1021,8 +1029,15 @@ asmlinkage int vprintk(const char *fmt, va_list args) * will release 'logbuf_lock' regardless of whether it * actually gets the semaphore or not. */ - if (console_trylock_for_printk(this_cpu)) + if (console_trylock_for_printk(this_cpu, flags)) { +#ifndef CONFIG_PREEMPT_RT_FULL console_unlock(); +#else + raw_local_irq_restore(flags); + console_unlock(); + raw_local_irq_save(flags); +#endif + } lockdep_on(); out_restore_irqs: @@ -1345,11 +1360,16 @@ again: _con_start = con_start; _log_end = log_end; con_start = log_end; /* Flush */ +#ifndef CONFIG_PREEMPT_RT_FULL raw_spin_unlock(&logbuf_lock); stop_critical_timings(); /* don't trace print latency */ call_console_drivers(_con_start, _log_end); start_critical_timings(); local_irq_restore(flags); +#else + raw_spin_unlock_irqrestore(&logbuf_lock, flags); + call_console_drivers(_con_start, _log_end); +#endif } console_locked = 0; |