Message ID | 1427111639-4575-3-git-send-email-takahiro.akashi@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, 2015-03-23 at 20:53 +0900, AKASHI Takahiro wrote: > The current kvm implementation keeps EL2 vector table installed even > when the system is shut down. This prevents kexec from putting the system > with kvm back into EL2 when starting a new kernel. This is a kvm bug fix, so I think the subject should be something like 'arm64/kvm: Fix shutdown issue'. -Geoff
On 03/24/2015 12:56 AM, Geoff Levand wrote: > On Mon, 2015-03-23 at 20:53 +0900, AKASHI Takahiro wrote: >> The current kvm implementation keeps EL2 vector table installed even >> when the system is shut down. This prevents kexec from putting the system >> with kvm back into EL2 when starting a new kernel. > > This is a kvm bug fix, so I think the subject should > be something like 'arm64/kvm: Fix shutdown issue'. Yeah, "arm64: kvm: fix shutdown issue in kexec" -Takahiro AKASHI > -Geoff > >
On 23/03/15 15:56, Geoff Levand wrote: > On Mon, 2015-03-23 at 20:53 +0900, AKASHI Takahiro wrote: >> The current kvm implementation keeps EL2 vector table installed even >> when the system is shut down. This prevents kexec from putting the system >> with kvm back into EL2 when starting a new kernel. > > This is a kvm bug fix, so I think the subject should > be something like 'arm64/kvm: Fix shutdown issue'. Not quite. On its own, this doesn't fix anything in KVM. It simply plugs a deficiency in the arm64 kexec implementation. If you want to be completely true to the content of the patch, it should read: "arm64: KVM: Allow EL2 context to be reset on shutdown" Can we now drop the blame game and get back to the actual code? Thanks, M.
Hi Marc,
On Tue, 2015-03-24 at 08:46 +0000, Marc Zyngier wrote:
> "arm64: KVM: Allow EL2 context to be reset on shutdown"
Sure, this sounds good.
-Geoff
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 35c8bc0..b879cf6 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c @@ -25,6 +25,7 @@ #include <linux/vmalloc.h> #include <linux/fs.h> #include <linux/mman.h> +#include <linux/reboot.h> #include <linux/sched.h> #include <linux/kvm.h> #include <trace/events/kvm.h> @@ -1103,6 +1104,23 @@ struct kvm_vcpu *kvm_mpidr_to_vcpu(struct kvm *kvm, unsigned long mpidr) return NULL; } +static int kvm_reboot_notify(struct notifier_block *nb, + unsigned long val, void *v) +{ + /* + * Reset each CPU in EL2 to initial state. + */ + on_each_cpu(kvm_cpu_reset, NULL, 1); + + return NOTIFY_DONE; +} + +static struct notifier_block kvm_reboot_nb = { + .notifier_call = kvm_reboot_notify, + .next = NULL, + .priority = 0, /* FIXME */ +}; + /** * Initialize Hyp-mode and memory mappings on all CPUs. */ @@ -1141,6 +1159,9 @@ int kvm_arch_init(void *opaque) hyp_cpu_pm_init(); kvm_coproc_table_init(); + + register_reboot_notifier(&kvm_reboot_nb); + return 0; out_err: cpu_notifier_register_done(); diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig index 30ae7a7..f5590c8 100644 --- a/arch/arm64/kvm/Kconfig +++ b/arch/arm64/kvm/Kconfig @@ -18,7 +18,6 @@ if VIRTUALIZATION config KVM bool "Kernel-based Virtual Machine (KVM) support" - depends on !KEXEC select MMU_NOTIFIER select PREEMPT_NOTIFIERS select ANON_INODES
The current kvm implementation keeps EL2 vector table installed even when the system is shut down. This prevents kexec from putting the system with kvm back into EL2 when starting a new kernel. This patch resolves this issue by calling a cpu tear-down function via reboot notifier, kvm_reboot_notify(), which is invoked by kernel_restart_prepare() in kernel_kexec(). While kvm has a generic hook, kvm_reboot(), we can't use it here because a cpu teardown function will not be invoked, under current implementation, if no guest vm has been created by kvm_create_vm(). Please note that kvm_usage_count is zero in this case. We'd better, in the future, implement cpu hotplug support and put the arch-specific initialization into kvm_arch_hardware_enable/disable(). This way, we would be able to revert this patch. Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> --- arch/arm/kvm/arm.c | 21 +++++++++++++++++++++ arch/arm64/kvm/Kconfig | 1 - 2 files changed, 21 insertions(+), 1 deletion(-)