Commit 8046fa5f authored by Paolo Bonzini's avatar Paolo Bonzini

Merge tag 'kvmarm-fixes-6.8-1' of...

Merge tag 'kvmarm-fixes-6.8-1' of git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm into HEAD

KVM/arm64 fixes for 6.8, take #1

- Don't source the VFIO Kconfig twice

- Fix protected-mode locking order between kvm and vcpus
parents e67391ca 42dfa94d
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
# KVM configuration # KVM configuration
# #
source "virt/lib/Kconfig"
source "virt/kvm/Kconfig" source "virt/kvm/Kconfig"
menuconfig VIRTUALIZATION menuconfig VIRTUALIZATION
......
...@@ -101,6 +101,17 @@ void __init kvm_hyp_reserve(void) ...@@ -101,6 +101,17 @@ void __init kvm_hyp_reserve(void)
hyp_mem_base); hyp_mem_base);
} }
static void __pkvm_destroy_hyp_vm(struct kvm *host_kvm)
{
if (host_kvm->arch.pkvm.handle) {
WARN_ON(kvm_call_hyp_nvhe(__pkvm_teardown_vm,
host_kvm->arch.pkvm.handle));
}
host_kvm->arch.pkvm.handle = 0;
free_hyp_memcache(&host_kvm->arch.pkvm.teardown_mc);
}
/* /*
* Allocates and donates memory for hypervisor VM structs at EL2. * Allocates and donates memory for hypervisor VM structs at EL2.
* *
...@@ -181,7 +192,7 @@ static int __pkvm_create_hyp_vm(struct kvm *host_kvm) ...@@ -181,7 +192,7 @@ static int __pkvm_create_hyp_vm(struct kvm *host_kvm)
return 0; return 0;
destroy_vm: destroy_vm:
pkvm_destroy_hyp_vm(host_kvm); __pkvm_destroy_hyp_vm(host_kvm);
return ret; return ret;
free_vm: free_vm:
free_pages_exact(hyp_vm, hyp_vm_sz); free_pages_exact(hyp_vm, hyp_vm_sz);
...@@ -194,23 +205,19 @@ int pkvm_create_hyp_vm(struct kvm *host_kvm) ...@@ -194,23 +205,19 @@ int pkvm_create_hyp_vm(struct kvm *host_kvm)
{ {
int ret = 0; int ret = 0;
mutex_lock(&host_kvm->lock); mutex_lock(&host_kvm->arch.config_lock);
if (!host_kvm->arch.pkvm.handle) if (!host_kvm->arch.pkvm.handle)
ret = __pkvm_create_hyp_vm(host_kvm); ret = __pkvm_create_hyp_vm(host_kvm);
mutex_unlock(&host_kvm->lock); mutex_unlock(&host_kvm->arch.config_lock);
return ret; return ret;
} }
void pkvm_destroy_hyp_vm(struct kvm *host_kvm) void pkvm_destroy_hyp_vm(struct kvm *host_kvm)
{ {
if (host_kvm->arch.pkvm.handle) { mutex_lock(&host_kvm->arch.config_lock);
WARN_ON(kvm_call_hyp_nvhe(__pkvm_teardown_vm, __pkvm_destroy_hyp_vm(host_kvm);
host_kvm->arch.pkvm.handle)); mutex_unlock(&host_kvm->arch.config_lock);
}
host_kvm->arch.pkvm.handle = 0;
free_hyp_memcache(&host_kvm->arch.pkvm.teardown_mc);
} }
int pkvm_init_host_vm(struct kvm *host_kvm) int pkvm_init_host_vm(struct kvm *host_kvm)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment