109c434b8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
29579f5bdSAkinobu Mita #include <linux/kernel.h>
39579f5bdSAkinobu Mita #include <linux/module.h>
49579f5bdSAkinobu Mita #include <linux/memory.h>
59579f5bdSAkinobu Mita 
69579f5bdSAkinobu Mita #include "notifier-error-inject.h"
79579f5bdSAkinobu Mita 
89579f5bdSAkinobu Mita static int priority;
99579f5bdSAkinobu Mita module_param(priority, int, 0);
109579f5bdSAkinobu Mita MODULE_PARM_DESC(priority, "specify memory notifier priority");
119579f5bdSAkinobu Mita 
129579f5bdSAkinobu Mita static struct notifier_err_inject memory_notifier_err_inject = {
139579f5bdSAkinobu Mita 	.actions = {
149579f5bdSAkinobu Mita 		{ NOTIFIER_ERR_INJECT_ACTION(MEM_GOING_ONLINE) },
159579f5bdSAkinobu Mita 		{ NOTIFIER_ERR_INJECT_ACTION(MEM_GOING_OFFLINE) },
169579f5bdSAkinobu Mita 		{}
179579f5bdSAkinobu Mita 	}
189579f5bdSAkinobu Mita };
199579f5bdSAkinobu Mita 
209579f5bdSAkinobu Mita static struct dentry *dir;
219579f5bdSAkinobu Mita 
err_inject_init(void)229579f5bdSAkinobu Mita static int err_inject_init(void)
239579f5bdSAkinobu Mita {
249579f5bdSAkinobu Mita 	int err;
259579f5bdSAkinobu Mita 
269579f5bdSAkinobu Mita 	dir = notifier_err_inject_init("memory", notifier_err_inject_dir,
279579f5bdSAkinobu Mita 					&memory_notifier_err_inject, priority);
289579f5bdSAkinobu Mita 	if (IS_ERR(dir))
299579f5bdSAkinobu Mita 		return PTR_ERR(dir);
309579f5bdSAkinobu Mita 
319579f5bdSAkinobu Mita 	err = register_memory_notifier(&memory_notifier_err_inject.nb);
329579f5bdSAkinobu Mita 	if (err)
339579f5bdSAkinobu Mita 		debugfs_remove_recursive(dir);
349579f5bdSAkinobu Mita 
359579f5bdSAkinobu Mita 	return err;
369579f5bdSAkinobu Mita }
379579f5bdSAkinobu Mita 
err_inject_exit(void)389579f5bdSAkinobu Mita static void err_inject_exit(void)
399579f5bdSAkinobu Mita {
409579f5bdSAkinobu Mita 	unregister_memory_notifier(&memory_notifier_err_inject.nb);
419579f5bdSAkinobu Mita 	debugfs_remove_recursive(dir);
429579f5bdSAkinobu Mita }
439579f5bdSAkinobu Mita 
449579f5bdSAkinobu Mita module_init(err_inject_init);
459579f5bdSAkinobu Mita module_exit(err_inject_exit);
469579f5bdSAkinobu Mita 
479579f5bdSAkinobu Mita MODULE_DESCRIPTION("memory notifier error injection module");
489579f5bdSAkinobu Mita MODULE_LICENSE("GPL");
499579f5bdSAkinobu Mita MODULE_AUTHOR("Akinobu Mita <akinobu.mita@gmail.com>");
50