All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vitaly Kuznetsov <vkuznets@redhat.com>
To: qemu-devel@nongnu.org
Cc: Paolo Bonzini <pbonzini@redhat.com>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Eduardo Habkost <ehabkost@redhat.com>,
	"Dr. David Alan Gilbert" <dgilbert@redhat.com>
Subject: [PATCH RFC v3 17/23] i386: move eVMCS enablement to hyperv_init_vcpu()
Date: Fri,  9 Oct 2020 14:18:36 +0200	[thread overview]
Message-ID: <20201009121842.1938010-18-vkuznets@redhat.com> (raw)
In-Reply-To: <20201009121842.1938010-1-vkuznets@redhat.com>

hyperv_expand_features() will be called before we create vCPU so
evmcs enablement should go away. hyperv_init_vcpu() looks like the
right place.

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
---
 target/i386/kvm.c | 60 +++++++++++++++++++++++++++++------------------
 1 file changed, 37 insertions(+), 23 deletions(-)

diff --git a/target/i386/kvm.c b/target/i386/kvm.c
index 8c846f80a25f..06f78a09304e 100644
--- a/target/i386/kvm.c
+++ b/target/i386/kvm.c
@@ -961,6 +961,7 @@ static struct kvm_cpuid2 *get_supported_hv_cpuid(CPUState *cs)
 {
     struct kvm_cpuid2 *cpuid;
     int max = 7; /* 0x40000000..0x40000005, 0x4000000A */
+    int i;
 
     /*
      * When the buffer is too small, KVM_GET_SUPPORTED_HV_CPUID fails with
@@ -970,6 +971,22 @@ static struct kvm_cpuid2 *get_supported_hv_cpuid(CPUState *cs)
     while ((cpuid = try_get_hv_cpuid(cs, max)) == NULL) {
         max++;
     }
+
+    /*
+     * KVM_GET_SUPPORTED_HV_CPUID does not set EVMCS CPUID bit before
+     * KVM_CAP_HYPERV_ENLIGHTENED_VMCS is enabled but we want to get the
+     * information early, just check for the capability and set the bit
+     * manually.
+     */
+    if (kvm_check_extension(cs->kvm_state,
+                            KVM_CAP_HYPERV_ENLIGHTENED_VMCS) > 0) {
+        for (i = 0; i < cpuid->nent; i++) {
+            if (cpuid->entries[i].function == HV_CPUID_ENLIGHTMENT_INFO) {
+                cpuid->entries[i].eax |= HV_ENLIGHTENED_VMCS_RECOMMENDED;
+            }
+        }
+    }
+
     return cpuid;
 }
 
@@ -1199,24 +1216,6 @@ static int hyperv_expand_features(CPUState *cs)
     if (!hyperv_enabled(cpu))
         return 0;
 
-    if (hyperv_feat_enabled(cpu, HYPERV_FEAT_EVMCS) ||
-        cpu->hyperv_passthrough) {
-        uint16_t evmcs_version;
-
-        r = kvm_vcpu_enable_cap(cs, KVM_CAP_HYPERV_ENLIGHTENED_VMCS, 0,
-                                (uintptr_t)&evmcs_version);
-
-        if (hyperv_feat_enabled(cpu, HYPERV_FEAT_EVMCS) && r) {
-            fprintf(stderr, "Hyper-V %s is not supported by kernel\n",
-                    kvm_hyperv_properties[HYPERV_FEAT_EVMCS].desc);
-            return -ENOSYS;
-        }
-
-        if (!r) {
-            cpu->hyperv_nested[0] = evmcs_version;
-        }
-    }
-
     if (cpu->hyperv_passthrough) {
         cpu->hyperv_vendor_id[0] =
             hv_cpuid_get_host(cs, HV_CPUID_VENDOR_AND_MAX_FUNCTIONS, R_EBX);
@@ -1453,6 +1452,21 @@ static int hyperv_init_vcpu(X86CPU *cpu)
         }
     }
 
