mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
pstore: Introduce max_reason and convert dump_oops
Now that pstore_register() can correctly pass max_reason to the kmesg dump facility, introduce a new "max_reason" module parameter and "max-reason" Device Tree field. The "dump_oops" module parameter and "dump-oops" Device Tree field are now considered deprecated, but are now automatically converted to their corresponding max_reason values when present, though the new max_reason setting has precedence. For struct ramoops_platform_data, the "dump_oops" member is entirely replaced by a new "max_reason" member, with the only existing user updated in place. Additionally remove the "reason" filter logic from ramoops_pstore_write(), as that is not specifically needed anymore, though technically this is a change in behavior for any ramoops users also setting the printk.always_kmsg_dump boot param, which will cause ramoops to behave as if max_reason was set to KMSG_DUMP_MAX. Link: https://lore.kernel.org/lkml/20200515184434.8470-6-keescook@chromium.org/ Change-Id: I563849afcc4975f36b616c2976202df92cfe4d14 Co-developed-by: Pavel Tatashin <pasha.tatashin@soleen.com> Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com> Signed-off-by: Kees Cook <keescook@chromium.org> Signed-off-by: Alexander Winkowski <dereference23@outlook.com> Signed-off-by: Richard Raya <rdxzv.dev@gmail.com>
This commit is contained in:
parent
2cc05debe6
commit
112fd2c855
@ -32,11 +32,17 @@ memory to be mapped strongly ordered, and atomic operations on strongly ordered
|
|||||||
memory are implementation defined, and won't work on many ARMs such as omaps.
|
memory are implementation defined, and won't work on many ARMs such as omaps.
|
||||||
|
|
||||||
The memory area is divided into ``record_size`` chunks (also rounded down to
|
The memory area is divided into ``record_size`` chunks (also rounded down to
|
||||||
power of two) and each oops/panic writes a ``record_size`` chunk of
|
power of two) and each kmesg dump writes a ``record_size`` chunk of
|
||||||
information.
|
information.
|
||||||
|
|
||||||
Dumping both oopses and panics can be done by setting 1 in the ``dump_oops``
|
Limiting which kinds of kmsg dumps are stored can be controlled via
|
||||||
variable while setting 0 in that variable dumps only the panics.
|
the ``max_reason`` value, as defined in include/linux/kmsg_dump.h's
|
||||||
|
``enum kmsg_dump_reason``. For example, to store both Oopses and Panics,
|
||||||
|
``max_reason`` should be set to 2 (KMSG_DUMP_OOPS), to store only Panics
|
||||||
|
``max_reason`` should be set to 1 (KMSG_DUMP_PANIC). Setting this to 0
|
||||||
|
(KMSG_DUMP_UNDEF), means the reason filtering will be controlled by the
|
||||||
|
``printk.always_kmsg_dump`` boot param: if unset, it'll be KMSG_DUMP_OOPS,
|
||||||
|
otherwise KMSG_DUMP_MAX.
|
||||||
|
|
||||||
The module uses a counter to record multiple dumps but the counter gets reset
|
The module uses a counter to record multiple dumps but the counter gets reset
|
||||||
on restart (i.e. new dumps after the restart will overwrite old ones).
|
on restart (i.e. new dumps after the restart will overwrite old ones).
|
||||||
@ -90,7 +96,7 @@ Setting the ramoops parameters can be done in several different manners:
|
|||||||
.mem_address = <...>,
|
.mem_address = <...>,
|
||||||
.mem_type = <...>,
|
.mem_type = <...>,
|
||||||
.record_size = <...>,
|
.record_size = <...>,
|
||||||
.dump_oops = <...>,
|
.max_reason = <...>,
|
||||||
.ecc = <...>,
|
.ecc = <...>,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ static struct ramoops_platform_data chromeos_ramoops_data = {
|
|||||||
.record_size = 0x40000,
|
.record_size = 0x40000,
|
||||||
.console_size = 0x20000,
|
.console_size = 0x20000,
|
||||||
.ftrace_size = 0x20000,
|
.ftrace_size = 0x20000,
|
||||||
.dump_oops = 1,
|
.max_reason = KMSG_DUMP_OOPS,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device chromeos_ramoops = {
|
static struct platform_device chromeos_ramoops = {
|
||||||
|
@ -71,10 +71,10 @@ module_param(mem_type, uint, 0400);
|
|||||||
MODULE_PARM_DESC(mem_type,
|
MODULE_PARM_DESC(mem_type,
|
||||||
"set to 1 to try to use unbuffered memory (default 0)");
|
"set to 1 to try to use unbuffered memory (default 0)");
|
||||||
|
|
||||||
static int dump_oops = 1;
|
static int ramoops_max_reason = -1;
|
||||||
module_param(dump_oops, int, 0400);
|
module_param_named(max_reason, ramoops_max_reason, int, 0400);
|
||||||
MODULE_PARM_DESC(dump_oops,
|
MODULE_PARM_DESC(max_reason,
|
||||||
"set to 1 to dump oopses, 0 to only dump panics (default 1)");
|
"maximum reason for kmsg dump (default 2: Oops and Panic) ");
|
||||||
|
|
||||||
static int ramoops_ecc;
|
static int ramoops_ecc;
|
||||||
module_param_named(ecc, ramoops_ecc, int, 0400);
|
module_param_named(ecc, ramoops_ecc, int, 0400);
|
||||||
@ -83,6 +83,11 @@ MODULE_PARM_DESC(ramoops_ecc,
|
|||||||
"ECC buffer size in bytes (1 is a special value, means 16 "
|
"ECC buffer size in bytes (1 is a special value, means 16 "
|
||||||
"bytes ECC)");
|
"bytes ECC)");
|
||||||
|
|
||||||
|
static int ramoops_dump_oops = -1;
|
||||||
|
module_param_named(dump_oops, ramoops_dump_oops, int, 0400);
|
||||||
|
MODULE_PARM_DESC(dump_oops,
|
||||||
|
"(deprecated: use max_reason instead) set to 1 to dump oopses & panics, 0 to only dump panics");
|
||||||
|
|
||||||
struct ramoops_context {
|
struct ramoops_context {
|
||||||
struct persistent_ram_zone **dprzs; /* Oops dump zones */
|
struct persistent_ram_zone **dprzs; /* Oops dump zones */
|
||||||
struct persistent_ram_zone *cprz; /* Console zone */
|
struct persistent_ram_zone *cprz; /* Console zone */
|
||||||
@ -95,7 +100,6 @@ struct ramoops_context {
|
|||||||
size_t console_size;
|
size_t console_size;
|
||||||
size_t ftrace_size;
|
size_t ftrace_size;
|
||||||
size_t pmsg_size;
|
size_t pmsg_size;
|
||||||
int dump_oops;
|
|
||||||
u32 flags;
|
u32 flags;
|
||||||
struct persistent_ram_ecc_info ecc_info;
|
struct persistent_ram_ecc_info ecc_info;
|
||||||
unsigned int max_dump_cnt;
|
unsigned int max_dump_cnt;
|
||||||
@ -687,7 +691,14 @@ static int ramoops_parse_dt(struct platform_device *pdev,
|
|||||||
pdata->mem_size = resource_size(res);
|
pdata->mem_size = resource_size(res);
|
||||||
pdata->mem_address = res->start;
|
pdata->mem_address = res->start;
|
||||||
pdata->mem_type = of_property_read_bool(of_node, "unbuffered");
|
pdata->mem_type = of_property_read_bool(of_node, "unbuffered");
|
||||||
pdata->dump_oops = !of_property_read_bool(of_node, "no-dump-oops");
|
/*
|
||||||
|
* Setting "no-dump-oops" is deprecated and will be ignored if
|
||||||
|
* "max_reason" is also specified.
|
||||||
|
*/
|
||||||
|
if (of_property_read_bool(of_node, "no-dump-oops"))
|
||||||
|
pdata->max_reason = KMSG_DUMP_PANIC;
|
||||||
|
else
|
||||||
|
pdata->max_reason = KMSG_DUMP_OOPS;
|
||||||
|
|
||||||
#define parse_u32(name, field, default_value) { \
|
#define parse_u32(name, field, default_value) { \
|
||||||
ret = ramoops_parse_dt_u32(pdev, name, default_value, \
|
ret = ramoops_parse_dt_u32(pdev, name, default_value, \
|
||||||
@ -703,6 +714,7 @@ static int ramoops_parse_dt(struct platform_device *pdev,
|
|||||||
parse_u32("pmsg-size", pdata->pmsg_size, 0);
|
parse_u32("pmsg-size", pdata->pmsg_size, 0);
|
||||||
parse_u32("ecc-size", pdata->ecc_info.ecc_size, 0);
|
parse_u32("ecc-size", pdata->ecc_info.ecc_size, 0);
|
||||||
parse_u32("flags", pdata->flags, 0);
|
parse_u32("flags", pdata->flags, 0);
|
||||||
|
parse_u32("max-reason", pdata->max_reason, pdata->max_reason);
|
||||||
|
|
||||||
#undef parse_u32
|
#undef parse_u32
|
||||||
|
|
||||||
@ -774,7 +786,6 @@ static int ramoops_probe(struct platform_device *pdev)
|
|||||||
cxt->console_size = pdata->console_size;
|
cxt->console_size = pdata->console_size;
|
||||||
cxt->ftrace_size = pdata->ftrace_size;
|
cxt->ftrace_size = pdata->ftrace_size;
|
||||||
cxt->pmsg_size = pdata->pmsg_size;
|
cxt->pmsg_size = pdata->pmsg_size;
|
||||||
cxt->dump_oops = pdata->dump_oops;
|
|
||||||
cxt->flags = pdata->flags;
|
cxt->flags = pdata->flags;
|
||||||
cxt->ecc_info = pdata->ecc_info;
|
cxt->ecc_info = pdata->ecc_info;
|
||||||
|
|
||||||
@ -817,8 +828,10 @@ static int ramoops_probe(struct platform_device *pdev)
|
|||||||
* the single region size is how to check.
|
* the single region size is how to check.
|
||||||
*/
|
*/
|
||||||
cxt->pstore.flags = 0;
|
cxt->pstore.flags = 0;
|
||||||
if (cxt->max_dump_cnt)
|
if (cxt->max_dump_cnt) {
|
||||||
cxt->pstore.flags |= PSTORE_FLAGS_DMESG;
|
cxt->pstore.flags |= PSTORE_FLAGS_DMESG;
|
||||||
|
cxt->pstore.max_reason = pdata->max_reason;
|
||||||
|
}
|
||||||
if (cxt->console_size)
|
if (cxt->console_size)
|
||||||
cxt->pstore.flags |= PSTORE_FLAGS_CONSOLE;
|
cxt->pstore.flags |= PSTORE_FLAGS_CONSOLE;
|
||||||
if (cxt->max_ftrace_cnt)
|
if (cxt->max_ftrace_cnt)
|
||||||
@ -854,7 +867,7 @@ static int ramoops_probe(struct platform_device *pdev)
|
|||||||
mem_size = pdata->mem_size;
|
mem_size = pdata->mem_size;
|
||||||
mem_address = pdata->mem_address;
|
mem_address = pdata->mem_address;
|
||||||
record_size = pdata->record_size;
|
record_size = pdata->record_size;
|
||||||
dump_oops = pdata->dump_oops;
|
ramoops_max_reason = pdata->max_reason;
|
||||||
ramoops_console_size = pdata->console_size;
|
ramoops_console_size = pdata->console_size;
|
||||||
ramoops_pmsg_size = pdata->pmsg_size;
|
ramoops_pmsg_size = pdata->pmsg_size;
|
||||||
ramoops_ftrace_size = pdata->ftrace_size;
|
ramoops_ftrace_size = pdata->ftrace_size;
|
||||||
@ -929,7 +942,16 @@ static void ramoops_register_dummy(void)
|
|||||||
dummy_data->console_size = ramoops_console_size;
|
dummy_data->console_size = ramoops_console_size;
|
||||||
dummy_data->ftrace_size = ramoops_ftrace_size;
|
dummy_data->ftrace_size = ramoops_ftrace_size;
|
||||||
dummy_data->pmsg_size = ramoops_pmsg_size;
|
dummy_data->pmsg_size = ramoops_pmsg_size;
|
||||||
dummy_data->dump_oops = dump_oops;
|
/* If "max_reason" is set, its value has priority over "dump_oops". */
|
||||||
|
if (ramoops_max_reason >= 0)
|
||||||
|
dummy_data->max_reason = ramoops_max_reason;
|
||||||
|
/* Otherwise, if "dump_oops" is set, parse it into "max_reason". */
|
||||||
|
else if (ramoops_dump_oops != -1)
|
||||||
|
dummy_data->max_reason = ramoops_dump_oops ? KMSG_DUMP_OOPS
|
||||||
|
: KMSG_DUMP_PANIC;
|
||||||
|
/* And if neither are explicitly set, use the default. */
|
||||||
|
else
|
||||||
|
dummy_data->max_reason = KMSG_DUMP_OOPS;
|
||||||
dummy_data->flags = RAMOOPS_FLAG_FTRACE_PER_CPU;
|
dummy_data->flags = RAMOOPS_FLAG_FTRACE_PER_CPU;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -99,7 +99,7 @@ struct ramoops_platform_data {
|
|||||||
unsigned long console_size;
|
unsigned long console_size;
|
||||||
unsigned long ftrace_size;
|
unsigned long ftrace_size;
|
||||||
unsigned long pmsg_size;
|
unsigned long pmsg_size;
|
||||||
int dump_oops;
|
int max_reason;
|
||||||
u32 flags;
|
u32 flags;
|
||||||
struct persistent_ram_ecc_info ecc_info;
|
struct persistent_ram_ecc_info ecc_info;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user