1. 18 2月, 2013 1 次提交
  2. 31 1月, 2013 1 次提交
  3. 05 1月, 2013 1 次提交
    • R
      printk: fix incorrect length from print_time() when seconds > 99999 · 35dac27c
      Roland Dreier 提交于
      print_prefix() passes a NULL buf to print_time() to get the length of
      the time prefix; when printk times are enabled, the current code just
      returns the constant 15, which matches the format "[%5lu.%06lu] " used
      to print the time value.  However, this is obviously incorrect when the
      whole seconds part of the time gets beyond 5 digits (100000 seconds is a
      bit more than a day of uptime).
      
      The simple fix is to use snprintf(NULL, 0, ...) to calculate the actual
      length of the time prefix.  This could be micro-optimized but it seems
      better to have simpler, more readable code here.
      
      The bug leads to the syslog system call miscomputing which messages fit
      into the userspace buffer.  If there are enough messages to fill
      log_buf_len and some have a timestamp >= 100000, dmesg may fail with:
      
          # dmesg
          klogctl: Bad address
      
      When this happens, strace shows that the failure is indeed EFAULT due to
      the kernel mistakenly accessing past the end of dmesg's buffer, since
      dmesg asks the kernel how big a buffer it needs, allocates a bit more,
      and then gets an error when it asks the kernel to fill it:
      
          syslog(0xa, 0, 0)                       = 1048576
          mmap(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa4d25d2000
          syslog(0x3, 0x7fa4d25d2010, 0x100008)   = -1 EFAULT (Bad address)
      
      As far as I can see, the bug has been there as long as print_time(),
      which comes from commit 084681d1 ("printk: flush continuation lines
      immediately to console") in 3.5-rc5.
      Signed-off-by: NRoland Dreier <roland@purestorage.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Cc: Joe Perches <joe@perches.com>
      Cc: Sylvain Munaut <s.munaut@whatever-company.com>
      Cc: <stable@vger.kernel.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      35dac27c
  4. 18 12月, 2012 1 次提交
  5. 24 10月, 2012 1 次提交
    • D
      console: use might_sleep in console_lock · 6b898c07
      Daniel Vetter 提交于
      Instead of BUG_ON(in_interrupt()), since that doesn't check for all
      the newfangled stuff like preempt.
      
      Note that this is valid since the console_sem is essentially used like
      a real mutex with only two twists:
      - we allow trylock from hardirq context
      - across suspend/resume we lock the logical console_lock, but drop the
        semaphore protecting the locking state.
      
      Now that doesn't guarantee that no one is playing tricks in
      single-thread atomic contexts at suspend/resume/boot time, but
      - I couldn't find anything suspicious with some grepping,
      - might_sleep shouldn't die,
      - and I think the upside of catching more potential issues is worth
        the risk of getting a might_sleep backtrace that would have been
        save (and then dealing with that fallout).
      
      Cc: Dave Airlie <airlied@gmail.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      6b898c07
  6. 23 10月, 2012 1 次提交
    • D
      console: implement lockdep support for console_lock · daee7797
      Daniel Vetter 提交于
      Dave Airlie recently discovered a locking bug in the fbcon layer,
      where a timer_del_sync (for the blinking cursor) deadlocks with the
      timer itself, since both (want to) hold the console_lock:
      
      https://lkml.org/lkml/2012/8/21/36
      
      Unfortunately the console_lock isn't a plain mutex and hence has no
      lockdep support. Which resulted in a few days wasted of tracking down
      this bug (complicated by the fact that printk doesn't show anything
      when the console is locked) instead of noticing the bug much earlier
      with the lockdep splat.
      
      Hence I've figured I need to fix that for the next deadlock involving
      console_lock - and with kms/drm growing ever more complex locking
      that'll eventually happen.
      
      Now the console_lock has rather funky semantics, so after a quick irc
      discussion with Thomas Gleixner and Dave Airlie I've quickly ditched
      the original idead of switching to a real mutex (since it won't work)
      and instead opted to annotate the console_lock with lockdep
      information manually.
      
      There are a few special cases:
      - The console_lock state is protected by the console_sem, and usually
        grabbed/dropped at _lock/_unlock time. But the suspend/resume code
        drops the semaphore without dropping the console_lock (see
        suspend_console/resume_console). But since the same thread that did
        the suspend will do the resume, we don't need to fix up anything.
      
      - In the printk code there's a special trylock, only used to kick off
        the logbuffer printk'ing in console_unlock. But all that happens
        while lockdep is disable (since printk does a few other evil
        tricks). So no issue there, either.
      
      - The console_lock can also be acquired form irq context (but only
        with a trylock). lockdep already handles that.
      
      This all leaves us with annotating the normal console_lock, _unlock
      and _trylock functions.
      
      And yes, it works - simply unloading a drm kms driver resulted in
      lockdep complaining about the deadlock in fbcon_deinit:
      
      ======================================================
      [ INFO: possible circular locking dependency detected ]
      3.6.0-rc2+ #552 Not tainted
      -------------------------------------------------------
      kms-reload/3577 is trying to acquire lock:
       ((&info->queue)){+.+...}, at: [<ffffffff81058c70>] wait_on_work+0x0/0xa7
      
      but task is already holding lock:
       (console_lock){+.+.+.}, at: [<ffffffff81264686>] bind_con_driver+0x38/0x263
      
      which lock already depends on the new lock.
      
      the existing dependency chain (in reverse order) is:
      
      -> #1 (console_lock){+.+.+.}:
             [<ffffffff81087440>] lock_acquire+0x95/0x105
             [<ffffffff81040190>] console_lock+0x59/0x5b
             [<ffffffff81209cb6>] fb_flashcursor+0x2e/0x12c
             [<ffffffff81057c3e>] process_one_work+0x1d9/0x3b4
             [<ffffffff810584a2>] worker_thread+0x1a7/0x24b
             [<ffffffff8105ca29>] kthread+0x7f/0x87
             [<ffffffff813b1204>] kernel_thread_helper+0x4/0x10
      
      -> #0 ((&info->queue)){+.+...}:
             [<ffffffff81086cb3>] __lock_acquire+0x999/0xcf6
             [<ffffffff81087440>] lock_acquire+0x95/0x105
             [<ffffffff81058cab>] wait_on_work+0x3b/0xa7
             [<ffffffff81058dd6>] __cancel_work_timer+0xbf/0x102
             [<ffffffff81058e33>] cancel_work_sync+0xb/0xd
             [<ffffffff8120a3b3>] fbcon_deinit+0x11c/0x1dc
             [<ffffffff81264793>] bind_con_driver+0x145/0x263
             [<ffffffff81264a45>] unbind_con_driver+0x14f/0x195
             [<ffffffff8126540c>] store_bind+0x1ad/0x1c1
             [<ffffffff8127cbb7>] dev_attr_store+0x13/0x1f
             [<ffffffff8116d884>] sysfs_write_file+0xe9/0x121
             [<ffffffff811145b2>] vfs_write+0x9b/0xfd
             [<ffffffff811147b7>] sys_write+0x3e/0x6b
             [<ffffffff813b0039>] system_call_fastpath+0x16/0x1b
      
      other info that might help us debug this:
      
       Possible unsafe locking scenario:
      
             CPU0                    CPU1
             ----                    ----
        lock(console_lock);
                                     lock((&info->queue));
                                     lock(console_lock);
        lock((&info->queue));
      
       *** DEADLOCK ***
      
      v2: Mark the lockdep_map static, noticed by Jani Nikula.
      
      Cc: Dave Airlie <airlied@gmail.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Signed-off-by: NDaniel Vetter <daniel.vetter@ffwll.ch>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      daee7797
  7. 17 10月, 2012 1 次提交
  8. 13 8月, 2012 1 次提交
    • J
      printk: Fix calculation of length used to discard records · e3756477
      Jeff Mahoney 提交于
      While tracking down a weird buffer overflow issue in a program that
      looked to be sane, I started double checking the length returned by
      syslog(SYSLOG_ACTION_READ_ALL, ...) to make sure it wasn't overflowing
      the buffer.
      
      Sure enough, it was.  I saw this in strace:
      
        11339 syslog(SYSLOG_ACTION_READ_ALL, "<5>[244017.708129] REISERFS (dev"..., 8192) = 8279
      
      It turns out that the loops that calculate how much space the entries
      will take when they're copied don't include the newlines and prefixes
      that will be included in the final output since prev flags is passed as
      zero.
      
      This patch properly accounts for it and fixes the overflow.
      
      CC: stable@kernel.org
      Signed-off-by: NJeff Mahoney <jeffm@suse.com>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      e3756477
  9. 31 7月, 2012 3 次提交
  10. 22 7月, 2012 2 次提交
  11. 20 7月, 2012 1 次提交
    • V
      printk: Export struct log size and member offsets through vmcoreinfo · 6791457a
      Vivek Goyal 提交于
      There are tools like makedumpfile and vmcore-dmesg which can extract
      kernel log buffer from vmcore. Since we introduced structured logging,
      that functionality is broken. Now user space tools need to know about
      "struct log" and offsets of various fields to be able to parse struct
      log data and extract text message or dictonary.
      
      This patch exports some of the fields.
      
      Currently I am not exporting log "level" info as that is a bitfield and
      offsetof() bitfields can't be calculated. But if people start asking for
      log level info in the output then we probably either need to seprate
      out "level" or use bit shift operations for flags and level.
      Signed-off-by: NVivek Goyal <vgoyal@redhat.com>
      Acked-by: NKay Sievers <kay@vrfy.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      6791457a
  12. 17 7月, 2012 4 次提交
  13. 10 7月, 2012 2 次提交
  14. 07 7月, 2012 5 次提交
  15. 01 7月, 2012 1 次提交
  16. 30 6月, 2012 1 次提交
  17. 29 6月, 2012 1 次提交
    • K
      printk: flush continuation lines immediately to console · 084681d1
      Kay Sievers 提交于
      Continuation lines are buffered internally, intended to merge the
      chunked printk()s into a single record, and to isolate potentially
      racy continuation users from usual terminated line users.
      
      This though, has the effect that partial lines are not printed to
      the console in the moment they are emitted. In case the kernel
      crashes in the meantime, the potentially interesting printed
      information would never reach the consoles.
      
      Here we share the continuation buffer with the console copy logic,
      and partial lines are always immediately flushed to the available
      consoles. They are still buffered internally to improve the
      readability and integrity of the messages and minimize the amount
      of needed record headers to store.
      Signed-off-by: NKay Sievers <kay@vrfy.org>
      Tested-by: NSteven Rostedt <rostedt@goodmis.org>
      Acked-by: NSteven Rostedt <rostedt@goodmis.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      084681d1
  18. 27 6月, 2012 2 次提交
  19. 26 6月, 2012 1 次提交
  20. 16 6月, 2012 3 次提交
  21. 13 6月, 2012 1 次提交
  22. 15 5月, 2012 1 次提交
    • 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
  23. 14 5月, 2012 1 次提交
  24. 12 5月, 2012 1 次提交
  25. 11 5月, 2012 1 次提交
  26. 10 5月, 2012 1 次提交