64 lines
		
	
	
	
		
			1.5 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			64 lines
		
	
	
	
		
			1.5 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
|   | #include <linux/kernel.h>
 | ||
|  | #include <linux/cpu.h>
 | ||
|  | #include <linux/module.h>
 | ||
|  | #include <linux/notifier.h>
 | ||
|  | 
 | ||
|  | static int priority; | ||
|  | static int cpu_up_prepare_error; | ||
|  | static int cpu_down_prepare_error; | ||
|  | 
 | ||
|  | module_param(priority, int, 0); | ||
|  | MODULE_PARM_DESC(priority, "specify cpu notifier priority"); | ||
|  | 
 | ||
|  | module_param(cpu_up_prepare_error, int, 0644); | ||
|  | MODULE_PARM_DESC(cpu_up_prepare_error, | ||
|  | 		"specify error code to inject CPU_UP_PREPARE action"); | ||
|  | 
 | ||
|  | module_param(cpu_down_prepare_error, int, 0644); | ||
|  | MODULE_PARM_DESC(cpu_down_prepare_error, | ||
|  | 		"specify error code to inject CPU_DOWN_PREPARE action"); | ||
|  | 
 | ||
|  | static int err_inject_cpu_callback(struct notifier_block *nfb, | ||
|  | 				unsigned long action, void *hcpu) | ||
|  | { | ||
|  | 	int err = 0; | ||
|  | 
 | ||
|  | 	switch (action) { | ||
|  | 	case CPU_UP_PREPARE: | ||
|  | 	case CPU_UP_PREPARE_FROZEN: | ||
|  | 		err = cpu_up_prepare_error; | ||
|  | 		break; | ||
|  | 	case CPU_DOWN_PREPARE: | ||
|  | 	case CPU_DOWN_PREPARE_FROZEN: | ||
|  | 		err = cpu_down_prepare_error; | ||
|  | 		break; | ||
|  | 	} | ||
|  | 	if (err) | ||
|  | 		printk(KERN_INFO "Injecting error (%d) at cpu notifier\n", err); | ||
|  | 
 | ||
|  | 	return notifier_from_errno(err); | ||
|  | } | ||
|  | 
 | ||
|  | static struct notifier_block err_inject_cpu_notifier = { | ||
|  | 	.notifier_call = err_inject_cpu_callback, | ||
|  | }; | ||
|  | 
 | ||
|  | static int err_inject_init(void) | ||
|  | { | ||
|  | 	err_inject_cpu_notifier.priority = priority; | ||
|  | 
 | ||
|  | 	return register_hotcpu_notifier(&err_inject_cpu_notifier); | ||
|  | } | ||
|  | 
 | ||
|  | static void err_inject_exit(void) | ||
|  | { | ||
|  | 	unregister_hotcpu_notifier(&err_inject_cpu_notifier); | ||
|  | } | ||
|  | 
 | ||
|  | module_init(err_inject_init); | ||
|  | module_exit(err_inject_exit); | ||
|  | 
 | ||
|  | MODULE_DESCRIPTION("CPU notifier error injection module"); | ||
|  | MODULE_LICENSE("GPL"); | ||
|  | MODULE_AUTHOR("Akinobu Mita <akinobu.mita@gmail.com>"); |