KVM: Introduce paravirtualization hints and KVM_HINTS_DEDICATED
authorWanpeng Li <wanpengli@tencent.com>
Tue, 13 Feb 2018 01:05:40 +0000 (09:05 +0800)
committerRadim Krčmář <rkrcmar@redhat.com>
Tue, 6 Mar 2018 17:40:44 +0000 (18:40 +0100)
This patch introduces kvm_para_has_hint() to query for hints about
the configuration of the guests.  The first hint KVM_HINTS_DEDICATED,
is set if the guest has dedicated physical CPUs for each vCPU (i.e.
pinning and no over-commitment).  This allows optimizing spinlocks
and tells the guest to avoid PV TLB flush.

Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Cc: Eduardo Habkost <ehabkost@redhat.com>
Signed-off-by: Wanpeng Li <wanpengli@tencent.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
Documentation/virtual/kvm/cpuid.txt
arch/mips/include/asm/kvm_para.h
arch/powerpc/include/asm/kvm_para.h
arch/s390/include/asm/kvm_para.h
arch/x86/include/asm/kvm_para.h
arch/x86/include/uapi/asm/kvm_para.h
arch/x86/kernel/kvm.c
include/asm-generic/kvm_para.h
include/linux/kvm_para.h

index 87a7506f31c2b7f9b03be131ba3b3ef1c85f360b..d4f33eb805dd228a8d8aff796bd77327334aa24b 100644 (file)
@@ -23,8 +23,8 @@ This function queries the presence of KVM cpuid leafs.
 
 
 function: define KVM_CPUID_FEATURES (0x40000001)
-returns : ebx, ecx, edx = 0
-          eax = and OR'ed group of (1 << flag), where each flags is:
+returns : ebx, ecx
+          eax = an OR'ed group of (1 << flag), where each flags is:
 
 
 flag                               || value || meaning
@@ -66,3 +66,14 @@ KVM_FEATURE_CLOCKSOURCE_STABLE_BIT ||    24 || host will warn if no guest-side
                                    ||       || per-cpu warps are expected in
                                    ||       || kvmclock.
 ------------------------------------------------------------------------------
+
+          edx = an OR'ed group of (1 << flag), where each flags is:
+
+
+flag                               || value || meaning
+==================================================================================
+KVM_HINTS_DEDICATED                ||     0 || guest checks this feature bit to
+                                   ||       || determine if there is vCPU pinning
+                                   ||       || and there is no vCPU over-commitment,
+                                   ||       || allowing optimizations
+----------------------------------------------------------------------------------
index 60b1aa0b7014ad05c56cf8607e5cb826c19ba896..b57e978b0946ef8de9de15fd290196a22fae20a0 100644 (file)
@@ -94,6 +94,11 @@ static inline unsigned int kvm_arch_para_features(void)
        return 0;
 }
 
+static inline unsigned int kvm_arch_para_hints(void)
+{
+       return 0;
+}
+
 #ifdef CONFIG_MIPS_PARAVIRT
 static inline bool kvm_para_available(void)
 {
index 336a91acb8b1f3a98f4bfdd7c0c6488d95b86ae0..5ceb4efca65f91f13846c4b67bc229c79520225d 100644 (file)
@@ -61,6 +61,11 @@ static inline unsigned int kvm_arch_para_features(void)
        return r;
 }
 
+static inline unsigned int kvm_arch_para_hints(void)
+{
+       return 0;
+}
+
 static inline bool kvm_check_and_clear_guest_paused(void)
 {
        return false;
index 74eeec9c0a809bffecbb26f3875ffc5be62e7e3b..cbc7c3a68e4dfdec0bdd76a767f0843afa1cd6f6 100644 (file)
@@ -193,6 +193,11 @@ static inline unsigned int kvm_arch_para_features(void)
        return 0;
 }
 
+static inline unsigned int kvm_arch_para_hints(void)
+{
+       return 0;
+}
+
 static inline bool kvm_check_and_clear_guest_paused(void)
 {
        return false;
index 7b407dda2bd713e00f1429a680528ad4e85973f7..3aea2658323a5ea5c76f2524b7315eb08149d9e1 100644 (file)
@@ -88,6 +88,7 @@ static inline long kvm_hypercall4(unsigned int nr, unsigned long p1,
 #ifdef CONFIG_KVM_GUEST
 bool kvm_para_available(void);
 unsigned int kvm_arch_para_features(void);
+unsigned int kvm_arch_para_hints(void);
 void kvm_async_pf_task_wait(u32 token, int interrupt_kernel);
 void kvm_async_pf_task_wake(u32 token);
 u32 kvm_read_and_reset_pf_reason(void);
@@ -115,6 +116,11 @@ static inline unsigned int kvm_arch_para_features(void)
        return 0;
 }
 
+static inline unsigned int kvm_arch_para_hints(void)
+{
+       return 0;
+}
+
 static inline u32 kvm_read_and_reset_pf_reason(void)
 {
        return 0;
index 6cfa9c8cb7d650bef22010de0eca622a86364a73..68a41b6ba3da3ff7d46834f812fdd9087a7abc80 100644 (file)
  */
 #define KVM_CPUID_SIGNATURE    0x40000000
 
-/* This CPUID returns a feature bitmap in eax.  Before enabling a particular
- * paravirtualization, the appropriate feature bit should be checked.
+/* This CPUID returns two feature bitmaps in eax, edx. Before enabling
+ * a particular paravirtualization, the appropriate feature bit should
+ * be checked in eax. The performance hint feature bit should be checked
+ * in edx.
  */
 #define KVM_CPUID_FEATURES     0x40000001
 #define KVM_FEATURE_CLOCKSOURCE                0
@@ -28,6 +30,8 @@
 #define KVM_FEATURE_PV_TLB_FLUSH       9
 #define KVM_FEATURE_ASYNC_PF_VMEXIT    10
 
+#define KVM_HINTS_DEDICATED      0
+
 /* The last 8 bits are used to indicate how to interpret the flags field
  * in pvclock structure. If no bits are set, all flags are ignored.
  */
index bc1a27280c4bf77899afad4b85bf53212d385cab..8c9d98c46f840df5438e9e2e3d3564acd7747d8f 100644 (file)
@@ -605,6 +605,11 @@ unsigned int kvm_arch_para_features(void)
        return cpuid_eax(kvm_cpuid_base() | KVM_CPUID_FEATURES);
 }
 
+unsigned int kvm_arch_para_hints(void)
+{
+       return cpuid_edx(kvm_cpuid_base() | KVM_CPUID_FEATURES);
+}
+
 static uint32_t __init kvm_detect(void)
 {
        return kvm_cpuid_base();
index 18c6abe81fbdc60967e83ffe303462ce7cf0ea08..728e5c5706c4e28dc7f4b94dfa3027ddba816bef 100644 (file)
@@ -19,6 +19,11 @@ static inline unsigned int kvm_arch_para_features(void)
        return 0;
 }
 
+static inline unsigned int kvm_arch_para_hints(void)
+{
+       return 0;
+}
+
 static inline bool kvm_para_available(void)
 {
        return false;
index 51f6ef2c2ff461a0b80ea121ad48545b31473d03..f23b90b02898a4474e55bcc2582516da7272977e 100644 (file)
@@ -9,4 +9,9 @@ static inline bool kvm_para_has_feature(unsigned int feature)
 {
        return !!(kvm_arch_para_features() & (1UL << feature));
 }
+
+static inline bool kvm_para_has_hint(unsigned int feature)
+{
+       return !!(kvm_arch_para_hints() & (1UL << feature));
+}
 #endif /* __LINUX_KVM_PARA_H */