console-make-rt-friendly.patch
authorThomas Gleixner <tglx@linutronix.de>
Sun, 17 Jul 2011 20:43:07 +0000 (22:43 +0200)
committerClark Williams <williams@redhat.com>
Wed, 15 Feb 2012 16:33:00 +0000 (10:33 -0600)
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
kernel/printk.c

index 2b95bc06e7c856806fca36bcd0f808f45c8e8768..fad23c88bf6e05e0e6d8f04d1e02295e8e7eedcf 100644 (file)
@@ -504,6 +504,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;
@@ -512,6 +513,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
@@ -827,12 +829,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;
 
                /*
@@ -1010,8 +1018,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:
@@ -1321,11 +1336,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;