static int err_inject_init(void) { int err; dir = notifier_err_inject_init("memory", notifier_err_inject_dir, &memory_notifier_err_inject, priority); if (IS_ERR(dir)) return PTR_ERR(dir); err = register_memory_notifier(&memory_notifier_err_inject.nb); if (err) debugfs_remove_recursive(dir); return err; }
/** * cmm_init - Module initialization * * Return value: * 0 on success / other on failure **/ static int cmm_init(void) { int rc = -ENOMEM; if (!firmware_has_feature(FW_FEATURE_CMO)) return -EOPNOTSUPP; if ((rc = register_oom_notifier(&cmm_oom_nb)) < 0) return rc; if ((rc = register_reboot_notifier(&cmm_reboot_nb))) goto out_oom_notifier; if ((rc = cmm_sysfs_register(&cmm_dev))) goto out_reboot_notifier; if (register_memory_notifier(&cmm_mem_nb) || register_memory_isolate_notifier(&cmm_mem_isolate_nb)) goto out_unregister_notifier; if (cmm_disabled) return rc; cmm_thread_ptr = kthread_run(cmm_thread, NULL, "cmmthread"); if (IS_ERR(cmm_thread_ptr)) { rc = PTR_ERR(cmm_thread_ptr); goto out_unregister_notifier; } return rc; out_unregister_notifier: unregister_memory_notifier(&cmm_mem_nb); unregister_memory_isolate_notifier(&cmm_mem_isolate_nb); cmm_unregister_sysfs(&cmm_dev); out_reboot_notifier: unregister_reboot_notifier(&cmm_reboot_nb); out_oom_notifier: unregister_oom_notifier(&cmm_oom_nb); return rc; }
/* * Reserve memory for kdump kernel to be loaded with kexec */ static void __init reserve_crashkernel(void) { #ifdef CONFIG_CRASH_DUMP unsigned long long crash_base, crash_size; char *msg; int rc; rc = parse_crashkernel(boot_command_line, memory_end, &crash_size, &crash_base); if (rc || crash_size == 0) return; crash_base = ALIGN(crash_base, KEXEC_CRASH_MEM_ALIGN); crash_size = ALIGN(crash_size, KEXEC_CRASH_MEM_ALIGN); if (register_memory_notifier(&kdump_mem_nb)) return; if (!crash_base) crash_base = find_crash_base(crash_size, &msg); if (!crash_base) { pr_info("crashkernel reservation failed: %s\n", msg); unregister_memory_notifier(&kdump_mem_nb); return; } if (verify_crash_base(crash_base, crash_size, &msg)) { pr_info("crashkernel reservation failed: %s\n", msg); unregister_memory_notifier(&kdump_mem_nb); return; } if (!OLDMEM_BASE && MACHINE_IS_VM) diag10_range(PFN_DOWN(crash_base), PFN_DOWN(crash_size)); crashk_res.start = crash_base; crashk_res.end = crash_base + crash_size - 1; insert_resource(&iomem_resource, &crashk_res); reserve_kdump_bootmem(crash_base, crash_size, CHUNK_CRASHK); pr_info("Reserving %lluMB of memory at %lluMB " "for crashkernel (System RAM: %luMB)\n", crash_size >> 20, crash_base >> 20, memory_end >> 20); #endif }