mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
KVM: x86: hyper-v: Allocate Hyper-V context lazily
Hyper-V context is only needed for guests which use Hyper-V emulation in KVM (e.g. Windows/Hyper-V guests) so we don't actually need to allocate it in kvm_arch_vcpu_create(), we can postpone the action until Hyper-V specific MSRs are accessed or SynIC is enabled. Once allocated, let's keep the context alive for the lifetime of the vCPU as an attempt to free it would require additional synchronization with other vCPUs and normally it is not supposed to happen. Note, Hyper-V style hypercall enablement is done by writing to HV_X64_MSR_GUEST_OS_ID so we don't need to worry about allocating Hyper-V context from kvm_hv_hypercall(). Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> Message-Id: <20210126134816.1880136-15-vkuznets@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
committed by
Paolo Bonzini
parent
8f014550df
commit
fc08b628d7
@@ -10083,12 +10083,9 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
|
||||
vcpu->arch.pending_external_vector = -1;
|
||||
vcpu->arch.preempted_in_kernel = false;
|
||||
|
||||
if (kvm_hv_vcpu_init(vcpu))
|
||||
goto free_guest_fpu;
|
||||
|
||||
r = static_call(kvm_x86_vcpu_create)(vcpu);
|
||||
if (r)
|
||||
goto free_hv_vcpu;
|
||||
goto free_guest_fpu;
|
||||
|
||||
vcpu->arch.arch_capabilities = kvm_get_arch_capabilities();
|
||||
vcpu->arch.msr_platform_info = MSR_PLATFORM_INFO_CPUID_FAULT;
|
||||
@@ -10099,8 +10096,6 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
|
||||
vcpu_put(vcpu);
|
||||
return 0;
|
||||
|
||||
free_hv_vcpu:
|
||||
kvm_hv_vcpu_uninit(vcpu);
|
||||
free_guest_fpu:
|
||||
kvm_free_guest_fpu(vcpu);
|
||||
free_user_fpu:
|
||||
@@ -10124,8 +10119,6 @@ void kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct kvm *kvm = vcpu->kvm;
|
||||
|
||||
kvm_hv_vcpu_postcreate(vcpu);
|
||||
|
||||
if (mutex_lock_killable(&vcpu->mutex))
|
||||
return;
|
||||
vcpu_load(vcpu);
|
||||
|
Reference in New Issue
Block a user