mirror of
https://github.com/torvalds/linux.git
synced 2024-12-25 20:32:22 +00:00
Miscellaneous pstore improvements
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJViyiCAAoJEKurIx+X31iB3acP/1kPYKClGZLoqH6wqHNM/djq ROsPm9PDt9g7WZ/yw5HpKuUzC+XhOg4odYpZIy+6PogW6BUCumxPCLVq/qbVSPhT Q7Pv0mlmjyJS+kj6FncWuJrJG0xQfKYE6OeYrnkyHfrHYmJunf1bS6K71CDGHJAa O2bQr4E67twuU8yQR8BZ+YlZu4NTzPYZ4JWmb9Wepm3seIM2GEJsNRZ7WJXH7BOv BHOPi8FDr8fMkA+2WitE853gYvcTYcuxlsDgRumtGzWDhRIUH8Q5yS9QLAFd0Rly BW7YOHYCY1L75RJxnVTWd04GNrepxe4LY1bbtx+mqI6FrdMw0dK0M5BKuohV+BT0 tBC/anSHBOqua/aDA6m+8c+p8I7qp1wXNHtmm15lqKQg1YHvh0Rs7FlP3HBdLDxQ rmUQHTcVQGaf00GCTUgsEn80kW8FYYtOnh4FJcbSkLdU8/mkr1+1rE/3i8ob/AL9 EsJgzqptT9/VBX3j6tZgk8tt6xstLMGVw/DmScjxeLqA2WoaINh5XRPgGCGWQW6T wa9nFGBuJFtJv9NfVlMEe8xekxyDa6xPIgoCheWBcV9NFRmfBrUmbG4yF127nqTG TXYBzFPSxdBn0FqGIaz+6RPbcGd7tZuz317sIYHTgHBWQHeoWG9TJGHeGt8L5uql eKMoHAvVRZIyBuZruUeB =248K -----END PGP SIGNATURE----- Merge tag 'please-pull-pstore' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux Pull pstore updates from Tony Luck: "Miscellaneous pstore improvements" * tag 'please-pull-pstore' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux: ramoops: make it possible to change mem_type param. pstore/ram: verify ramoops header before saving record fs/pstore: Optimization function ramoops_init_przs fs/pstore: update the backend parameter in pstore module pstore: do not use message compression without lock
This commit is contained in:
commit
266da6f142
@ -299,7 +299,7 @@ static void pstore_dump(struct kmsg_dumper *dumper,
|
|||||||
bool compressed;
|
bool compressed;
|
||||||
size_t total_len;
|
size_t total_len;
|
||||||
|
|
||||||
if (big_oops_buf) {
|
if (big_oops_buf && is_locked) {
|
||||||
dst = big_oops_buf;
|
dst = big_oops_buf;
|
||||||
hsize = sprintf(dst, "%s#%d Part%u\n", why,
|
hsize = sprintf(dst, "%s#%d Part%u\n", why,
|
||||||
oopscount, part);
|
oopscount, part);
|
||||||
@ -456,6 +456,12 @@ int pstore_register(struct pstore_info *psi)
|
|||||||
add_timer(&pstore_timer);
|
add_timer(&pstore_timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Update the module parameter backend, so it is visible
|
||||||
|
* through /sys/module/pstore/parameters/backend
|
||||||
|
*/
|
||||||
|
backend = psi->name;
|
||||||
|
|
||||||
pr_info("Registered %s as persistent store backend\n", psi->name);
|
pr_info("Registered %s as persistent store backend\n", psi->name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -186,12 +186,34 @@ static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
|
|||||||
ssize_t size;
|
ssize_t size;
|
||||||
ssize_t ecc_notice_size;
|
ssize_t ecc_notice_size;
|
||||||
struct ramoops_context *cxt = psi->data;
|
struct ramoops_context *cxt = psi->data;
|
||||||
struct persistent_ram_zone *prz;
|
struct persistent_ram_zone *prz = NULL;
|
||||||
int header_length;
|
int header_length = 0;
|
||||||
|
|
||||||
|
/* Ramoops headers provide time stamps for PSTORE_TYPE_DMESG, but
|
||||||
|
* PSTORE_TYPE_CONSOLE and PSTORE_TYPE_FTRACE don't currently have
|
||||||
|
* valid time stamps, so it is initialized to zero.
|
||||||
|
*/
|
||||||
|
time->tv_sec = 0;
|
||||||
|
time->tv_nsec = 0;
|
||||||
|
*compressed = false;
|
||||||
|
|
||||||
|
/* Find the next valid persistent_ram_zone for DMESG */
|
||||||
|
while (cxt->dump_read_cnt < cxt->max_dump_cnt && !prz) {
|
||||||
|
prz = ramoops_get_next_prz(cxt->przs, &cxt->dump_read_cnt,
|
||||||
|
cxt->max_dump_cnt, id, type,
|
||||||
|
PSTORE_TYPE_DMESG, 1);
|
||||||
|
if (!prz_ok(prz))
|
||||||
|
continue;
|
||||||
|
header_length = ramoops_read_kmsg_hdr(persistent_ram_old(prz),
|
||||||
|
time, compressed);
|
||||||
|
/* Clear and skip this DMESG record if it has no valid header */
|
||||||
|
if (!header_length) {
|
||||||
|
persistent_ram_free_old(prz);
|
||||||
|
persistent_ram_zap(prz);
|
||||||
|
prz = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
prz = ramoops_get_next_prz(cxt->przs, &cxt->dump_read_cnt,
|
|
||||||
cxt->max_dump_cnt, id, type,
|
|
||||||
PSTORE_TYPE_DMESG, 1);
|
|
||||||
if (!prz_ok(prz))
|
if (!prz_ok(prz))
|
||||||
prz = ramoops_get_next_prz(&cxt->cprz, &cxt->console_read_cnt,
|
prz = ramoops_get_next_prz(&cxt->cprz, &cxt->console_read_cnt,
|
||||||
1, id, type, PSTORE_TYPE_CONSOLE, 0);
|
1, id, type, PSTORE_TYPE_CONSOLE, 0);
|
||||||
@ -204,13 +226,7 @@ static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
|
|||||||
if (!prz_ok(prz))
|
if (!prz_ok(prz))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!persistent_ram_old(prz))
|
size = persistent_ram_old_size(prz) - header_length;
|
||||||
return 0;
|
|
||||||
|
|
||||||
size = persistent_ram_old_size(prz);
|
|
||||||
header_length = ramoops_read_kmsg_hdr(persistent_ram_old(prz), time,
|
|
||||||
compressed);
|
|
||||||
size -= header_length;
|
|
||||||
|
|
||||||
/* ECC correction notice */
|
/* ECC correction notice */
|
||||||
ecc_notice_size = persistent_ram_ecc_string(prz, NULL, 0);
|
ecc_notice_size = persistent_ram_ecc_string(prz, NULL, 0);
|
||||||
@ -394,18 +410,16 @@ static int ramoops_init_przs(struct device *dev, struct ramoops_context *cxt,
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < cxt->max_dump_cnt; i++) {
|
for (i = 0; i < cxt->max_dump_cnt; i++) {
|
||||||
size_t sz = cxt->record_size;
|
cxt->przs[i] = persistent_ram_new(*paddr, cxt->record_size, 0,
|
||||||
|
|
||||||
cxt->przs[i] = persistent_ram_new(*paddr, sz, 0,
|
|
||||||
&cxt->ecc_info,
|
&cxt->ecc_info,
|
||||||
cxt->memtype);
|
cxt->memtype);
|
||||||
if (IS_ERR(cxt->przs[i])) {
|
if (IS_ERR(cxt->przs[i])) {
|
||||||
err = PTR_ERR(cxt->przs[i]);
|
err = PTR_ERR(cxt->przs[i]);
|
||||||
dev_err(dev, "failed to request mem region (0x%zx@0x%llx): %d\n",
|
dev_err(dev, "failed to request mem region (0x%zx@0x%llx): %d\n",
|
||||||
sz, (unsigned long long)*paddr, err);
|
cxt->record_size, (unsigned long long)*paddr, err);
|
||||||
goto fail_prz;
|
goto fail_prz;
|
||||||
}
|
}
|
||||||
*paddr += sz;
|
*paddr += cxt->record_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -608,7 +622,7 @@ static void ramoops_register_dummy(void)
|
|||||||
|
|
||||||
dummy_data->mem_size = mem_size;
|
dummy_data->mem_size = mem_size;
|
||||||
dummy_data->mem_address = mem_address;
|
dummy_data->mem_address = mem_address;
|
||||||
dummy_data->mem_type = 0;
|
dummy_data->mem_type = mem_type;
|
||||||
dummy_data->record_size = record_size;
|
dummy_data->record_size = record_size;
|
||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user