+    if (hyperv_feat_enabled(cpu, HYPERV_FEAT_EVMCS)) {
+        uint16_t evmcs_version;
+
+        ret = kvm_vcpu_enable_cap(cs, KVM_CAP_HYPERV_ENLIGHTENED_VMCS, 0,
+                                  (uintptr_t)&evmcs_version);
+
+        if (ret < 0) {
+            fprintf(stderr, "Hyper-V %s is not supported by kernel\n",
+                    kvm_hyperv_properties[HYPERV_FEAT_EVMCS].desc);
+            return ret;
+        }
+
+        cpu->hyperv_nested[0] = evmcs_version;
+    }
+
     return 0;
 }
 
@@ -1517,6 +1531,11 @@ int kvm_arch_init_vcpu(CPUState *cs)
     }
 
     if (hyperv_enabled(cpu)) {
+        r = hyperv_init_vcpu(cpu);
+        if (r) {
+            return r;
+        }
+
         cpuid_i = hyperv_fill_cpuids(cs, cpuid_data.entries);
         kvm_base = KVM_CPUID_SIGNATURE_NEXT;
         has_msr_hv_hypercall = true;
@@ -1864,11 +1883,6 @@ int kvm_arch_init_vcpu(CPUState *cs)
 
     kvm_init_msrs(cpu);
 
-    r = hyperv_init_vcpu(cpu);
-    if (r) {
-        goto fail;
-    }
-
     return 0;
 
  fail:
-- 
2.25.4



  parent reply	other threads:[~2020-10-09 12:37 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-09 12:18 [PATCH RFC v3 00/23] i386: KVM: expand Hyper-V features early Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 01/23] WIP: update linux/headers Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 02/23] i386: fill in FEAT_HYPERV_EDX from edx instead of eax Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 03/23] i386: drop x86_cpu_get_supported_feature_word() forward declaration Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 04/23] i386: move hyperv_vendor_id initialization to x86_cpu_realizefn() Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 05/23] i386: move hyperv_interface_id " Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 06/23] i386: move hyperv_version_id " Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 07/23] i386: move hyperv_limits " Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 08/23] i386: keep hyperv_vendor string up-to-date Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 09/23] i386: invert hyperv_spinlock_attempts setting logic with hv_passthrough Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 10/23] i386: always fill Hyper-V CPUID feature leaves from X86CPU data Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 11/23] i386: stop using env->features[] for filling Hyper-V CPUIDs Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 12/23] i386: introduce hyperv_feature_supported() Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 13/23] i386: introduce hv_cpuid_get_host() Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 14/23] i386: drop FEAT_HYPERV feature leaves Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 15/23] i386: introduce hv_cpuid_cache Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 16/23] i386: split hyperv_handle_properties() into hyperv_expand_features()/hyperv_fill_cpuids() Vitaly Kuznetsov
2020-10-09 12:18 ` Vitaly Kuznetsov [this message]
2020-10-09 12:18 ` [PATCH RFC v3 18/23] i386: switch hyperv_expand_features() to using error_setg() Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 19/23] i386: adjust the expected KVM_GET_SUPPORTED_HV_CPUID array size Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 20/23] i386: prefer system KVM_GET_SUPPORTED_HV_CPUID ioctl over vCPU's one Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 21/23] i386: use global kvm_state in hyperv_enabled() check Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 22/23] i386: expand Hyper-V features during CPU feature expansion time Vitaly Kuznetsov
2020-10-09 12:18 ` [PATCH RFC v3 23/23] i386: provide simple 'hyperv=on' option to x86 machine types Vitaly Kuznetsov
2020-11-18 22:25   ` Eduardo Habkost
2020-11-19  8:52     ` Vitaly Kuznetsov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201009121842.1938010-18-vkuznets@redhat.com \
    --to=vkuznets@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=mtosatti@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.