/** * cmm_exit - Module exit * * Return value: * nothing **/ static void cmm_exit(void) { if (cmm_thread_ptr) kthread_stop(cmm_thread_ptr); unregister_oom_notifier(&cmm_oom_nb); unregister_reboot_notifier(&cmm_reboot_nb); unregister_memory_notifier(&cmm_mem_nb); unregister_memory_isolate_notifier(&cmm_mem_isolate_nb); cmm_free_pages(loaned_pages); cmm_unregister_sysfs(&cmm_dev); }
/* * 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 }
/** * 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; }
static void err_inject_exit(void) { unregister_memory_notifier(&memory_notifier_err_inject.nb); debugfs_remove_recursive(dir); }