]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
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 d7749ecb30d494e0276a91772edd0fbe49fdbf61..2fca299f7e1929e6f1f1f3dac6b86c1fb1c85c9e 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 6fba06b6cfdbc86b754839c993e063d28fcf5dd6..abe1b5e82547b1137f18cdd62c4959e519980236 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 c3140c6084c930a7e75a2cd0c89728b58970e689..c9e2819b095abb23a52169f5e9ff0f17b6aab911 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