Merge tag 'printk-for-4.18' of git://git.kernel.org/pub/scm/linux/kernel/git/pmladek...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 6 Jun 2018 23:04:55 +0000 (16:04 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 6 Jun 2018 23:04:55 +0000 (16:04 -0700)
Pull printk updates from Petr Mladek:

 - Help userspace log daemons to catch up with a flood of messages. They
   will get woken after each message even if the console is far behind
   and handled by another process.

 - Flush printk safe buffers safely even when panic() happens in the
   normal context.

 - Fix possible va_list reuse when race happened in printk_safe().

 - Remove %pCr printf format to prevent sleeping in the atomic context.

 - Misc vsprintf code cleanup.

* tag 'printk-for-4.18' of git://git.kernel.org/pub/scm/linux/kernel/git/pmladek/printk:
  printk: drop in_nmi check from printk_safe_flush_on_panic()
  lib/vsprintf: Remove atomic-unsafe support for %pCr
  serial: sh-sci: Stop using printk format %pCr
  thermal: bcm2835: Stop using printk format %pCr
  clk: renesas: cpg-mssr: Stop using printk format %pCr
  printk: fix possible reuse of va_list variable
  printk: wake up klogd in vprintk_emit
  vsprintf: Tweak pF/pf comment
  lib/vsprintf: Mark expected switch fall-through
  lib/vsprintf: Replace space with '_' before crng is ready
  lib/vsprintf: Deduplicate pointer_string()
  lib/vsprintf: Move pointer_string() upper
  lib/vsprintf: Make flag_spec global
  lib/vsprintf: Make strspec global
  lib/vsprintf: Make dec_spec global
  lib/test_printf: Mark big constant with UL

1  2 
drivers/clk/renesas/renesas-cpg-mssr.c
drivers/tty/serial/sh-sci.c
kernel/printk/printk.c
lib/vsprintf.c

Simple merge
Simple merge
diff --cc lib/vsprintf.c
index 23920c5ff72859c79f4f50e8e267b56c8f230c7c,8999202ad43b0d29ddbb1278d6d45cb2ff1040a5..a48aaa79d352313aa7dda46549f1a3d3e57b0c1f
@@@ -1655,36 -1641,19 +1651,22 @@@ char *device_node_string(char *buf, cha
        return widen_string(buf, buf - buf_start, end, spec);
  }
  
- static noinline_for_stack
- char *pointer_string(char *buf, char *end, const void *ptr,
-                    struct printf_spec spec)
- {
-       spec.base = 16;
-       spec.flags |= SMALL;
-       if (spec.field_width == -1) {
-               spec.field_width = 2 * sizeof(ptr);
-               spec.flags |= ZEROPAD;
-       }
-       return number(buf, end, (unsigned long int)ptr, spec);
- }
 -static bool have_filled_random_ptr_key __read_mostly;
 +static DEFINE_STATIC_KEY_TRUE(not_filled_random_ptr_key);
  static siphash_key_t ptr_key __read_mostly;
  
 -static void fill_random_ptr_key(struct random_ready_callback *unused)
 +static void enable_ptr_key_workfn(struct work_struct *work)
  {
        get_random_bytes(&ptr_key, sizeof(ptr_key));
 -      /*
 -       * have_filled_random_ptr_key==true is dependent on get_random_bytes().
 -       * ptr_to_id() needs to see have_filled_random_ptr_key==true
 -       * after get_random_bytes() returns.
 -       */
 -      smp_mb();
 -      WRITE_ONCE(have_filled_random_ptr_key, true);
 +      /* Needs to run from preemptible context */
 +      static_branch_disable(&not_filled_random_ptr_key);
 +}
 +
 +static DECLARE_WORK(enable_ptr_key_work, enable_ptr_key_workfn);
 +
 +static void fill_random_ptr_key(struct random_ready_callback *unused)
 +{
 +      /* This may be in an interrupt handler. */
 +      queue_work(system_unbound_wq, &enable_ptr_key_work);
  }
  
  static struct random_ready_callback random_ready = {
@@@ -1710,13 -1678,13 +1692,13 @@@ early_initcall(initialize_ptr_random)
  /* Maps a pointer to a 32 bit unique identifier. */
  static char *ptr_to_id(char *buf, char *end, void *ptr, struct printf_spec spec)
  {
+       const char *str = sizeof(ptr) == 8 ? "(____ptrval____)" : "(ptrval)";
        unsigned long hashval;
-       const int default_width = 2 * sizeof(ptr);
  
 -      if (unlikely(!have_filled_random_ptr_key)) {
 +      if (static_branch_unlikely(&not_filled_random_ptr_key)) {
-               spec.field_width = default_width;
+               spec.field_width = 2 * sizeof(ptr);
                /* string length must be less than default_width */
-               return string(buf, end, "(ptrval)", spec);
+               return string(buf, end, str, spec);
        }
  
  #ifdef CONFIG_64BIT