Lines Matching +full:no +full:- +full:dump +full:- +full:oops
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Persistent Storage - platform driver interface parts.
5 * Copyright (C) 2007-2008 Google, Inc.
32 * We defer making "oops" entries appear in pstore - see
36 static int pstore_update_ms = -1;
39 "(default is -1, which means runtime updates are disabled; "
50 "powerpc-ofw",
51 "powerpc-common",
53 "powerpc-opal",
77 * pstore no longer implements compression via the crypto API, and only
102 * Compression is only used for dmesg output, which consists of low-entropy
103 * ASCII text, and so we can assume worst-case 60%.
186 return -EINVAL; in pstore_compress()
189 -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); in pstore_compress()
191 return -EINVAL; in pstore_compress()
195 return -EINVAL; in pstore_compress()
209 /* Skip if not built-in or compression disabled. */ in allocate_buf_for_compression()
227 compressed_size = (psinfo->bufsize * 100) / DMESG_COMP_PERCENT; in allocate_buf_for_compression()
231 psinfo->bufsize, compress); in allocate_buf_for_compression()
243 /* A non-NULL big_oops_buf indicates compression is available. */ in allocate_buf_for_compression()
247 pr_info("Using crash dump compression: %s\n", compress); in allocate_buf_for_compression()
267 record->psi = psinfo; in pstore_record_init()
270 record->time = ns_to_timespec64(ktime_get_real_fast_ns()); in pstore_record_init()
289 why = kmsg_dump_reason_str(detail->reason); in pstore_dump()
291 if (pstore_cannot_block_path(detail->reason)) { in pstore_dump()
292 if (!raw_spin_trylock_irqsave(&psinfo->buf_lock, flags)) { in pstore_dump()
293 pr_err("dump skipped in %s path because of concurrent dump\n", in pstore_dump()
298 raw_spin_lock_irqsave(&psinfo->buf_lock, flags); in pstore_dump()
308 int zipped_len = -1; in pstore_dump()
315 record.reason = detail->reason; in pstore_dump()
317 record.buf = psinfo->buf; in pstore_dump()
319 dst = big_oops_buf ?: psinfo->buf; in pstore_dump()
320 dst_size = max_compressed_size ?: psinfo->bufsize; in pstore_dump()
322 /* Write dump header. */ in pstore_dump()
325 dst_size -= header_size; in pstore_dump()
327 /* Write dump contents. */ in pstore_dump()
333 zipped_len = pstore_compress(dst, psinfo->buf, in pstore_dump()
335 psinfo->bufsize); in pstore_dump()
348 record.size = psinfo->bufsize; in pstore_dump()
349 memcpy(psinfo->buf, dst, psinfo->bufsize); in pstore_dump()
355 ret = psinfo->write(&record); in pstore_dump()
356 if (ret == 0 && detail->reason == KMSG_DUMP_OOPS) { in pstore_dump()
360 /* Preserve only the first non-zero returned value. */ in pstore_dump()
368 raw_spin_unlock_irqrestore(&psinfo->buf_lock, flags); in pstore_dump()
371 pr_err_once("backend (%s) writing error (%d)\n", psinfo->name, in pstore_dump()
377 .dump = pstore_dump,
406 psinfo->write(&record); in pstore_console_write()
411 .index = -1,
417 strscpy(pstore_console.name, psinfo->name, in pstore_register_console()
441 if (record->buf) in pstore_write_user_compat()
442 return -EINVAL; in pstore_write_user_compat()
444 record->buf = vmemdup_user(buf, record->size); in pstore_write_user_compat()
445 if (IS_ERR(record->buf)) { in pstore_write_user_compat()
446 ret = PTR_ERR(record->buf); in pstore_write_user_compat()
450 ret = record->psi->write(record); in pstore_write_user_compat()
452 kvfree(record->buf); in pstore_write_user_compat()
454 record->buf = NULL; in pstore_write_user_compat()
456 return unlikely(ret < 0) ? ret : record->size; in pstore_write_user_compat()
470 if (backend && strcmp(backend, psi->name)) { in pstore_register()
472 backend, psi->name); in pstore_register()
473 return -EBUSY; in pstore_register()
477 if (!psi->flags) { in pstore_register()
479 psi->name); in pstore_register()
480 return -EINVAL; in pstore_register()
484 if (!psi->read || !psi->write) { in pstore_register()
486 psi->name); in pstore_register()
487 return -EINVAL; in pstore_register()
490 new_backend = kstrdup(psi->name, GFP_KERNEL); in pstore_register()
492 return -ENOMEM; in pstore_register()
497 psinfo->name, psi->name); in pstore_register()
500 return -EBUSY; in pstore_register()
503 if (!psi->write_user) in pstore_register()
504 psi->write_user = pstore_write_user_compat; in pstore_register()
506 mutex_init(&psinfo->read_mutex); in pstore_register()
507 raw_spin_lock_init(&psinfo->buf_lock); in pstore_register()
509 if (psi->flags & PSTORE_FLAGS_DMESG) in pstore_register()
514 if (psi->flags & PSTORE_FLAGS_DMESG) { in pstore_register()
515 pstore_dumper.max_reason = psinfo->max_reason; in pstore_register()
518 if (psi->flags & PSTORE_FLAGS_CONSOLE) in pstore_register()
520 if (psi->flags & PSTORE_FLAGS_FTRACE) in pstore_register()
522 if (psi->flags & PSTORE_FLAGS_PMSG) in pstore_register()
534 pr_info("Registered %s as persistent store backend\n", psi->name); in pstore_register()
556 if (psi->flags & PSTORE_FLAGS_PMSG) in pstore_unregister()
558 if (psi->flags & PSTORE_FLAGS_FTRACE) in pstore_unregister()
560 if (psi->flags & PSTORE_FLAGS_CONSOLE) in pstore_unregister()
562 if (psi->flags & PSTORE_FLAGS_DMESG) in pstore_unregister()
578 pr_info("Unregistered %s as persistent store backend\n", psi->name); in pstore_unregister()
591 if (!IS_ENABLED(CONFIG_PSTORE_COMPRESS) || !record->compressed) in decompress_record()
595 if (record->type != PSTORE_TYPE_DMESG) { in decompress_record()
596 pr_warn("ignored compressed record type %d\n", record->type); in decompress_record()
601 if (!zstream->workspace) { in decompress_record()
602 pr_warn("no decompression method initialized!\n"); in decompress_record()
613 max_uncompressed_size = 3 * psinfo->bufsize; in decompress_record()
614 workspace = kvzalloc(max_uncompressed_size + record->ecc_notice_size, in decompress_record()
619 zstream->next_in = record->buf; in decompress_record()
620 zstream->avail_in = record->size; in decompress_record()
621 zstream->next_out = workspace; in decompress_record()
622 zstream->avail_out = max_uncompressed_size; in decompress_record()
631 unzipped_len = zstream->total_out; in decompress_record()
634 memcpy(workspace + unzipped_len, record->buf + record->size, in decompress_record()
635 record->ecc_notice_size); in decompress_record()
637 /* Copy decompressed contents into an minimum-sized allocation. */ in decompress_record()
638 unzipped = kvmemdup(workspace, unzipped_len + record->ecc_notice_size, in decompress_record()
645 kvfree(record->buf); in decompress_record()
646 record->buf = unzipped; in decompress_record()
647 record->size = unzipped_len; in decompress_record()
648 record->compressed = false; in decompress_record()
653 * files in our filesystem. Don't warn about -EEXIST errors
654 * when we are re-scanning the backing store looking to add new
670 zlib_inflateInit2(&zstream, -DEF_WBITS); in pstore_get_backend_records()
673 mutex_lock(&psi->read_mutex); in pstore_get_backend_records()
674 if (psi->open && psi->open(psi)) in pstore_get_backend_records()
682 for (; stop_loop; stop_loop--) { in pstore_get_backend_records()
693 record->size = psi->read(record); in pstore_get_backend_records()
695 /* No more records left in backend? */ in pstore_get_backend_records()
696 if (record->size <= 0) { in pstore_get_backend_records()
705 kvfree(record->buf); in pstore_get_backend_records()
706 kfree(record->priv); in pstore_get_backend_records()
708 if (rc != -EEXIST || !quiet) in pstore_get_backend_records()
712 if (psi->close) in pstore_get_backend_records()
713 psi->close(psi); in pstore_get_backend_records()
715 mutex_unlock(&psi->read_mutex); in pstore_get_backend_records()
725 failed, psi->name); in pstore_get_backend_records()
728 psi->name); in pstore_get_backend_records()
765 MODULE_DESCRIPTION("Persistent Storage - platform driver interface");