user2910111
user2910111

Reputation: 342

Using persistent storage in linux kernel

I am trying to use persistent store(Pstore) available in linux kernel but somehow I am not getting the logs in case of kernel panics. I made the following kernel modules in kernel config file as built in:

CONFIG_PSTORE=y 
CONFIG_PSTORE_CONSOLE=y 
CONFIG_PSTORE_RAM=y

Now a/c to documentation pstore I should get the logs on next reboot in /sys/fs/pstore/... (or /dev/pstore/...) but couldn't find the logs there. Am I missing something...?

Upvotes: 4

Views: 11843

Answers (3)

ArthurLambert
ArthurLambert

Reputation: 793

You have to declare platform data as described by @shadowfire. But all kernel cannot use device tree for ramoops.

Generic way to do it, is to add in the source file for your hardware (example for mx6ul : arch/arm/mach-imx/mach-imx6ul.c) the following piece of code in the function xxx_init_machine :

#include <linux/pstore_ram.h>
[...]

static struct ramoops_platform_data ramoops_data = {
        .mem_size               = <...>,
        .mem_address            = <...>,
        .mem_type               = <...>,
        .record_size            = <...>,
        .dump_oops              = <...>,
        .ecc                    = <...>,
};

static struct platform_device ramoops_dev = {
        .name = "ramoops",
        .dev = {
                .platform_data = &ramoops_data,
        },
};

[... inside xxx_init_machine ...]
int ret;

ret = platform_device_register(&ramoops_dev);
if (ret) {
    printk(KERN_ERR "unable to register platform device\n");
    return ret;
}

More info available in documentation : ramoops

Do you have logs in dmesg which can confirm that ramoops is enabled successfully ?

# dmesg | grep -i "pstore\|ramoops"
console [pstore-1] enabled
pstore: Registered ramoops as persistent store backend
ramoops: attached 0x20000@0x80000000, ecc: 0/0

Moreover you must mount pstore directory, that's why the directory is empty on your rootfs :

mount -t pstore -o kmsg_bytes=8000 - /sys/fs/pstore

Default size for the mount is 10 Kbytes in you don't set the kmsg_bytes option. You can use /etc/fstab to mount it automatically.

Upvotes: 1

shadowfire
shadowfire

Reputation: 106

Besides the kernel config options:

CONFIG_PSTORE=y
CONFIG_PSTORE_CONSOLE=y
CONFIG_PSTORE_PMSG=y
CONFIG_PSTORE_RAM=y

I had to reserve a part of memory in which the logs will be saved. I did this through the device tree like this:

reserved-memory {
    #address-cells = <2>;
    #size-cells = <2>;
    ranges;

    pstore: pstore@FF00000 {
        no-map;
        reg = <0x0 0xFF00000 0x0 0x00100000>;  /* pstore/ramoops buffer
            starts at memory address 0xFF00000 and is of size 0x00100000 */
    };
};

ramoops {
    compatible = "ramoops";
    memory-region = <&pstore>;
    record-size     = <0x0 0x00020000>;
    console-size    = <0x0 0x00020000>;
    pmsg-size       = <0x0 0x00020000>;
};

Also, check if the following kernel patch is present (which is needed for the kernel to be able to parse the options given above): https://android-review.googlesource.com/#/c/kernel/common/+/195160/

Another way is to turn it on through the kernel cmdline, for example:

ramoops.mem_address=0x30000000 ramoops.mem_size=0x100000 memmap=0x100000$0x30000000

Upvotes: 4

Sundeep471
Sundeep471

Reputation: 1591

check if below config options are enabled

CONFIG_PSTORE=y
CONFIG_PSTORE_CONSOLE=y
**CONFIG_PSTORE_FTRACE=y**
CONFIG_PSTORE_RAM=y

But why /dev/pstore file?, it's not needed,

To check if console-ramoops working, do echo Trigger a kernel panic using command

echo c > /proc/sysrq-trigger

then reboot device manually. after system boots up, run command "/sys/fs/pstore/console-ramoops", check if console_ramoops has got anything logged.

Upvotes: 3

Related Questions