Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/pmladek...
[sfrench/cifs-2.6.git] / kernel / printk / printk_safe.c
index 3cdaeaef9ce1a63bfde3bc631946e40ed731e035..3e3c2004bb232661bae666e00e4645fad438aee6 100644 (file)
@@ -39,7 +39,7 @@
  * There are situations when we want to make sure that all buffers
  * were handled or when IRQs are blocked.
  */
-static int printk_safe_irq_ready;
+static int printk_safe_irq_ready __read_mostly;
 
 #define SAFE_LOG_BUF_LEN ((1 << CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT) -    \
                                sizeof(atomic_t) -                      \
@@ -63,11 +63,8 @@ static DEFINE_PER_CPU(struct printk_safe_seq_buf, nmi_print_seq);
 /* Get flushed in a more safe context. */
 static void queue_flush_work(struct printk_safe_seq_buf *s)
 {
-       if (printk_safe_irq_ready) {
-               /* Make sure that IRQ work is really initialized. */
-               smp_rmb();
+       if (printk_safe_irq_ready)
                irq_work_queue(&s->work);
-       }
 }
 
 /*
@@ -75,7 +72,7 @@ static void queue_flush_work(struct printk_safe_seq_buf *s)
  * have dedicated buffers, because otherwise printk-safe preempted by
  * NMI-printk would have overwritten the NMI messages.
  *
- * The messages are fushed from irq work (or from panic()), possibly,
+ * The messages are flushed from irq work (or from panic()), possibly,
  * from other CPU, concurrently with printk_safe_log_store(). Should this
  * happen, printk_safe_log_store() will notice the buffer->len mismatch
  * and repeat the write.
@@ -398,8 +395,12 @@ void __init printk_safe_init(void)
 #endif
        }
 
-       /* Make sure that IRQ works are initialized before enabling. */
-       smp_wmb();
+       /*
+        * In the highly unlikely event that a NMI were to trigger at
+        * this moment. Make sure IRQ work is set up before this
+        * variable is set.
+        */
+       barrier();
        printk_safe_irq_ready = 1;
 
        /* Flush pending messages that did not have scheduled IRQ works. */