arm: kvm: implement CPU PM notifier
Upon CPU shutdown and consequent warm-reboot, the hypervisor CPU state must be re-initialized. This patch implements a CPU PM notifier that upon warm-boot calls a KVM hook to reinitialize properly the hypervisor state so that the CPU can be safely resumed. Acked-by: Marc Zyngier <marc.zyngier@arm.com> Acked-by: Christoffer Dall <christoffer.dall@linaro.org> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
This commit is contained in:
		
					parent
					
						
							
								fb1ab1ab38
							
						
					
				
			
			
				commit
				
					
						1fcf7ce0c6
					
				
			
		
					 1 changed files with 30 additions and 0 deletions
				
			
		|  | @ -17,6 +17,7 @@ | |||
|  */ | ||||
| 
 | ||||
| #include <linux/cpu.h> | ||||
| #include <linux/cpu_pm.h> | ||||
| #include <linux/errno.h> | ||||
| #include <linux/err.h> | ||||
| #include <linux/kvm_host.h> | ||||
|  | @ -853,6 +854,33 @@ static struct notifier_block hyp_init_cpu_nb = { | |||
| 	.notifier_call = hyp_init_cpu_notify, | ||||
| }; | ||||
| 
 | ||||
| #ifdef CONFIG_CPU_PM | ||||
| static int hyp_init_cpu_pm_notifier(struct notifier_block *self, | ||||
| 				    unsigned long cmd, | ||||
| 				    void *v) | ||||
| { | ||||
| 	if (cmd == CPU_PM_EXIT) { | ||||
| 		cpu_init_hyp_mode(NULL); | ||||
| 		return NOTIFY_OK; | ||||
| 	} | ||||
| 
 | ||||
| 	return NOTIFY_DONE; | ||||
| } | ||||
| 
 | ||||
| static struct notifier_block hyp_init_cpu_pm_nb = { | ||||
| 	.notifier_call = hyp_init_cpu_pm_notifier, | ||||
| }; | ||||
| 
 | ||||
| static void __init hyp_cpu_pm_init(void) | ||||
| { | ||||
| 	cpu_pm_register_notifier(&hyp_init_cpu_pm_nb); | ||||
| } | ||||
| #else | ||||
| static inline void hyp_cpu_pm_init(void) | ||||
| { | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /**
 | ||||
|  * Inits Hyp-mode on all online CPUs | ||||
|  */ | ||||
|  | @ -1013,6 +1041,8 @@ int kvm_arch_init(void *opaque) | |||
| 		goto out_err; | ||||
| 	} | ||||
| 
 | ||||
| 	hyp_cpu_pm_init(); | ||||
| 
 | ||||
| 	kvm_coproc_table_init(); | ||||
| 	return 0; | ||||
| out_err: | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Lorenzo Pieralisi
				Lorenzo Pieralisi