• K
    printk() - isolate KERN_CONT users from ordinary complete lines · c313af14
    Kay Sievers 提交于
    Arrange the continuation printk() buffering to be fully separated from the
    ordinary full line users.
    
    Limit the exposure to races and wrong printk() line merges to users of
    continuation only. Ordinary full line users racing against continuation
    users will no longer affect each other.
    
    Multiple continuation users from different threads, racing against each
    other will not wrongly be merged into a single line, but printed as
    separate lines.
    
    Test output of a kernel module which starts two separate threads which
    race against each other, one of them printing a single full terminated
    line:
      printk("(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)\n");
    
    The other one printing the line, every character separate in a
    continuation loop:
      printk("(C");
      for (i = 0; i < 58; i++)
              printk(KERN_CONT "C");
      printk(KERN_CONT "C)\n");
    
    Behavior of single and non-thread-aware printk() buffer:
      # modprobe printk-race
      printk test init
      (CC(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)
      C(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)
      CC(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)
      C(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)
      CC(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)
      C(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)
      C(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)
      CC(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)
      C(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)
      C(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)
      CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC)
      (CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC)
    
    New behavior with separate and thread-aware continuation buffer:
      # modprobe printk-race
      printk test init
      (AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)
      (AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)
      (AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)
      (CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC)
      (AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)
      (AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)
      (AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)
      (AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)
      (CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC)
      (CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC)
    
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Joe Perches <joe@perches.com>
    Cc: Ted Ts'o <tytso@mit.edu>
    Cc: Ingo Molnar  <mingo@kernel.org>
    Cc: Jonathan Corbet <corbet@lwn.net>
    Cc: Sasha Levin <levinsasha928@gmail.com>
    Signed-off-by: NKay Sievers <kay@vrfy.org>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    c313af14
printk.c 57.4 KB