1 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2 From: Juergen Gross <jgross@suse.com>
3 Date: Thu, 9 Nov 2017 14:27:36 +0100
4 Subject: [PATCH] x86/virt: Add enum for hypervisors to replace x86_hyper
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
11 The x86_hyper pointer is only used for checking whether a virtual
12 device is supporting the hypervisor the system is running on.
14 Use an enum for that purpose instead and drop the x86_hyper pointer.
16 Signed-off-by: Juergen Gross <jgross@suse.com>
17 Acked-by: Thomas Gleixner <tglx@linutronix.de>
18 Acked-by: Xavier Deguillard <xdeguillard@vmware.com>
19 Cc: Linus Torvalds <torvalds@linux-foundation.org>
20 Cc: Peter Zijlstra <peterz@infradead.org>
21 Cc: akataria@vmware.com
23 Cc: boris.ostrovsky@oracle.com
24 Cc: devel@linuxdriverproject.org
25 Cc: dmitry.torokhov@gmail.com
26 Cc: gregkh@linuxfoundation.org
27 Cc: haiyangz@microsoft.com
28 Cc: kvm@vger.kernel.org
30 Cc: linux-graphics-maintainer@vmware.com
31 Cc: linux-input@vger.kernel.org
32 Cc: moltmann@vmware.com
33 Cc: pbonzini@redhat.com
34 Cc: pv-drivers@vmware.com
35 Cc: rkrcmar@redhat.com
36 Cc: sthemmin@microsoft.com
37 Cc: virtualization@lists.linux-foundation.org
38 Cc: xen-devel@lists.xenproject.org
39 Link: http://lkml.kernel.org/r/20171109132739.23465-3-jgross@suse.com
40 Signed-off-by: Ingo Molnar <mingo@kernel.org>
41 (backported from commit 03b2a320b19f1424e9ac9c21696be9c60b6d0d93)
42 Signed-off-by: Andy Whitcroft <apw@canonical.com>
43 Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
44 (cherry picked from commit c24b0a226fadfe1abe78fa568ff84fea6ecd7ca5)
45 Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
47 arch/x86/include/asm/hypervisor.h | 23 ++++++++++++++---------
48 arch/x86/hyperv/hv_init.c | 2 +-
49 arch/x86/kernel/cpu/hypervisor.c | 12 +++++++++---
50 arch/x86/kernel/cpu/mshyperv.c | 6 +++---
51 arch/x86/kernel/cpu/vmware.c | 4 ++--
52 arch/x86/kernel/kvm.c | 4 ++--
53 arch/x86/xen/enlighten_hvm.c | 4 ++--
54 arch/x86/xen/enlighten_pv.c | 4 ++--
55 drivers/hv/vmbus_drv.c | 2 +-
56 drivers/input/mouse/vmmouse.c | 10 ++++------
57 drivers/misc/vmw_balloon.c | 2 +-
58 11 files changed, 41 insertions(+), 32 deletions(-)
60 diff --git a/arch/x86/include/asm/hypervisor.h b/arch/x86/include/asm/hypervisor.h
61 index 0eca7239a7aa..1b0a5abcd8ae 100644
62 --- a/arch/x86/include/asm/hypervisor.h
63 +++ b/arch/x86/include/asm/hypervisor.h
66 * x86 hypervisor information
69 +enum x86_hypervisor_type {
70 + X86_HYPER_NATIVE = 0,
72 + X86_HYPER_MS_HYPERV,
78 struct hypervisor_x86 {
81 @@ -36,6 +46,9 @@ struct hypervisor_x86 {
82 /* Detection routine */
83 uint32_t (*detect)(void);
85 + /* Hypervisor type */
86 + enum x86_hypervisor_type type;
88 /* init time callbacks */
89 struct x86_hyper_init init;
91 @@ -43,15 +56,7 @@ struct hypervisor_x86 {
92 struct x86_hyper_runtime runtime;
95 -extern const struct hypervisor_x86 *x86_hyper;
97 -/* Recognized hypervisors */
98 -extern const struct hypervisor_x86 x86_hyper_vmware;
99 -extern const struct hypervisor_x86 x86_hyper_ms_hyperv;
100 -extern const struct hypervisor_x86 x86_hyper_xen_pv;
101 -extern const struct hypervisor_x86 x86_hyper_xen_hvm;
102 -extern const struct hypervisor_x86 x86_hyper_kvm;
104 +extern enum x86_hypervisor_type x86_hyper_type;
105 extern void init_hypervisor_platform(void);
107 static inline void init_hypervisor_platform(void) { }
108 diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
109 index ec7c9661743f..32fa894139d5 100644
110 --- a/arch/x86/hyperv/hv_init.c
111 +++ b/arch/x86/hyperv/hv_init.c
112 @@ -99,7 +99,7 @@ void hyperv_init(void)
114 union hv_x64_msr_hypercall_contents hypercall_msr;
116 - if (x86_hyper != &x86_hyper_ms_hyperv)
117 + if (x86_hyper_type != X86_HYPER_MS_HYPERV)
121 diff --git a/arch/x86/kernel/cpu/hypervisor.c b/arch/x86/kernel/cpu/hypervisor.c
122 index 22226c1bf092..bea8d3e24f50 100644
123 --- a/arch/x86/kernel/cpu/hypervisor.c
124 +++ b/arch/x86/kernel/cpu/hypervisor.c
126 #include <asm/processor.h>
127 #include <asm/hypervisor.h>
129 +extern const struct hypervisor_x86 x86_hyper_vmware;
130 +extern const struct hypervisor_x86 x86_hyper_ms_hyperv;
131 +extern const struct hypervisor_x86 x86_hyper_xen_pv;
132 +extern const struct hypervisor_x86 x86_hyper_xen_hvm;
133 +extern const struct hypervisor_x86 x86_hyper_kvm;
135 static const __initconst struct hypervisor_x86 * const hypervisors[] =
138 @@ -41,8 +47,8 @@ static const __initconst struct hypervisor_x86 * const hypervisors[] =
142 -const struct hypervisor_x86 *x86_hyper;
143 -EXPORT_SYMBOL(x86_hyper);
144 +enum x86_hypervisor_type x86_hyper_type;
145 +EXPORT_SYMBOL(x86_hyper_type);
147 static inline const struct hypervisor_x86 * __init
148 detect_hypervisor_vendor(void)
149 @@ -87,6 +93,6 @@ void __init init_hypervisor_platform(void)
150 copy_array(&h->init, &x86_init.hyper, sizeof(h->init));
151 copy_array(&h->runtime, &x86_platform.hyper, sizeof(h->runtime));
154 + x86_hyper_type = h->type;
155 x86_init.hyper.init_platform();
157 diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
158 index 9707e431da27..3672f1192119 100644
159 --- a/arch/x86/kernel/cpu/mshyperv.c
160 +++ b/arch/x86/kernel/cpu/mshyperv.c
161 @@ -252,9 +252,9 @@ static void __init ms_hyperv_init_platform(void)
165 -const __refconst struct hypervisor_x86 x86_hyper_ms_hyperv = {
166 - .name = "Microsoft HyperV",
167 +const __initconst struct hypervisor_x86 x86_hyper_ms_hyperv = {
168 + .name = "Microsoft Hyper-V",
169 .detect = ms_hyperv_platform,
170 + .type = X86_HYPER_MS_HYPERV,
171 .init.init_platform = ms_hyperv_init_platform,
173 -EXPORT_SYMBOL(x86_hyper_ms_hyperv);
174 diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c
175 index 4804c1d063c8..8e005329648b 100644
176 --- a/arch/x86/kernel/cpu/vmware.c
177 +++ b/arch/x86/kernel/cpu/vmware.c
178 @@ -205,10 +205,10 @@ static bool __init vmware_legacy_x2apic_available(void)
179 (eax & (1 << VMWARE_PORT_CMD_LEGACY_X2APIC)) != 0;
182 -const __refconst struct hypervisor_x86 x86_hyper_vmware = {
183 +const __initconst struct hypervisor_x86 x86_hyper_vmware = {
185 .detect = vmware_platform,
186 + .type = X86_HYPER_VMWARE,
187 .init.init_platform = vmware_platform_setup,
188 .init.x2apic_available = vmware_legacy_x2apic_available,
190 -EXPORT_SYMBOL(x86_hyper_vmware);
191 diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
192 index 54e373bfeab9..b65a51a24647 100644
193 --- a/arch/x86/kernel/kvm.c
194 +++ b/arch/x86/kernel/kvm.c
195 @@ -544,12 +544,12 @@ static uint32_t __init kvm_detect(void)
196 return kvm_cpuid_base();
199 -const struct hypervisor_x86 x86_hyper_kvm __refconst = {
200 +const __initconst struct hypervisor_x86 x86_hyper_kvm = {
202 .detect = kvm_detect,
203 + .type = X86_HYPER_KVM,
204 .init.x2apic_available = kvm_para_available,
206 -EXPORT_SYMBOL_GPL(x86_hyper_kvm);
208 static __init int activate_jump_labels(void)
210 diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c
211 index 7b1622089f96..754d5391d9fa 100644
212 --- a/arch/x86/xen/enlighten_hvm.c
213 +++ b/arch/x86/xen/enlighten_hvm.c
214 @@ -226,12 +226,12 @@ static uint32_t __init xen_platform_hvm(void)
215 return xen_cpuid_base();
218 -const struct hypervisor_x86 x86_hyper_xen_hvm = {
219 +const __initconst struct hypervisor_x86 x86_hyper_xen_hvm = {
221 .detect = xen_platform_hvm,
222 + .type = X86_HYPER_XEN_HVM,
223 .init.init_platform = xen_hvm_guest_init,
224 .init.x2apic_available = xen_x2apic_para_available,
225 .init.init_mem_mapping = xen_hvm_init_mem_mapping,
226 .runtime.pin_vcpu = xen_pin_vcpu,
228 -EXPORT_SYMBOL(x86_hyper_xen_hvm);
229 diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
230 index 4110fc9e5ee9..63c81154083b 100644
231 --- a/arch/x86/xen/enlighten_pv.c
232 +++ b/arch/x86/xen/enlighten_pv.c
233 @@ -1458,9 +1458,9 @@ static uint32_t __init xen_platform_pv(void)
237 -const struct hypervisor_x86 x86_hyper_xen_pv = {
238 +const __initconst struct hypervisor_x86 x86_hyper_xen_pv = {
240 .detect = xen_platform_pv,
241 + .type = X86_HYPER_XEN_PV,
242 .runtime.pin_vcpu = xen_pin_vcpu,
244 -EXPORT_SYMBOL(x86_hyper_xen_pv);
245 diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
246 index 5ad627044dd1..8aca7613e482 100644
247 --- a/drivers/hv/vmbus_drv.c
248 +++ b/drivers/hv/vmbus_drv.c
249 @@ -1551,7 +1551,7 @@ static int __init hv_acpi_init(void)
253 - if (x86_hyper != &x86_hyper_ms_hyperv)
254 + if (x86_hyper_type != X86_HYPER_MS_HYPERV)
257 init_completion(&probe_event);
258 diff --git a/drivers/input/mouse/vmmouse.c b/drivers/input/mouse/vmmouse.c
259 index 0f586780ceb4..1ae5c1ef3f5b 100644
260 --- a/drivers/input/mouse/vmmouse.c
261 +++ b/drivers/input/mouse/vmmouse.c
262 @@ -316,11 +316,9 @@ static int vmmouse_enable(struct psmouse *psmouse)
264 * Array of supported hypervisors.
266 -static const struct hypervisor_x86 *vmmouse_supported_hypervisors[] = {
268 -#ifdef CONFIG_KVM_GUEST
271 +static enum x86_hypervisor_type vmmouse_supported_hypervisors[] = {
277 @@ -331,7 +329,7 @@ static bool vmmouse_check_hypervisor(void)
280 for (i = 0; i < ARRAY_SIZE(vmmouse_supported_hypervisors); i++)
281 - if (vmmouse_supported_hypervisors[i] == x86_hyper)
282 + if (vmmouse_supported_hypervisors[i] == x86_hyper_type)
286 diff --git a/drivers/misc/vmw_balloon.c b/drivers/misc/vmw_balloon.c
287 index 1e688bfec567..9047c0a529b2 100644
288 --- a/drivers/misc/vmw_balloon.c
289 +++ b/drivers/misc/vmw_balloon.c
290 @@ -1271,7 +1271,7 @@ static int __init vmballoon_init(void)
291 * Check if we are running on VMware's hypervisor and bail out
294 - if (x86_hyper != &x86_hyper_vmware)
295 + if (x86_hyper_type != X86_HYPER_VMWARE)
298 for (is_2m_pages = 0; is_2m_pages < VMW_BALLOON_NUM_PAGE_SIZES;