21 Sep, 2012
1 commit
-
Like 8250 driver, when pstore is registered as a console,
to avoid recursive spinlocks when panic happening, change the
spin_lock_irqsave to spin_trylock_irqsave when oops_in_progress
is true.Signed-off-by: liu chuansheng
Signed-off-by: Anton Vorontsov
07 Sep, 2012
1 commit
-
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: Steven Rostedt
Signed-off-by: Anton Vorontsov
01 Sep, 2012
1 commit
-
We need to unregister platform device when module exit, this commit fixes
the issue.Signed-off-by: Jovi Zhang
Acked-by: Kees Cook
Signed-off-by: Anton Vorontsov
05 Aug, 2012
3 commits
-
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: Anton Vorontsov
-
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: Randy Dunlap
Acked-by: Kees Cook
Signed-off-by: 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: Dan Carpenter
Signed-off-by: Anton Vorontsov
Acked-by: Kees Cook
18 Jul, 2012
9 commits
-
Decoding the binary trace w/ a different kernel might be troublesome
since we convert addresses to symbols. For kernels with minimal changes,
the mappings would probably match, but it's not guaranteed at all.
(But still we could convert the addresses by hand, since we do print
raw addresses.)If we use modules, the symbols could be loaded at different addresses
from the previously booted kernel, and so this would also fail, but
there's nothing we can do about it.Also, the binary data format that pstore/ram is using in its ringbuffer
may change between the kernels, so here we too must ensure that we're
running the same kernel.So, there are two questions really:
1. How to compute the unique kernel tag;
2. Where to store it.In this patch we're using LINUX_VERSION_CODE, just as hibernation
(suspend-to-disk) does. This way we are protecting from the kernel
version mismatch, making sure that we're running the same kernel
version and patch level. We could use CRC of a symbol table (as
suggested by Tony Luck), but for now let's not be that strict.And as for storing, we are using a small trick here. Instead of
allocating a dedicated buffer for the tag (i.e. another prz), or
hacking ram_core routines to "reserve" some control data in the
buffer, we are just encoding the tag into the buffer signature
(and XOR'ing it with the actual signature value, so that buffers
not needing a tag can just pass zero, which will result into the
plain old PRZ signature).Suggested-by: Steven Rostedt
Suggested-by: Tony Luck
Suggested-by: Colin Cross
Signed-off-by: Anton Vorontsov
Signed-off-by: Greg Kroah-Hartman -
Headers should really include all the needed prototypes, types, defines
etc. to be self-contained. This is a long-standing issue, but apparently
the new tracing code unearthed it (SMP=n is also a prerequisite):In file included from fs/pstore/internal.h:4:0,
from fs/pstore/ftrace.c:21:
include/linux/pstore.h:43:15: error: field ‘read_mutex’ has incomplete typeWhile at it, I also added the following:
linux/types.h -> size_t, phys_addr_t, uXX and friends
linux/spinlock.h -> spinlock_t
linux/errno.h -> Exxxx
linux/time.h -> struct timespec (struct passed by value)
struct module and rs_control forward declaration (passed via pointers).Signed-off-by: Anton Vorontsov
Signed-off-by: Greg Kroah-Hartman -
The ftrace log size is configurable via ramoops.ftrace_size
module option, and the log itself is available via
/ftrace-ramoops file.Signed-off-by: Anton Vorontsov
Signed-off-by: Greg Kroah-Hartman -
Don't use pstore.buf directly, instead convert the code to write_buf callback
which passes a pointer to a buffer as an argument.Signed-off-by: Anton Vorontsov
Signed-off-by: Greg Kroah-Hartman -
With this support kernel can save function call chain log into a
persistent ram buffer that can be decoded and dumped after reboot
through pstore filesystem. It can be used to determine what function
was last called before a reset or panic.We store the log in a binary format and then decode it at read time.
p.s.
Mostly the code comes from trace_persistent.c driver found in the
Android git tree, written by Colin Cross
(according to sign-off history). I reworked the driver a little bit,
and ported it to pstore.Signed-off-by: Anton Vorontsov
Signed-off-by: Greg Kroah-Hartman -
For function tracing we need to stop using pstore.buf directly, since
in a tracing callback we can't use spinlocks, and thus we can't safely
use the global buffer.With write_buf callback, backends no longer need to access pstore.buf
directly, and thus we can pass any buffers (e.g. allocated on stack).Signed-off-by: Anton Vorontsov
Signed-off-by: Greg Kroah-Hartman -
Nowadays we can use prz->ecc_size as a flag, no need for the special
member in the prz struct.Signed-off-by: Anton Vorontsov
Acked-by: Kees Cook
Signed-off-by: Greg Kroah-Hartman -
This is now pretty straightforward: instead of using bool, just pass
an integer. For backwards compatibility ramoops.ecc=1 means 16 bytes
ECC (using 1 byte for ECC isn't much of use anyway).Suggested-by: Arve Hjønnevåg
Signed-off-by: Anton Vorontsov
Acked-by: Kees Cook
Signed-off-by: Greg Kroah-Hartman -
The struct members were never used anywhere outside of
persistent_ram_init_ecc(), so there's actually no need for them
to be in the struct.If we ever want to make polynomial or symbol size configurable,
it would make more sense to just pass initialized rs_decoder
to the persistent_ram init functions.Signed-off-by: Anton Vorontsov
Acked-by: Kees Cook
Signed-off-by: Greg Kroah-Hartman
26 Jun, 2012
1 commit
-
This picks up the staging changes made in 3.5-rc4 so that everyone can sync up
properly.Signed-off-by: Greg Kroah-Hartman
21 Jun, 2012
5 commits
-
- Instead of exploiting unsigned overflows (which doesn't work for all
sizes), use straightforward checking for ECC total size not exceeding
initial buffer size;- Printing overflowed buffer_size is not informative. Instead, print
ecc_size and buffer_size;- No need for buffer_size argument in persistent_ram_init_ecc(),
we can address prz->buffer_size directly.Signed-off-by: Anton Vorontsov
Acked-by: Kees Cook
Signed-off-by: Greg Kroah-Hartman -
We will implement variable-sized ECC buffers soon, so post_init routine
might fail much more likely, so we'd better check for its errors.To make error handling simple, modify persistent_ram_free() to it be safe
at all times.Signed-off-by: Anton Vorontsov
Acked-by: Kees Cook
Signed-off-by: Greg Kroah-Hartman -
persistent_ram_new() returns ERR_PTR() value on errors, so during
freeing of the przs we should check for both NULL and IS_ERR() entries,
otherwise bad things will happen.Signed-off-by: Anton Vorontsov
Acked-by: Kees Cook
Signed-off-by: Greg Kroah-Hartman -
Registering the platform driver before module_init allows us to log oopses
that happen during device probing.This requires changing module_init to postcore_initcall, and switching
from platform_driver_probe to platform_driver_register because the
platform device is not registered when the platform driver is registered;
and because we use driver_register, now can't use create_bundle() (since
it will try to register the same driver once again), so we have to switch
to platform_device_register_data().Also, some __init -> __devinit changes were needed.
Overall, the registration logic is now much clearer, since we have only
one driver registration point, and just an optional dummy device, which
is created from the module parameters.Suggested-by: Colin Cross
Signed-off-by: Anton Vorontsov
Acked-by: Kees Cook
Signed-off-by: Greg Kroah-Hartman -
Pull staging tree fixes from Greg Kroah-Hartman:
"Here are a number of small fixes for the drivers/staging tree, as well
as iio and pstore drivers (which came from the staging tree in the
3.5-rc1 merge). All of these are tiny, but resolve issues that people
have been reporting.There's also a documentation update to reflect what the iio drivers
really are doing, which is good to get straightened out.Signed-off-by: Greg Kroah-Hartman "
* tag 'staging-3.5-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging:
staging: r8712u: Add new USB IDs
staging: gdm72xx: Release netlink socket properly
iio: drop wrong reference from Kconfig
pstore/inode: Make pstore_fill_super() static
pstore/ram: Should zap persistent zone on unlink
pstore/ram_core: Factor persistent_ram_zap() out of post_init()
pstore/ram_core: Do not reset restored zone's position and size
pstore/ram: Should update old dmesg buffer before reading
staging:iio:ad7298: Fix linker error due to missing IIO kfifo buffer
Revert "staging: usbip: bugfix for stack corruption on 64-bit architectures"
staging: usbip: bugfix for stack corruption on 64-bit architectures
staging/comedi: fix build for USB not enabled
staging: omapdrm: fix crash when freeing bad fb
staging:iio:ad7606: Re-add missing scale attribute
iio: Fix potential use after free
staging:iio: remove num_interrupt_lines from documentation
iio: documentation: Add out_altvoltage and friends
16 Jun, 2012
1 commit
-
Provide an iterator to receive the log buffer content, and convert all
kmsg_dump() users to it.The structured data in the kmsg buffer now contains binary data, which
should no longer be copied verbatim to the kmsg_dump() users.The iterator should provide reliable access to the buffer data, and also
supports proper log line-aware chunking of data while iterating.Signed-off-by: Kay Sievers
Tested-by: Tony Luck
Reported-by: Anton Vorontsov
Tested-by: Anton Vorontsov
Signed-off-by: Greg Kroah-Hartman
14 Jun, 2012
14 commits
-
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: [] kthread_data+0xb/0x20
[...]
Process kworker/0:1 (pid: 14, threadinfo ffff8800072c0000, task ffff88000725b100)
[...
Call Trace:
[] wq_worker_sleeping+0x10/0xa0
[] __schedule+0x568/0x7d0
[] ? trace_hardirqs_on+0xd/0x10
[] ? call_rcu_sched+0x12/0x20
[] ? release_task+0x156/0x2d0
[] ? release_task+0x1e/0x2d0
[] ? trace_hardirqs_on+0xd/0x10
[] schedule+0x24/0x70
[] do_exit+0x1f8/0x370
[] oops_end+0x77/0xb0
[] no_context+0x1a6/0x1b5
[] __bad_area_nosemaphore+0x1ce/0x1ed
[] ? ttwu_queue+0xc6/0xe0
[] bad_area_nosemaphore+0xe/0x10
[] do_page_fault+0x2c7/0x450
[] ? __lock_release+0x6b/0xe0
[] ? mark_held_locks+0x61/0x140
[] ? __wake_up+0x4e/0x70
[] ? trace_hardirqs_off_thunk+0x3a/0x3c
[] ? pstore_register+0x120/0x120
[] page_fault+0x1f/0x30
[] ? pstore_register+0x120/0x120
[] ? memcpy+0x68/0x110
[] ? pstore_get_records+0x3a/0x130
[] ? persistent_ram_copy_old+0x64/0x90
[] ramoops_pstore_read+0x84/0x130
[] pstore_get_records+0x79/0x130
[] ? process_one_work+0x116/0x450
[] ? pstore_register+0x120/0x120
[] pstore_dowork+0xe/0x10
[] process_one_work+0x174/0x450
[] ? process_one_work+0x116/0x450
[] worker_thread+0x123/0x2d0
[] ? manage_workers.isra.28+0x120/0x120
[] kthread+0x8e/0xa0
[] kernel_thread_helper+0x4/0x10
[] ? retint_restore_args+0xe/0xe
[] ? __init_kthread_worker+0x70/0x70
[] ? 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 8b 40 f8 5d c3 66 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00
RIP [] kthread_data+0xb/0x20
RSP
CR2: fffffffffffffff8
---[ end trace 996a332dc399111d ]---
Fixing recursive fault but reboot is needed!Signed-off-by: Anton Vorontsov
Signed-off-by: Greg Kroah-Hartman -
There is no behavioural change, the default value is still 60 seconds.
Signed-off-by: Anton Vorontsov
Acked-by: Kees Cook
Signed-off-by: Greg Kroah-Hartman -
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: Anton Vorontsov
Acked-by: Kees Cook
Acked-by: Colin Cross
Signed-off-by: Greg Kroah-Hartman -
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: Anton Vorontsov
Acked-by: Kees Cook
Acked-by: Colin Cross
Signed-off-by: Greg Kroah-Hartman -
The console log size is configurable via ramoops.console_size
module option, and the log itself is available via
/console-ramoops file.Signed-off-by: Anton Vorontsov
Acked-by: Kees Cook
Signed-off-by: Greg Kroah-Hartman -
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
Acked-by: Kees Cook
Signed-off-by: Greg Kroah-Hartman -
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: Anton Vorontsov
Acked-by: Kees Cook
Signed-off-by: Greg Kroah-Hartman -
We're about to add support for other message types, so let's rename
some variables to not be confused later.Signed-off-by: Anton Vorontsov
Acked-by: Kees Cook
Signed-off-by: Greg Kroah-Hartman -
Pstore doesn't support logging kernel messages in run-time, it only
dumps dmesg when kernel oopses/panics. This makes pstore useless for
debugging hangs caused by HW issues or improper use of HW (e.g.
weird device inserted -> driver tried to write a reserved bits ->
SoC hanged. In that case we don't get any messages in the pstore.Therefore, let's add a runtime logging support: PSTORE_TYPE_CONSOLE.
Signed-off-by: Anton Vorontsov
Acked-by: Kees Cook
Acked-by: Colin Cross
Signed-off-by: Greg Kroah-Hartman -
There's no reason to extern it. The patch fixes the annoying sparse
warning:CHECK fs/pstore/inode.c
fs/pstore/inode.c:264:5: warning: symbol 'pstore_fill_super' was not
declared. Should it be static?Signed-off-by: Anton Vorontsov
Acked-by: Kees Cook
Signed-off-by: Greg Kroah-Hartman -
Otherwise, unlinked file will reappear on the next boot.
Reported-by: Kees Cook
Signed-off-by: Anton Vorontsov
Acked-by: Kees Cook
Signed-off-by: Greg Kroah-Hartman -
A handy function that we will use outside of ram_core soon. But
so far just factor it out and start using it in post_init().Signed-off-by: Anton Vorontsov
Acked-by: Kees Cook
Signed-off-by: Greg Kroah-Hartman -
Otherwise, the files will survive just one reboot, and on a subsequent
boot they will disappear.Signed-off-by: Anton Vorontsov
Signed-off-by: Greg Kroah-Hartman -
Without the update, we'll only see the new dmesg buffer after the
reboot, but previously we could see it right away. Making an oops
visible in pstore filesystem before reboot is a somewhat dubious
feature, but removing it wasn't an intentional change, so let's
restore it.For this we have to make persistent_ram_save_old() safe for calling
multiple times, and also extern it.Signed-off-by: Anton Vorontsov
Acked-by: Kees Cook
Signed-off-by: Greg Kroah-Hartman
29 May, 2012
1 commit
-
Pull writeback tree from Wu Fengguang:
"Mainly from Jan Kara to avoid iput() in the flusher threads."* tag 'writeback' of git://git.kernel.org/pub/scm/linux/kernel/git/wfg/linux:
writeback: Avoid iput() from flusher thread
vfs: Rename end_writeback() to clear_inode()
vfs: Move waiting for inode writeback from end_writeback() to evict_inode()
writeback: Refactor writeback_single_inode()
writeback: Remove wb->list_lock from writeback_single_inode()
writeback: Separate inode requeueing after writeback
writeback: Move I_DIRTY_PAGES handling
writeback: Move requeueing when I_SYNC set to writeback_sb_inodes()
writeback: Move clearing of I_SYNC into inode_sync_complete()
writeback: initialize global_dirty_limit
fs: remove 8 bytes of padding from struct writeback_control on 64 bit builds
mm: page-writeback.c: local functions should not be exposed globally
17 May, 2012
3 commits
-
This is now straightforward: just introduce a module parameter and pass
the needed value to persistent_ram_new().Signed-off-by: Anton Vorontsov
Acked-by: Marco Stornelli
Acked-by: Kees Cook
Signed-off-by: Greg Kroah-Hartman -
The patch switches pstore RAM backend to use persistent_ram routines,
one step closer to the ECC support.Signed-off-by: Anton Vorontsov
Acked-by: Marco Stornelli
Signed-off-by: Greg Kroah-Hartman -
This is a first step for adding ECC support for pstore RAM backend: we
will use the persistent_ram routines, kindly provided by Google.Basically, persistent_ram is a set of helper routines to deal with the
[optionally] ECC-protected persistent ram regions.A bit of Makefile, Kconfig and header files adjustments were needed
because of the move.Signed-off-by: Anton Vorontsov
Acked-by: Kees Cook
Signed-off-by: Greg Kroah-Hartman