1. 19 3月, 2013 1 次提交
  2. 13 2月, 2013 1 次提交
  3. 16 1月, 2013 1 次提交
  4. 12 1月, 2013 1 次提交
    • S
      pstore: Avoid deadlock in panic and emergency-restart path · 9f244e9c
      Seiji Aguchi 提交于
      [Issue]
      
      When pstore is in panic and emergency-restart paths, it may be blocked
      in those paths because it simply takes spin_lock.
      
      This is an example scenario which pstore may hang up in a panic path:
      
       - cpuA grabs psinfo->buf_lock
       - cpuB panics and calls smp_send_stop
       - smp_send_stop sends IRQ to cpuA
       - after 1 second, cpuB gives up on cpuA and sends an NMI instead
       - cpuA is now in an NMI handler while still holding buf_lock
       - cpuB is deadlocked
      
      This case may happen if a firmware has a bug and
      cpuA is stuck talking with it more than one second.
      
      Also, this is a similar scenario in an emergency-restart path:
      
       - cpuA grabs psinfo->buf_lock and stucks in a firmware
       - cpuB kicks emergency-restart via either sysrq-b or hangcheck timer.
         And then, cpuB is deadlocked by taking psinfo->buf_lock again.
      
      [Solution]
      
      This patch avoids the deadlocking issues in both panic and emergency_restart
      paths by introducing a function, is_non_blocking_path(), to check if a cpu
      can be blocked in current path.
      
      With this patch, pstore is not blocked even if another cpu has
      taken a spin_lock, in those paths by changing from spin_lock_irqsave
      to spin_trylock_irqsave.
      
      In addition, according to a comment of emergency_restart() in kernel/sys.c,
      spin_lock shouldn't be taken in an emergency_restart path to avoid
      deadlock. This patch fits the comment below.
      
      <snip>
      /**
       *      emergency_restart - reboot the system
       *
       *      Without shutting down any hardware or taking any locks
       *      reboot the system.  This is called when we know we are in
       *      trouble so this is our best effort to reboot.  This is
       *      safe to call in interrupt context.
       */
      void emergency_restart(void)
      <snip>
      Signed-off-by: NSeiji Aguchi <seiji.aguchi@hds.com>
      Acked-by: NDon Zickus <dzickus@redhat.com>
      Signed-off-by: NTony Luck <tony.luck@intel.com>
      9f244e9c
  5. 04 1月, 2013 1 次提交
    • G
      pstore: remove __dev* attributes. · f568f6ca
      Greg Kroah-Hartman 提交于
      CONFIG_HOTPLUG is going away as an option.  As a result, the __dev*
      markings need to be removed.
      
      This change removes the use of __devinit from the pstore filesystem.
      
      Based on patches originally written by Bill Pemberton, but redone by me
      in order to handle some of the coding style issues better, by hand.
      
      Cc: Bill Pemberton <wfp5p@virginia.edu>
      Cc: Anton Vorontsov <cbouatmailru@gmail.com>
      Cc: Colin Cross <ccross@android.com>
      Cc: Kees Cook <keescook@chromium.org>
      Cc: Tony Luck <tony.luck@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f568f6ca
  6. 18 12月, 2012 1 次提交
  7. 13 12月, 2012 2 次提交
  8. 27 11月, 2012 2 次提交
    • S
      efi_pstore: Add a sequence counter to a variable name · 755d4fe4
      Seiji Aguchi 提交于
      [Issue]
      
      Currently, a variable name, which identifies each entry, consists of type, id and ctime.
      But if multiple events happens in a short time, a second/third event may fail to log because
      efi_pstore can't distinguish each event with current variable name.
      
      [Solution]
      
      A reasonable way to identify all events precisely is introducing a sequence counter to
      the variable name.
      
      The sequence counter has already supported in a pstore layer with "oopscount".
      So, this patch adds it to a variable name.
      Also, it is passed to read/erase callbacks of platform drivers in accordance with
      the modification of the variable name.
      
        <before applying this patch>
       a variable name of first event: dump-type0-1-12345678
       a variable name of second event: dump-type0-1-12345678
      
        type:0
        id:1
        ctime:12345678
      
       If multiple events happen in a short time, efi_pstore can't distinguish them because
       variable names are same among them.
      
        <after applying this patch>
      
       it can be distinguishable by adding a sequence counter as follows.
      
       a variable name of first event: dump-type0-1-1-12345678
       a variable name of Second event: dump-type0-1-2-12345678
      
        type:0
        id:1
        sequence counter: 1(first event), 2(second event)
        ctime:12345678
      
      In case of a write callback executed in pstore_console_write(), "0" is added to
      an argument of the write callback because it just logs all kernel messages and
      doesn't need to care about multiple events.
      Signed-off-by: NSeiji Aguchi <seiji.aguchi@hds.com>
      Acked-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Acked-by: NMike Waychison <mikew@google.com>
      Signed-off-by: NTony Luck <tony.luck@intel.com>
      755d4fe4
    • S
      efi_pstore: Add ctime to argument of erase callback · a9efd39c
      Seiji Aguchi 提交于
      [Issue]
      
      Currently, a variable name, which is used to identify each log entry, consists of type,
      id and ctime. But an erase callback does not use ctime.
      
      If efi_pstore supported just one log, type and id were enough.
      However, in case of supporting multiple logs, it doesn't work because
      it can't distinguish each entry without ctime at erasing time.
      
       <Example>
      
       As you can see below, efi_pstore can't differentiate first event from second one without ctime.
      
       a variable name of first event: dump-type0-1-12345678
       a variable name of second event: dump-type0-1-23456789
      
        type:0
        id:1
        ctime:12345678, 23456789
      
      [Solution]
      
      This patch adds ctime to an argument of an erase callback.
      
      It works across reboots because ctime of pstore means the date that the record was originally stored.
      To do this, efi_pstore saves the ctime to variable name at writing time and passes it to pstore
      at reading time.
      Signed-off-by: NSeiji Aguchi <seiji.aguchi@hds.com>
      Acked-by: NMike Waychison <mikew@google.com>
      Signed-off-by: NTony Luck <tony.luck@intel.com>
      a9efd39c
  9. 18 11月, 2012 1 次提交
  10. 17 11月, 2012 1 次提交
  11. 15 11月, 2012 1 次提交
  12. 21 9月, 2012 1 次提交
  13. 07 9月, 2012 1 次提交
    • A
      pstore/ftrace: Convert to its own enable/disable debugfs knob · 65f8c95e
      Anton Vorontsov 提交于
      With this patch we no longer reuse function tracer infrastructure, now
      we register our own tracer back-end via a debugfs knob.
      
      It's a bit more code, but that is the only downside. On the bright side we
      have:
      
      - Ability to make persistent_ram module removable (when needed, we can
        move ftrace_ops struct into a module). Note that persistent_ram is still
        not removable for other reasons, but with this patch it's just one
        thing less to worry about;
      
      - Pstore part is more isolated from the generic function tracer. We tried
        it already by registering our own tracer in available_tracers, but that
        way we're loosing ability to see the traces while we record them to
        pstore. This solution is somewhere in the middle: we only register
        "internal ftracer" back-end, but not the "front-end";
      
      - When there is only pstore tracing enabled, the kernel will only write
        to the pstore buffer, omitting function tracer buffer (which, of course,
        still can be enabled via 'echo function > current_tracer').
      Suggested-by: NSteven Rostedt <rostedt@goodmis.org>
      Signed-off-by: NAnton Vorontsov <anton.vorontsov@linaro.org>
      65f8c95e
  14. 01 9月, 2012 1 次提交
  15. 05 8月, 2012 3 次提交
    • A
      pstore/ram: Mark ramoops_pstore_write_buf() as notrace · 24203036
      Anton Vorontsov 提交于
      write_buf() should be marked as notrace, otherwise it is prone to
      recursion.
      
      Though, yet the issue is never triggered in real life, because we run
      inside the function tracer, where ftrace does its own recurse protection.
      
      But it's still no good, plus soon we might switch to our own tracer ops,
      and then the issue will be fatal. So, let's fix it.
      Signed-off-by: NAnton Vorontsov <anton.vorontsov@linaro.org>
      24203036
    • R
      pstore/ram: Fix printk format warning · 0427193b
      Randy Dunlap 提交于
      Fix printk format warning (on i386) in pstore:
      
      fs/pstore/ram.c:409:3: warning: format '%lu' expects type 'long unsigned int', but argument 2 has type 'size_t'
      Signed-off-by: NRandy Dunlap <rdunlap@xenotime.net>
      Acked-by: NKees Cook <keescook@chromium.org>
      Signed-off-by: NAnton Vorontsov <anton.vorontsov@linaro.org>
      0427193b
    • A
      pstore/ram: Fix possible NULL dereference · a384f641
      Anton Vorontsov 提交于
      We can dereference 'cxt->cprz' if console and dump logging are disabled
      (which is unlikely, but still possible to do). This patch fixes the issue
      by changing the code so that we don't dereference przs at all, we can
      just calculate bufsize from console_size and record_size values.
      
      Plus, while at it, the patch improves the buffer size calculation.
      
      After Kay's printk rework, we know the optimal buffer size for console
      logging -- it is LOG_LINE_MAX (defined privately in printk.c). Previously,
      if only console logging was enabled, we would allocate unnecessary large
      buffer in pstore, while we only need LOG_LINE_MAX. (Pstore console logging
      is still capable of handling buffers > LOG_LINE_MAX, it will just do
      multiple calls to psinfo->write).
      
      Note that I don't export the constant, since we will do even a better
      thing soon: we will switch console logging to a new write_buf API, which
      will eliminate the need for the additional buffer; and so we won't need
      the constant.
      Reported-by: NDan Carpenter <dan.carpenter@oracle.com>
      Signed-off-by: NAnton Vorontsov <anton.vorontsov@linaro.org>
      Acked-by: NKees Cook <keescook@chromium.org>
      a384f641
  16. 18 7月, 2012 9 次提交
  17. 21 6月, 2012 4 次提交
  18. 16 6月, 2012 1 次提交
  19. 14 6月, 2012 7 次提交
    • A
      pstore/platform: Disable automatic updates by default · 521f7288
      Anton Vorontsov 提交于
      Having automatic updates seems pointless for production system, and
      even dangerous and thus counter-productive:
      
      1. If we can mount pstore, or read files, we can as well read
         /proc/kmsg. So, there's little point in duplicating the
         functionality and present the same information but via another
         userland ABI;
      
      2. Expecting the kernel to behave sanely after oops/panic is naive.
         It might work, but you'd rather not try it. Screwed up kernel
         can do rather bad things, like recursive faults[1]; and pstore
         rather provoking bad things to happen. It uses:
      
         1. Timers (assumes sane interrupts state);
         2. Workqueues and mutexes (assumes scheduler in a sane state);
         3. kzalloc (a working slab allocator);
      
         That's too much for a dead kernel, so the debugging facility
         itself might just make debugging harder, which is not what
         we want.
      
      Maybe for non-oops message types it would make sense to re-enable
      automatic updates, but so far I don't see any use case for this.
      Even for tracing, it has its own run-time/normal ABI, so we're
      only interested in pstore upon next boot, to retrieve what has
      gone wrong with HW or SW.
      
      So, let's disable the updates by default.
      
      [1]
      BUG: unable to handle kernel paging request at fffffffffffffff8
      IP: [<ffffffff8104801b>] kthread_data+0xb/0x20
      [...]
      Process kworker/0:1 (pid: 14, threadinfo ffff8800072c0000, task ffff88000725b100)
      [...
      Call Trace:
       [<ffffffff81043710>] wq_worker_sleeping+0x10/0xa0
       [<ffffffff813687a8>] __schedule+0x568/0x7d0
       [<ffffffff8106c24d>] ? trace_hardirqs_on+0xd/0x10
       [<ffffffff81087e22>] ? call_rcu_sched+0x12/0x20
       [<ffffffff8102b596>] ? release_task+0x156/0x2d0
       [<ffffffff8102b45e>] ? release_task+0x1e/0x2d0
       [<ffffffff8106c24d>] ? trace_hardirqs_on+0xd/0x10
       [<ffffffff81368ac4>] schedule+0x24/0x70
       [<ffffffff8102cba8>] do_exit+0x1f8/0x370
       [<ffffffff810051e7>] oops_end+0x77/0xb0
       [<ffffffff8135c301>] no_context+0x1a6/0x1b5
       [<ffffffff8135c4de>] __bad_area_nosemaphore+0x1ce/0x1ed
       [<ffffffff81053156>] ? ttwu_queue+0xc6/0xe0
       [<ffffffff8135c50b>] bad_area_nosemaphore+0xe/0x10
       [<ffffffff8101fa47>] do_page_fault+0x2c7/0x450
       [<ffffffff8106e34b>] ? __lock_release+0x6b/0xe0
       [<ffffffff8106bf21>] ? mark_held_locks+0x61/0x140
       [<ffffffff810502fe>] ? __wake_up+0x4e/0x70
       [<ffffffff81185f7d>] ? trace_hardirqs_off_thunk+0x3a/0x3c
       [<ffffffff81158970>] ? pstore_register+0x120/0x120
       [<ffffffff8136a37f>] page_fault+0x1f/0x30
       [<ffffffff81158970>] ? pstore_register+0x120/0x120
       [<ffffffff81185ab8>] ? memcpy+0x68/0x110
       [<ffffffff8115875a>] ? pstore_get_records+0x3a/0x130
       [<ffffffff811590f4>] ? persistent_ram_copy_old+0x64/0x90
       [<ffffffff81158bf4>] ramoops_pstore_read+0x84/0x130
       [<ffffffff81158799>] pstore_get_records+0x79/0x130
       [<ffffffff81042536>] ? process_one_work+0x116/0x450
       [<ffffffff81158970>] ? pstore_register+0x120/0x120
       [<ffffffff8115897e>] pstore_dowork+0xe/0x10
       [<ffffffff81042594>] process_one_work+0x174/0x450
       [<ffffffff81042536>] ? process_one_work+0x116/0x450
       [<ffffffff81042e13>] worker_thread+0x123/0x2d0
       [<ffffffff81042cf0>] ? manage_workers.isra.28+0x120/0x120
       [<ffffffff81047d8e>] kthread+0x8e/0xa0
       [<ffffffff8136ba74>] kernel_thread_helper+0x4/0x10
       [<ffffffff8136a199>] ? retint_restore_args+0xe/0xe
       [<ffffffff81047d00>] ? __init_kthread_worker+0x70/0x70
       [<ffffffff8136ba70>] ? gs_change+0xb/0xb
      Code: be e2 00 00 00 48 c7 c7 d1 2a 4e 81 e8 bf fb fd ff 48 8b 5d f0 4c 8b 65 f8 c9 c3 0f 1f 44 00 00 48 8b 87 08 02 00 00 55 48 89 e5 <48> 8b 40 f8 5d c3 66 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00
      RIP  [<ffffffff8104801b>] kthread_data+0xb/0x20
       RSP <ffff8800072c1888>
      CR2: fffffffffffffff8
      ---[ end trace 996a332dc399111d ]---
      Fixing recursive fault but reboot is needed!
      Signed-off-by: NAnton Vorontsov <anton.vorontsov@linaro.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      521f7288
    • A
      pstore/platform: Make automatic updates interval configurable · a3f5f075
      Anton Vorontsov 提交于
      There is no behavioural change, the default value is still 60 seconds.
      Signed-off-by: NAnton Vorontsov <anton.vorontsov@linaro.org>
      Acked-by: NKees Cook <keescook@chromium.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a3f5f075
    • A
      pstore/ram_core: Remove now unused code · b8587daa
      Anton Vorontsov 提交于
      The code tried to maintain the global list of persistent ram zones,
      which isn't a great idea overall, plus since Android's ram_console
      is no longer there, we can remove some unused functions.
      Signed-off-by: NAnton Vorontsov <anton.vorontsov@linaro.org>
      Acked-by: NKees Cook <keescook@chromium.org>
      Acked-by: NColin Cross <ccross@android.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      b8587daa
    • A
      pstore/ram_core: Silence some printks · 602b5be4
      Anton Vorontsov 提交于
      Since we use multiple regions, the messages are somewhat annoying.
      We do print total mapped memory already, so no need to print the
      information for each region in the library routines.
      Signed-off-by: NAnton Vorontsov <anton.vorontsov@linaro.org>
      Acked-by: NKees Cook <keescook@chromium.org>
      Acked-by: NColin Cross <ccross@android.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      602b5be4
    • A
      pstore/ram: Add console messages handling · b5d38e9b
      Anton Vorontsov 提交于
      The console log size is configurable via ramoops.console_size
      module option, and the log itself is available via
      <pstore-mount>/console-ramoops file.
      Signed-off-by: NAnton Vorontsov <anton.vorontsov@linaro.org>
      Acked-by: NKees Cook <keescook@chromium.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      b5d38e9b
    • A
      pstore/ram: Factor ramoops_get_next_prz() out of ramoops_pstore_read() · 755d66b4
      Anton Vorontsov 提交于
      This will help make code clearer when we'll add support for other
      message types.
      
      The patch also changes return value from -EINVAL to 0 in case of
      end-of-records. The exact value doesn't matter for pstore (it should
      be just <= 0), but 0 feels more correct.
      Signed-off-by: NAnton Vorontsov <anton.vorontsov@linaro.org>
      Acked-by: NKees Cook <keescook@chromium.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      755d66b4
    • A
      pstore/ram: Factor dmesg przs initialization out of probe() · f4c5d242
      Anton Vorontsov 提交于
      This will help make code clearer when we'll add support for other
      message types.
      
      This also makes probe() much shorter and understandable, plus
      makes mem/record size checking a bit easier.
      
      Implementation detail: we now use a paddr pointer, this will
      be used for allocating persistent ram zones for other message
      types.
      Signed-off-by: NAnton Vorontsov <anton.vorontsov@linaro.org>
      Acked-by: NKees Cook <keescook@chromium.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f4c5d242