powerpc: Reintroduce is_kvm_guest() as a fast-path check
authorSrikar Dronamraju <srikar@linux.vnet.ibm.com>
Wed, 2 Dec 2020 05:04:55 +0000 (10:34 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 3 Dec 2020 14:01:22 +0000 (01:01 +1100)
Introduce a static branch that would be set during boot if the OS
happens to be a KVM guest. Subsequent checks to see if we are on KVM
will rely on this static branch. This static branch would be used in
vcpu_is_preempted() in a subsequent patch.

Signed-off-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Acked-by: Waiman Long <longman@redhat.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20201202050456.164005-4-srikar@linux.vnet.ibm.com
arch/powerpc/include/asm/kvm_guest.h
arch/powerpc/include/asm/kvm_para.h
arch/powerpc/kernel/firmware.c

index d7749ec..2fca299 100644 (file)
@@ -7,8 +7,18 @@
 #define _ASM_POWERPC_KVM_GUEST_H_
 
 #if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_KVM_GUEST)
+#include <linux/jump_label.h>
+
+DECLARE_STATIC_KEY_FALSE(kvm_guest);
+
+static inline bool is_kvm_guest(void)
+{
+       return static_branch_unlikely(&kvm_guest);
+}
+
 bool check_kvm_guest(void);
 #else
+static inline bool is_kvm_guest(void) { return false; }
 static inline bool check_kvm_guest(void) { return false; }
 #endif
 
index 6fba06b..abe1b5e 100644 (file)
@@ -14,7 +14,7 @@
 
 static inline int kvm_para_available(void)
 {
-       return IS_ENABLED(CONFIG_KVM_GUEST) && check_kvm_guest();
+       return IS_ENABLED(CONFIG_KVM_GUEST) && is_kvm_guest();
 }
 
 static inline unsigned int kvm_arch_para_features(void)
index c3140c6..c9e2819 100644 (file)
@@ -22,6 +22,7 @@ EXPORT_SYMBOL_GPL(powerpc_firmware_features);
 #endif
 
 #if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_KVM_GUEST)
+DEFINE_STATIC_KEY_FALSE(kvm_guest);
 bool check_kvm_guest(void)
 {
        struct device_node *hyper_node;
@@ -33,6 +34,7 @@ bool check_kvm_guest(void)
        if (!of_device_is_compatible(hyper_node, "linux,kvm"))
                return false;
 
+       static_branch_enable(&kvm_guest);
        return true;
 }
 #endif