]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
virt, sched: Add generic vCPU pinning support
authorJuergen Gross <jgross@suse.com>
Mon, 29 Aug 2016 06:48:43 +0000 (08:48 +0200)
committerIngo Molnar <mingo@kernel.org>
Mon, 5 Sep 2016 11:52:38 +0000 (13:52 +0200)
Add generic virtualization support for pinning the current vCPU to a
specified physical CPU. As this operation isn't performance critical
(a very limited set of operations like BIOS calls and SMIs is expected
to need this) just add a hypervisor specific indirection.

Signed-off-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Douglas_Warzecha@dell.com
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: akataria@vmware.com
Cc: boris.ostrovsky@oracle.com
Cc: chrisw@sous-sol.org
Cc: david.vrabel@citrix.com
Cc: hpa@zytor.com
Cc: jdelvare@suse.com
Cc: jeremy@goop.org
Cc: linux@roeck-us.net
Cc: pali.rohar@gmail.com
Cc: rusty@rustcorp.com.au
Cc: virtualization@lists.linux-foundation.org
Cc: xen-devel@lists.xenproject.org
Link: http://lkml.kernel.org/r/1472453327-19050-3-git-send-email-jgross@suse.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
MAINTAINERS
arch/x86/include/asm/hypervisor.h
arch/x86/kernel/cpu/hypervisor.c
include/linux/hypervisor.h [new file with mode: 0644]
kernel/smp.c
kernel/up.c

index db814a89599ce8141cc5b92603623946d5bee325..95151aab34457521e6dd7c2e8fa8391e98067a20 100644 (file)
@@ -8845,6 +8845,7 @@ S:        Supported
 F:     Documentation/virtual/paravirt_ops.txt
 F:     arch/*/kernel/paravirt*
 F:     arch/*/include/asm/paravirt.h
+F:     include/linux/hypervisor.h
 
 PARIDE DRIVERS FOR PARALLEL PORT IDE DEVICES
 M:     Tim Waugh <tim@cyberelk.net>
index 055ea9941dd5f671d116306a6544adf7a4f189bc..67942b6ad4b7c6f2ced9eac4779eeea72b3472b0 100644 (file)
@@ -43,6 +43,9 @@ struct hypervisor_x86 {
 
        /* X2APIC detection (run once per boot) */
        bool            (*x2apic_available)(void);
+
+       /* pin current vcpu to specified physical cpu (run rarely) */
+       void            (*pin_vcpu)(int);
 };
 
 extern const struct hypervisor_x86 *x86_hyper;
@@ -56,6 +59,7 @@ extern const struct hypervisor_x86 x86_hyper_kvm;
 extern void init_hypervisor(struct cpuinfo_x86 *c);
 extern void init_hypervisor_platform(void);
 extern bool hypervisor_x2apic_available(void);
+extern void hypervisor_pin_vcpu(int cpu);
 #else
 static inline void init_hypervisor(struct cpuinfo_x86 *c) { }
 static inline void init_hypervisor_platform(void) { }
index 27e46658ebe3a940512e383e1ec4b73814aca9a4..35691a6b0d325eb71f8c9695d2eecda957d838f3 100644 (file)
@@ -86,3 +86,14 @@ bool __init hypervisor_x2apic_available(void)
               x86_hyper->x2apic_available &&
               x86_hyper->x2apic_available();
 }
+
+void hypervisor_pin_vcpu(int cpu)
+{
+       if (!x86_hyper)
+               return;
+
+       if (x86_hyper->pin_vcpu)
+               x86_hyper->pin_vcpu(cpu);
+       else
+               WARN_ONCE(1, "vcpu pinning requested but not supported!\n");
+}
diff --git a/include/linux/hypervisor.h b/include/linux/hypervisor.h
new file mode 100644 (file)
index 0000000..3fa5ef2
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef __LINUX_HYPEVISOR_H
+#define __LINUX_HYPEVISOR_H
+
+/*
+ *     Generic Hypervisor support
+ *             Juergen Gross <jgross@suse.com>
+ */
+
+#ifdef CONFIG_HYPERVISOR_GUEST
+#include <asm/hypervisor.h>
+#else
+static inline void hypervisor_pin_vcpu(int cpu)
+{
+}
+#endif
+
+#endif /* __LINUX_HYPEVISOR_H */
index 3aa642d39c0370849372cab0c95f9a5d7760e794..4274ca5f3bbcdad3de081d8e56d42a14f38d18b1 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/smp.h>
 #include <linux/cpu.h>
 #include <linux/sched.h>
+#include <linux/hypervisor.h>
 
 #include "smpboot.h"
 
index 1760bf3d14636266eae1f81aa84f277076c4335d..3ccee2bd13ba8767889e8c0882df0d2677b426cd 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/kernel.h>
 #include <linux/export.h>
 #include <linux/smp.h>
+#include <linux/hypervisor.h>
 
 int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
                                int wait)