Juergen Gross
2017-Nov-09 13:27 UTC
[PATCH v2 0/5] x86/xen: support booting PVH guest via standard boot path
Booting a Xen PVH guest requires a special boot entry as it is mandatory to setup some Xen-specific interfaces rather early. When grub or OVMF are used as boot loaders, however, those will fill the boot parameters in zeropage and there is no longer a need to do something PVH specific in the early boot path. This patch series adds support for that scenario by identifying PVH environment and doing the required init steps via Xen hooks instead of using a dedicated boot entry. The dedicated entry is still mandatory for support of Dom0 running in PVH mode as in this case there is no grub or OVMF involved for filling in the boot parameters. Changes in V2: - added new patches 1 and 2 Cc: kys at microsoft.com Cc: haiyangz at microsoft.com Cc: sthemmin at microsoft.com Cc: akataria at vmware.com Cc: pbonzini at redhat.com Cc: rkrcmar at redhat.com Cc: boris.ostrovsky at oracle.com Cc: rusty at rustcorp.com.au Cc: devel at linuxdriverproject.org Cc: virtualization at lists.linux-foundation.org Cc: kvm at vger.kernel.org Cc: xen-devel at lists.xenproject.org Cc: linux-graphics-maintainer at vmware.com Cc: pv-drivers at vmware.com Cc: dmitry.torokhov at gmail.com Cc: xdeguillard at vmware.com Cc: moltmann at vmware.com Cc: arnd at arndb.de Cc: gregkh at linuxfoundation.org Cc: linux-input at vger.kernel.org Cc: rjw at rjwysocki.net Cc: len.brown at intel.com Cc: pavel at ucw.cz Cc: linux-pm at vger.kernel.org Juergen Gross (5): x86: merge x86_hyper into x86_platform and x86_init x86: add enum for hypervisors to replace x86_hyper x86/acpi: add test for ACPI_FADT_NO_VGA x86: add guest_late_init hook to hypervisor_x86 structure x86/xen: use guest_late_init to detect Xen PVH guest arch/x86/hyperv/hv_init.c | 2 +- arch/x86/include/asm/hypervisor.h | 46 +++++++++++----------------- arch/x86/include/asm/kvm_para.h | 2 -- arch/x86/include/asm/x86_init.h | 27 +++++++++++++++++ arch/x86/kernel/acpi/boot.c | 5 +++ arch/x86/kernel/apic/apic.c | 2 +- arch/x86/kernel/cpu/hypervisor.c | 64 +++++++++++++++++++++------------------ arch/x86/kernel/cpu/mshyperv.c | 6 ++-- arch/x86/kernel/cpu/vmware.c | 8 ++--- arch/x86/kernel/kvm.c | 9 +++--- arch/x86/kernel/setup.c | 2 +- arch/x86/kernel/x86_init.c | 10 ++++++ arch/x86/mm/init.c | 2 +- arch/x86/xen/enlighten_hvm.c | 36 +++++++++++++++++----- arch/x86/xen/enlighten_pv.c | 6 ++-- arch/x86/xen/enlighten_pvh.c | 9 ------ drivers/hv/vmbus_drv.c | 2 +- drivers/input/mouse/vmmouse.c | 10 +++--- drivers/misc/vmw_balloon.c | 2 +- include/linux/hypervisor.h | 8 +++-- 20 files changed, 153 insertions(+), 105 deletions(-) -- 2.12.3
Juergen Gross
2017-Nov-09 13:27 UTC
[PATCH v2 1/5] x86: merge x86_hyper into x86_platform and x86_init
Instead of x86_hyper being either NULL on bare metal or a pointer to a struct hypervisor_x86 in case of the kernel running as a guest merge the struct into x86_platform and x86_init. This will remove the need for wrappers making it hard to find out what is being called. With dummy functions added for all callbacks testing for a NULL function pointer can be removed, too. Cc: kys at microsoft.com Cc: haiyangz at microsoft.com Cc: sthemmin at microsoft.com Cc: akataria at vmware.com Cc: pbonzini at redhat.com Cc: rkrcmar at redhat.com Cc: boris.ostrovsky at oracle.com Cc: rusty at rustcorp.com.au Cc: devel at linuxdriverproject.org Cc: virtualization at lists.linux-foundation.org Cc: kvm at vger.kernel.org Cc: xen-devel at lists.xenproject.org Suggested-by: Ingo Molnar <mingo at kernel.org> Signed-off-by: Juergen Gross <jgross at suse.com> --- arch/x86/include/asm/hypervisor.h | 25 ++++-------------- arch/x86/include/asm/x86_init.h | 24 +++++++++++++++++ arch/x86/kernel/apic/apic.c | 2 +- arch/x86/kernel/cpu/hypervisor.c | 54 +++++++++++++++++++-------------------- arch/x86/kernel/cpu/mshyperv.c | 2 +- arch/x86/kernel/cpu/vmware.c | 4 +-- arch/x86/kernel/kvm.c | 2 +- arch/x86/kernel/x86_init.c | 9 +++++++ arch/x86/mm/init.c | 2 +- arch/x86/xen/enlighten_hvm.c | 8 +++--- arch/x86/xen/enlighten_pv.c | 2 +- include/linux/hypervisor.h | 8 ++++-- 12 files changed, 81 insertions(+), 61 deletions(-) diff --git a/arch/x86/include/asm/hypervisor.h b/arch/x86/include/asm/hypervisor.h index 0ead9dbb9130..0eca7239a7aa 100644 --- a/arch/x86/include/asm/hypervisor.h +++ b/arch/x86/include/asm/hypervisor.h @@ -23,6 +23,7 @@ #ifdef CONFIG_HYPERVISOR_GUEST #include <asm/kvm_para.h> +#include <asm/x86_init.h> #include <asm/xen/hypervisor.h> /* @@ -35,17 +36,11 @@ struct hypervisor_x86 { /* Detection routine */ uint32_t (*detect)(void); - /* Platform setup (run once per boot) */ - void (*init_platform)(void); + /* init time callbacks */ + struct x86_hyper_init init; - /* X2APIC detection (run once per boot) */ - bool (*x2apic_available)(void); - - /* pin current vcpu to specified physical cpu (run rarely) */ - void (*pin_vcpu)(int); - - /* called during init_mem_mapping() to setup early mappings. */ - void (*init_mem_mapping)(void); + /* runtime callbacks */ + struct x86_hyper_runtime runtime; }; extern const struct hypervisor_x86 *x86_hyper; @@ -58,17 +53,7 @@ extern const struct hypervisor_x86 x86_hyper_xen_hvm; extern const struct hypervisor_x86 x86_hyper_kvm; extern void init_hypervisor_platform(void); -extern bool hypervisor_x2apic_available(void); -extern void hypervisor_pin_vcpu(int cpu); - -static inline void hypervisor_init_mem_mapping(void) -{ - if (x86_hyper && x86_hyper->init_mem_mapping) - x86_hyper->init_mem_mapping(); -} #else static inline void init_hypervisor_platform(void) { } -static inline bool hypervisor_x2apic_available(void) { return false; } -static inline void hypervisor_init_mem_mapping(void) { } #endif /* CONFIG_HYPERVISOR_GUEST */ #endif /* _ASM_X86_HYPERVISOR_H */ diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h index 8a1ebf9540dd..ad15a0fda917 100644 --- a/arch/x86/include/asm/x86_init.h +++ b/arch/x86/include/asm/x86_init.h @@ -115,6 +115,18 @@ struct x86_init_pci { }; /** + * struct x86_hyper_init - x86 hypervisor init functions + * @init_platform: platform setup + * @x2apic_available: X2APIC detection + * @init_mem_mapping: setup early mappings during init_mem_mapping() + */ +struct x86_hyper_init { + void (*init_platform)(void); + bool (*x2apic_available)(void); + void (*init_mem_mapping)(void); +}; + +/** * struct x86_init_ops - functions for platform specific setup * */ @@ -127,6 +139,7 @@ struct x86_init_ops { struct x86_init_timers timers; struct x86_init_iommu iommu; struct x86_init_pci pci; + struct x86_hyper_init hyper; }; /** @@ -200,6 +213,15 @@ struct x86_legacy_features { }; /** + * struct x86_hyper_runtime - x86 hypervisor specific runtime callbacks + * + * @pin_vcpu: pin current vcpu to specified physical cpu (run rarely) + */ +struct x86_hyper_runtime { + void (*pin_vcpu)(int cpu); +}; + +/** * struct x86_platform_ops - platform specific runtime functions * @calibrate_cpu: calibrate CPU * @calibrate_tsc: calibrate TSC, if different from CPU @@ -218,6 +240,7 @@ struct x86_legacy_features { * possible in x86_early_init_platform_quirks() by * only using the current x86_hardware_subarch * semantics. + * @hyper: x86 hypervisor specific runtime callbacks */ struct x86_platform_ops { unsigned long (*calibrate_cpu)(void); @@ -233,6 +256,7 @@ struct x86_platform_ops { void (*apic_post_init)(void); struct x86_legacy_features legacy; void (*set_legacy_features)(void); + struct x86_hyper_runtime hyper; }; struct pci_dev; diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index ff891772c9f8..89c7c8569e5e 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c @@ -1645,7 +1645,7 @@ static __init void try_to_enable_x2apic(int remap_mode) * under KVM */ if (max_physical_apicid > 255 || - !hypervisor_x2apic_available()) { + !x86_init.hyper.x2apic_available()) { pr_info("x2apic: IRQ remapping doesn't support X2APIC mode\n"); x2apic_disable(); return; diff --git a/arch/x86/kernel/cpu/hypervisor.c b/arch/x86/kernel/cpu/hypervisor.c index 4fa90006ac68..22226c1bf092 100644 --- a/arch/x86/kernel/cpu/hypervisor.c +++ b/arch/x86/kernel/cpu/hypervisor.c @@ -44,51 +44,49 @@ static const __initconst struct hypervisor_x86 * const hypervisors[] const struct hypervisor_x86 *x86_hyper; EXPORT_SYMBOL(x86_hyper); -static inline void __init +static inline const struct hypervisor_x86 * __init detect_hypervisor_vendor(void) { - const struct hypervisor_x86 *h, * const *p; + const struct hypervisor_x86 *h = NULL, * const *p; uint32_t pri, max_pri = 0; for (p = hypervisors; p < hypervisors + ARRAY_SIZE(hypervisors); p++) { - h = *p; - pri = h->detect(); - if (pri != 0 && pri > max_pri) { + pri = (*p)->detect(); + if (pri > max_pri) { max_pri = pri; - x86_hyper = h; + h = *p; } } - if (max_pri) - pr_info("Hypervisor detected: %s\n", x86_hyper->name); + if (h) + pr_info("Hypervisor detected: %s\n", h->name); + + return h; } -void __init init_hypervisor_platform(void) +static void __init copy_array(const void *src, void *target, unsigned int size) { + unsigned int i, n = size / sizeof(void *); + const void * const *from = (const void * const *)src; + const void **to = (const void **)target; - detect_hypervisor_vendor(); - - if (!x86_hyper) - return; - - if (x86_hyper->init_platform) - x86_hyper->init_platform(); + for (i = 0; i < n; i++) + if (from[i]) + to[i] = from[i]; } -bool __init hypervisor_x2apic_available(void) +void __init init_hypervisor_platform(void) { - return x86_hyper && - x86_hyper->x2apic_available && - x86_hyper->x2apic_available(); -} + const struct hypervisor_x86 *h; -void hypervisor_pin_vcpu(int cpu) -{ - if (!x86_hyper) + h = detect_hypervisor_vendor(); + + if (!h) return; - if (x86_hyper->pin_vcpu) - x86_hyper->pin_vcpu(cpu); - else - WARN_ONCE(1, "vcpu pinning requested but not supported!\n"); + copy_array(&h->init, &x86_init.hyper, sizeof(h->init)); + copy_array(&h->runtime, &x86_platform.hyper, sizeof(h->runtime)); + + x86_hyper = h; + x86_init.hyper.init_platform(); } diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c index 236324e83a3a..6bb84d655e4b 100644 --- a/arch/x86/kernel/cpu/mshyperv.c +++ b/arch/x86/kernel/cpu/mshyperv.c @@ -257,6 +257,6 @@ static void __init ms_hyperv_init_platform(void) const __refconst struct hypervisor_x86 x86_hyper_ms_hyperv = { .name = "Microsoft Hyper-V", .detect = ms_hyperv_platform, - .init_platform = ms_hyperv_init_platform, + .init.init_platform = ms_hyperv_init_platform, }; EXPORT_SYMBOL(x86_hyper_ms_hyperv); diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c index 40ed26852ebd..4804c1d063c8 100644 --- a/arch/x86/kernel/cpu/vmware.c +++ b/arch/x86/kernel/cpu/vmware.c @@ -208,7 +208,7 @@ static bool __init vmware_legacy_x2apic_available(void) const __refconst struct hypervisor_x86 x86_hyper_vmware = { .name = "VMware", .detect = vmware_platform, - .init_platform = vmware_platform_setup, - .x2apic_available = vmware_legacy_x2apic_available, + .init.init_platform = vmware_platform_setup, + .init.x2apic_available = vmware_legacy_x2apic_available, }; EXPORT_SYMBOL(x86_hyper_vmware); diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 8bb9594d0761..9dca8437c795 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -547,7 +547,7 @@ static uint32_t __init kvm_detect(void) const struct hypervisor_x86 x86_hyper_kvm __refconst = { .name = "KVM", .detect = kvm_detect, - .x2apic_available = kvm_para_available, + .init.x2apic_available = kvm_para_available, }; EXPORT_SYMBOL_GPL(x86_hyper_kvm); diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c index a088b2c47f73..5b2d10c1973a 100644 --- a/arch/x86/kernel/x86_init.c +++ b/arch/x86/kernel/x86_init.c @@ -28,6 +28,8 @@ void x86_init_noop(void) { } void __init x86_init_uint_noop(unsigned int unused) { } int __init iommu_init_noop(void) { return 0; } void iommu_shutdown_noop(void) { } +bool __init bool_x86_init_noop(void) { return false; } +void x86_op_int_noop(int cpu) { } /* * The platform setup functions are preset with the default functions @@ -81,6 +83,12 @@ struct x86_init_ops x86_init __initdata = { .init_irq = x86_default_pci_init_irq, .fixup_irqs = x86_default_pci_fixup_irqs, }, + + .hyper = { + .init_platform = x86_init_noop, + .x2apic_available = bool_x86_init_noop, + .init_mem_mapping = x86_init_noop, + }, }; struct x86_cpuinit_ops x86_cpuinit = { @@ -101,6 +109,7 @@ struct x86_platform_ops x86_platform __ro_after_init = { .get_nmi_reason = default_get_nmi_reason, .save_sched_clock_state = tsc_save_sched_clock_state, .restore_sched_clock_state = tsc_restore_sched_clock_state, + .hyper.pin_vcpu = x86_op_int_noop, }; EXPORT_SYMBOL_GPL(x86_platform); diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c index af5c1ed21d43..a22c2b95e513 100644 --- a/arch/x86/mm/init.c +++ b/arch/x86/mm/init.c @@ -671,7 +671,7 @@ void __init init_mem_mapping(void) load_cr3(swapper_pg_dir); __flush_tlb_all(); - hypervisor_init_mem_mapping(); + x86_init.hyper.init_mem_mapping(); early_memtest(0, max_pfn_mapped << PAGE_SHIFT); } diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c index de503c225ae1..7b1622089f96 100644 --- a/arch/x86/xen/enlighten_hvm.c +++ b/arch/x86/xen/enlighten_hvm.c @@ -229,9 +229,9 @@ static uint32_t __init xen_platform_hvm(void) const struct hypervisor_x86 x86_hyper_xen_hvm = { .name = "Xen HVM", .detect = xen_platform_hvm, - .init_platform = xen_hvm_guest_init, - .pin_vcpu = xen_pin_vcpu, - .x2apic_available = xen_x2apic_para_available, - .init_mem_mapping = xen_hvm_init_mem_mapping, + .init.init_platform = xen_hvm_guest_init, + .init.x2apic_available = xen_x2apic_para_available, + .init.init_mem_mapping = xen_hvm_init_mem_mapping, + .runtime.pin_vcpu = xen_pin_vcpu, }; EXPORT_SYMBOL(x86_hyper_xen_hvm); diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c index d4396e27b1fb..69d1a7054ddb 100644 --- a/arch/x86/xen/enlighten_pv.c +++ b/arch/x86/xen/enlighten_pv.c @@ -1463,6 +1463,6 @@ static uint32_t __init xen_platform_pv(void) const struct hypervisor_x86 x86_hyper_xen_pv = { .name = "Xen PV", .detect = xen_platform_pv, - .pin_vcpu = xen_pin_vcpu, + .runtime.pin_vcpu = xen_pin_vcpu, }; EXPORT_SYMBOL(x86_hyper_xen_pv); diff --git a/include/linux/hypervisor.h b/include/linux/hypervisor.h index b4054fd5b6f6..b19563f9a8eb 100644 --- a/include/linux/hypervisor.h +++ b/include/linux/hypervisor.h @@ -7,8 +7,12 @@ * Juergen Gross <jgross at suse.com> */ -#ifdef CONFIG_HYPERVISOR_GUEST -#include <asm/hypervisor.h> +#ifdef CONFIG_X86 +#include <asm/x86_init.h> +static inline void hypervisor_pin_vcpu(int cpu) +{ + x86_platform.hyper.pin_vcpu(cpu); +} #else static inline void hypervisor_pin_vcpu(int cpu) { -- 2.12.3
Juergen Gross
2017-Nov-09 13:27 UTC
[PATCH v2 2/5] x86: add enum for hypervisors to replace x86_hyper
The x86_hyper pointer is only used for checking whether a virtual device is supporting the hypervisor the system is running on. Use an enum for that purpose instead and drop the x86_hyper pointer. Cc: kys at microsoft.com Cc: haiyangz at microsoft.com Cc: sthemmin at microsoft.com Cc: akataria at vmware.com Cc: pbonzini at redhat.com Cc: rkrcmar at redhat.com Cc: boris.ostrovsky at oracle.com Cc: devel at linuxdriverproject.org Cc: virtualization at lists.linux-foundation.org Cc: kvm at vger.kernel.org Cc: xen-devel at lists.xenproject.org Cc: linux-graphics-maintainer at vmware.com Cc: pv-drivers at vmware.com Cc: dmitry.torokhov at gmail.com Cc: xdeguillard at vmware.com Cc: moltmann at vmware.com Cc: arnd at arndb.de Cc: gregkh at linuxfoundation.org Cc: linux-input at vger.kernel.org Signed-off-by: Juergen Gross <jgross at suse.com> --- arch/x86/hyperv/hv_init.c | 2 +- arch/x86/include/asm/hypervisor.h | 23 ++++++++++++++--------- arch/x86/kernel/cpu/hypervisor.c | 12 +++++++++--- arch/x86/kernel/cpu/mshyperv.c | 4 ++-- arch/x86/kernel/cpu/vmware.c | 4 ++-- arch/x86/kernel/kvm.c | 4 ++-- arch/x86/xen/enlighten_hvm.c | 4 ++-- arch/x86/xen/enlighten_pv.c | 4 ++-- drivers/hv/vmbus_drv.c | 2 +- drivers/input/mouse/vmmouse.c | 10 ++++------ drivers/misc/vmw_balloon.c | 2 +- 11 files changed, 40 insertions(+), 31 deletions(-) diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c index a5db63f728a2..a0b86cf486e0 100644 --- a/arch/x86/hyperv/hv_init.c +++ b/arch/x86/hyperv/hv_init.c @@ -113,7 +113,7 @@ void hyperv_init(void) u64 guest_id; union hv_x64_msr_hypercall_contents hypercall_msr; - if (x86_hyper != &x86_hyper_ms_hyperv) + if (x86_hyper_type != X86_HYPER_MS_HYPERV) return; /* Allocate percpu VP index */ diff --git a/arch/x86/include/asm/hypervisor.h b/arch/x86/include/asm/hypervisor.h index 0eca7239a7aa..1b0a5abcd8ae 100644 --- a/arch/x86/include/asm/hypervisor.h +++ b/arch/x86/include/asm/hypervisor.h @@ -29,6 +29,16 @@ /* * x86 hypervisor information */ + +enum x86_hypervisor_type { + X86_HYPER_NATIVE = 0, + X86_HYPER_VMWARE, + X86_HYPER_MS_HYPERV, + X86_HYPER_XEN_PV, + X86_HYPER_XEN_HVM, + X86_HYPER_KVM, +}; + struct hypervisor_x86 { /* Hypervisor name */ const char *name; @@ -36,6 +46,9 @@ struct hypervisor_x86 { /* Detection routine */ uint32_t (*detect)(void); + /* Hypervisor type */ + enum x86_hypervisor_type type; + /* init time callbacks */ struct x86_hyper_init init; @@ -43,15 +56,7 @@ struct hypervisor_x86 { struct x86_hyper_runtime runtime; }; -extern const struct hypervisor_x86 *x86_hyper; - -/* Recognized hypervisors */ -extern const struct hypervisor_x86 x86_hyper_vmware; -extern const struct hypervisor_x86 x86_hyper_ms_hyperv; -extern const struct hypervisor_x86 x86_hyper_xen_pv; -extern const struct hypervisor_x86 x86_hyper_xen_hvm; -extern const struct hypervisor_x86 x86_hyper_kvm; - +extern enum x86_hypervisor_type x86_hyper_type; extern void init_hypervisor_platform(void); #else static inline void init_hypervisor_platform(void) { } diff --git a/arch/x86/kernel/cpu/hypervisor.c b/arch/x86/kernel/cpu/hypervisor.c index 22226c1bf092..bea8d3e24f50 100644 --- a/arch/x86/kernel/cpu/hypervisor.c +++ b/arch/x86/kernel/cpu/hypervisor.c @@ -26,6 +26,12 @@ #include <asm/processor.h> #include <asm/hypervisor.h> +extern const struct hypervisor_x86 x86_hyper_vmware; +extern const struct hypervisor_x86 x86_hyper_ms_hyperv; +extern const struct hypervisor_x86 x86_hyper_xen_pv; +extern const struct hypervisor_x86 x86_hyper_xen_hvm; +extern const struct hypervisor_x86 x86_hyper_kvm; + static const __initconst struct hypervisor_x86 * const hypervisors[] { #ifdef CONFIG_XEN_PV @@ -41,8 +47,8 @@ static const __initconst struct hypervisor_x86 * const hypervisors[] #endif }; -const struct hypervisor_x86 *x86_hyper; -EXPORT_SYMBOL(x86_hyper); +enum x86_hypervisor_type x86_hyper_type; +EXPORT_SYMBOL(x86_hyper_type); static inline const struct hypervisor_x86 * __init detect_hypervisor_vendor(void) @@ -87,6 +93,6 @@ void __init init_hypervisor_platform(void) copy_array(&h->init, &x86_init.hyper, sizeof(h->init)); copy_array(&h->runtime, &x86_platform.hyper, sizeof(h->runtime)); - x86_hyper = h; + x86_hyper_type = h->type; x86_init.hyper.init_platform(); } diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c index 6bb84d655e4b..85eb5fc180c8 100644 --- a/arch/x86/kernel/cpu/mshyperv.c +++ b/arch/x86/kernel/cpu/mshyperv.c @@ -254,9 +254,9 @@ static void __init ms_hyperv_init_platform(void) #endif } -const __refconst struct hypervisor_x86 x86_hyper_ms_hyperv = { +const __initconst struct hypervisor_x86 x86_hyper_ms_hyperv = { .name = "Microsoft Hyper-V", .detect = ms_hyperv_platform, + .type = X86_HYPER_MS_HYPERV, .init.init_platform = ms_hyperv_init_platform, }; -EXPORT_SYMBOL(x86_hyper_ms_hyperv); diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c index 4804c1d063c8..8e005329648b 100644 --- a/arch/x86/kernel/cpu/vmware.c +++ b/arch/x86/kernel/cpu/vmware.c @@ -205,10 +205,10 @@ static bool __init vmware_legacy_x2apic_available(void) (eax & (1 << VMWARE_PORT_CMD_LEGACY_X2APIC)) != 0; } -const __refconst struct hypervisor_x86 x86_hyper_vmware = { +const __initconst struct hypervisor_x86 x86_hyper_vmware = { .name = "VMware", .detect = vmware_platform, + .type = X86_HYPER_VMWARE, .init.init_platform = vmware_platform_setup, .init.x2apic_available = vmware_legacy_x2apic_available, }; -EXPORT_SYMBOL(x86_hyper_vmware); diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 9dca8437c795..a94de09edbed 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -544,12 +544,12 @@ static uint32_t __init kvm_detect(void) return kvm_cpuid_base(); } -const struct hypervisor_x86 x86_hyper_kvm __refconst = { +const __initconst struct hypervisor_x86 x86_hyper_kvm = { .name = "KVM", .detect = kvm_detect, + .type = X86_HYPER_KVM, .init.x2apic_available = kvm_para_available, }; -EXPORT_SYMBOL_GPL(x86_hyper_kvm); static __init int activate_jump_labels(void) { diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c index 7b1622089f96..754d5391d9fa 100644 --- a/arch/x86/xen/enlighten_hvm.c +++ b/arch/x86/xen/enlighten_hvm.c @@ -226,12 +226,12 @@ static uint32_t __init xen_platform_hvm(void) return xen_cpuid_base(); } -const struct hypervisor_x86 x86_hyper_xen_hvm = { +const __initconst struct hypervisor_x86 x86_hyper_xen_hvm = { .name = "Xen HVM", .detect = xen_platform_hvm, + .type = X86_HYPER_XEN_HVM, .init.init_platform = xen_hvm_guest_init, .init.x2apic_available = xen_x2apic_para_available, .init.init_mem_mapping = xen_hvm_init_mem_mapping, .runtime.pin_vcpu = xen_pin_vcpu, }; -EXPORT_SYMBOL(x86_hyper_xen_hvm); diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c index 69d1a7054ddb..168efb2534c0 100644 --- a/arch/x86/xen/enlighten_pv.c +++ b/arch/x86/xen/enlighten_pv.c @@ -1460,9 +1460,9 @@ static uint32_t __init xen_platform_pv(void) return 0; } -const struct hypervisor_x86 x86_hyper_xen_pv = { +const __initconst struct hypervisor_x86 x86_hyper_xen_pv = { .name = "Xen PV", .detect = xen_platform_pv, + .type = X86_HYPER_XEN_PV, .runtime.pin_vcpu = xen_pin_vcpu, }; -EXPORT_SYMBOL(x86_hyper_xen_pv); diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c index 937801ac2fe0..2cd134dd94d2 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c @@ -1534,7 +1534,7 @@ static int __init hv_acpi_init(void) { int ret, t; - if (x86_hyper != &x86_hyper_ms_hyperv) + if (x86_hyper_type != X86_HYPER_MS_HYPERV) return -ENODEV; init_completion(&probe_event); diff --git a/drivers/input/mouse/vmmouse.c b/drivers/input/mouse/vmmouse.c index 0f586780ceb4..1ae5c1ef3f5b 100644 --- a/drivers/input/mouse/vmmouse.c +++ b/drivers/input/mouse/vmmouse.c @@ -316,11 +316,9 @@ static int vmmouse_enable(struct psmouse *psmouse) /* * Array of supported hypervisors. */ -static const struct hypervisor_x86 *vmmouse_supported_hypervisors[] = { - &x86_hyper_vmware, -#ifdef CONFIG_KVM_GUEST - &x86_hyper_kvm, -#endif +static enum x86_hypervisor_type vmmouse_supported_hypervisors[] = { + X86_HYPER_VMWARE, + X86_HYPER_KVM, }; /** @@ -331,7 +329,7 @@ static bool vmmouse_check_hypervisor(void) int i; for (i = 0; i < ARRAY_SIZE(vmmouse_supported_hypervisors); i++) - if (vmmouse_supported_hypervisors[i] == x86_hyper) + if (vmmouse_supported_hypervisors[i] == x86_hyper_type) return true; return false; diff --git a/drivers/misc/vmw_balloon.c b/drivers/misc/vmw_balloon.c index 1e688bfec567..9047c0a529b2 100644 --- a/drivers/misc/vmw_balloon.c +++ b/drivers/misc/vmw_balloon.c @@ -1271,7 +1271,7 @@ static int __init vmballoon_init(void) * Check if we are running on VMware's hypervisor and bail out * if we are not. */ - if (x86_hyper != &x86_hyper_vmware) + if (x86_hyper_type != X86_HYPER_VMWARE) return -ENODEV; for (is_2m_pages = 0; is_2m_pages < VMW_BALLOON_NUM_PAGE_SIZES; -- 2.12.3
Xavier Deguillard
2017-Nov-09 17:57 UTC
[PATCH v2 2/5] x86: add enum for hypervisors to replace x86_hyper
Hello Juergen, The changes to vmw_balloon.c looks good. Acked-by: Xavier Deguillard <xdeguillard at vmware.com> Xavier On Thu, Nov 09, 2017 at 02:27:36PM +0100, Juergen Gross wrote:> The x86_hyper pointer is only used for checking whether a virtual > device is supporting the hypervisor the system is running on. > > Use an enum for that purpose instead and drop the x86_hyper pointer. > > Cc: kys at microsoft.com > Cc: haiyangz at microsoft.com > Cc: sthemmin at microsoft.com > Cc: akataria at vmware.com > Cc: pbonzini at redhat.com > Cc: rkrcmar at redhat.com > Cc: boris.ostrovsky at oracle.com > Cc: devel at linuxdriverproject.org > Cc: virtualization at lists.linux-foundation.org > Cc: kvm at vger.kernel.org > Cc: xen-devel at lists.xenproject.org > Cc: linux-graphics-maintainer at vmware.com > Cc: pv-drivers at vmware.com > Cc: dmitry.torokhov at gmail.com > Cc: xdeguillard at vmware.com > Cc: moltmann at vmware.com > Cc: arnd at arndb.de > Cc: gregkh at linuxfoundation.org > Cc: linux-input at vger.kernel.org > > Signed-off-by: Juergen Gross <jgross at suse.com> > --- > arch/x86/hyperv/hv_init.c | 2 +- > arch/x86/include/asm/hypervisor.h | 23 ++++++++++++++--------- > arch/x86/kernel/cpu/hypervisor.c | 12 +++++++++--- > arch/x86/kernel/cpu/mshyperv.c | 4 ++-- > arch/x86/kernel/cpu/vmware.c | 4 ++-- > arch/x86/kernel/kvm.c | 4 ++-- > arch/x86/xen/enlighten_hvm.c | 4 ++-- > arch/x86/xen/enlighten_pv.c | 4 ++-- > drivers/hv/vmbus_drv.c | 2 +- > drivers/input/mouse/vmmouse.c | 10 ++++------ > drivers/misc/vmw_balloon.c | 2 +- > 11 files changed, 40 insertions(+), 31 deletions(-) > > diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c > index a5db63f728a2..a0b86cf486e0 100644 > --- a/arch/x86/hyperv/hv_init.c > +++ b/arch/x86/hyperv/hv_init.c > @@ -113,7 +113,7 @@ void hyperv_init(void) > u64 guest_id; > union hv_x64_msr_hypercall_contents hypercall_msr; > > - if (x86_hyper != &x86_hyper_ms_hyperv) > + if (x86_hyper_type != X86_HYPER_MS_HYPERV) > return; > > /* Allocate percpu VP index */ > diff --git a/arch/x86/include/asm/hypervisor.h b/arch/x86/include/asm/hypervisor.h > index 0eca7239a7aa..1b0a5abcd8ae 100644 > --- a/arch/x86/include/asm/hypervisor.h > +++ b/arch/x86/include/asm/hypervisor.h > @@ -29,6 +29,16 @@ > /* > * x86 hypervisor information > */ > + > +enum x86_hypervisor_type { > + X86_HYPER_NATIVE = 0, > + X86_HYPER_VMWARE, > + X86_HYPER_MS_HYPERV, > + X86_HYPER_XEN_PV, > + X86_HYPER_XEN_HVM, > + X86_HYPER_KVM, > +}; > + > struct hypervisor_x86 { > /* Hypervisor name */ > const char *name; > @@ -36,6 +46,9 @@ struct hypervisor_x86 { > /* Detection routine */ > uint32_t (*detect)(void); > > + /* Hypervisor type */ > + enum x86_hypervisor_type type; > + > /* init time callbacks */ > struct x86_hyper_init init; > > @@ -43,15 +56,7 @@ struct hypervisor_x86 { > struct x86_hyper_runtime runtime; > }; > > -extern const struct hypervisor_x86 *x86_hyper; > - > -/* Recognized hypervisors */ > -extern const struct hypervisor_x86 x86_hyper_vmware; > -extern const struct hypervisor_x86 x86_hyper_ms_hyperv; > -extern const struct hypervisor_x86 x86_hyper_xen_pv; > -extern const struct hypervisor_x86 x86_hyper_xen_hvm; > -extern const struct hypervisor_x86 x86_hyper_kvm; > - > +extern enum x86_hypervisor_type x86_hyper_type; > extern void init_hypervisor_platform(void); > #else > static inline void init_hypervisor_platform(void) { } > diff --git a/arch/x86/kernel/cpu/hypervisor.c b/arch/x86/kernel/cpu/hypervisor.c > index 22226c1bf092..bea8d3e24f50 100644 > --- a/arch/x86/kernel/cpu/hypervisor.c > +++ b/arch/x86/kernel/cpu/hypervisor.c > @@ -26,6 +26,12 @@ > #include <asm/processor.h> > #include <asm/hypervisor.h> > > +extern const struct hypervisor_x86 x86_hyper_vmware; > +extern const struct hypervisor_x86 x86_hyper_ms_hyperv; > +extern const struct hypervisor_x86 x86_hyper_xen_pv; > +extern const struct hypervisor_x86 x86_hyper_xen_hvm; > +extern const struct hypervisor_x86 x86_hyper_kvm; > + > static const __initconst struct hypervisor_x86 * const hypervisors[] > { > #ifdef CONFIG_XEN_PV > @@ -41,8 +47,8 @@ static const __initconst struct hypervisor_x86 * const hypervisors[] > #endif > }; > > -const struct hypervisor_x86 *x86_hyper; > -EXPORT_SYMBOL(x86_hyper); > +enum x86_hypervisor_type x86_hyper_type; > +EXPORT_SYMBOL(x86_hyper_type); > > static inline const struct hypervisor_x86 * __init > detect_hypervisor_vendor(void) > @@ -87,6 +93,6 @@ void __init init_hypervisor_platform(void) > copy_array(&h->init, &x86_init.hyper, sizeof(h->init)); > copy_array(&h->runtime, &x86_platform.hyper, sizeof(h->runtime)); > > - x86_hyper = h; > + x86_hyper_type = h->type; > x86_init.hyper.init_platform(); > } > diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c > index 6bb84d655e4b..85eb5fc180c8 100644 > --- a/arch/x86/kernel/cpu/mshyperv.c > +++ b/arch/x86/kernel/cpu/mshyperv.c > @@ -254,9 +254,9 @@ static void __init ms_hyperv_init_platform(void) > #endif > } > > -const __refconst struct hypervisor_x86 x86_hyper_ms_hyperv = { > +const __initconst struct hypervisor_x86 x86_hyper_ms_hyperv = { > .name = "Microsoft Hyper-V", > .detect = ms_hyperv_platform, > + .type = X86_HYPER_MS_HYPERV, > .init.init_platform = ms_hyperv_init_platform, > }; > -EXPORT_SYMBOL(x86_hyper_ms_hyperv); > diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c > index 4804c1d063c8..8e005329648b 100644 > --- a/arch/x86/kernel/cpu/vmware.c > +++ b/arch/x86/kernel/cpu/vmware.c > @@ -205,10 +205,10 @@ static bool __init vmware_legacy_x2apic_available(void) > (eax & (1 << VMWARE_PORT_CMD_LEGACY_X2APIC)) != 0; > } > > -const __refconst struct hypervisor_x86 x86_hyper_vmware = { > +const __initconst struct hypervisor_x86 x86_hyper_vmware = { > .name = "VMware", > .detect = vmware_platform, > + .type = X86_HYPER_VMWARE, > .init.init_platform = vmware_platform_setup, > .init.x2apic_available = vmware_legacy_x2apic_available, > }; > -EXPORT_SYMBOL(x86_hyper_vmware); > diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c > index 9dca8437c795..a94de09edbed 100644 > --- a/arch/x86/kernel/kvm.c > +++ b/arch/x86/kernel/kvm.c > @@ -544,12 +544,12 @@ static uint32_t __init kvm_detect(void) > return kvm_cpuid_base(); > } > > -const struct hypervisor_x86 x86_hyper_kvm __refconst = { > +const __initconst struct hypervisor_x86 x86_hyper_kvm = { > .name = "KVM", > .detect = kvm_detect, > + .type = X86_HYPER_KVM, > .init.x2apic_available = kvm_para_available, > }; > -EXPORT_SYMBOL_GPL(x86_hyper_kvm); > > static __init int activate_jump_labels(void) > { > diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c > index 7b1622089f96..754d5391d9fa 100644 > --- a/arch/x86/xen/enlighten_hvm.c > +++ b/arch/x86/xen/enlighten_hvm.c > @@ -226,12 +226,12 @@ static uint32_t __init xen_platform_hvm(void) > return xen_cpuid_base(); > } > > -const struct hypervisor_x86 x86_hyper_xen_hvm = { > +const __initconst struct hypervisor_x86 x86_hyper_xen_hvm = { > .name = "Xen HVM", > .detect = xen_platform_hvm, > + .type = X86_HYPER_XEN_HVM, > .init.init_platform = xen_hvm_guest_init, > .init.x2apic_available = xen_x2apic_para_available, > .init.init_mem_mapping = xen_hvm_init_mem_mapping, > .runtime.pin_vcpu = xen_pin_vcpu, > }; > -EXPORT_SYMBOL(x86_hyper_xen_hvm); > diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c > index 69d1a7054ddb..168efb2534c0 100644 > --- a/arch/x86/xen/enlighten_pv.c > +++ b/arch/x86/xen/enlighten_pv.c > @@ -1460,9 +1460,9 @@ static uint32_t __init xen_platform_pv(void) > return 0; > } > > -const struct hypervisor_x86 x86_hyper_xen_pv = { > +const __initconst struct hypervisor_x86 x86_hyper_xen_pv = { > .name = "Xen PV", > .detect = xen_platform_pv, > + .type = X86_HYPER_XEN_PV, > .runtime.pin_vcpu = xen_pin_vcpu, > }; > -EXPORT_SYMBOL(x86_hyper_xen_pv); > diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c > index 937801ac2fe0..2cd134dd94d2 100644 > --- a/drivers/hv/vmbus_drv.c > +++ b/drivers/hv/vmbus_drv.c > @@ -1534,7 +1534,7 @@ static int __init hv_acpi_init(void) > { > int ret, t; > > - if (x86_hyper != &x86_hyper_ms_hyperv) > + if (x86_hyper_type != X86_HYPER_MS_HYPERV) > return -ENODEV; > > init_completion(&probe_event); > diff --git a/drivers/input/mouse/vmmouse.c b/drivers/input/mouse/vmmouse.c > index 0f586780ceb4..1ae5c1ef3f5b 100644 > --- a/drivers/input/mouse/vmmouse.c > +++ b/drivers/input/mouse/vmmouse.c > @@ -316,11 +316,9 @@ static int vmmouse_enable(struct psmouse *psmouse) > /* > * Array of supported hypervisors. > */ > -static const struct hypervisor_x86 *vmmouse_supported_hypervisors[] = { > - &x86_hyper_vmware, > -#ifdef CONFIG_KVM_GUEST > - &x86_hyper_kvm, > -#endif > +static enum x86_hypervisor_type vmmouse_supported_hypervisors[] = { > + X86_HYPER_VMWARE, > + X86_HYPER_KVM, > }; > > /** > @@ -331,7 +329,7 @@ static bool vmmouse_check_hypervisor(void) > int i; > > for (i = 0; i < ARRAY_SIZE(vmmouse_supported_hypervisors); i++) > - if (vmmouse_supported_hypervisors[i] == x86_hyper) > + if (vmmouse_supported_hypervisors[i] == x86_hyper_type) > return true; > > return false; > diff --git a/drivers/misc/vmw_balloon.c b/drivers/misc/vmw_balloon.c > index 1e688bfec567..9047c0a529b2 100644 > --- a/drivers/misc/vmw_balloon.c > +++ b/drivers/misc/vmw_balloon.c > @@ -1271,7 +1271,7 @@ static int __init vmballoon_init(void) > * Check if we are running on VMware's hypervisor and bail out > * if we are not. > */ > - if (x86_hyper != &x86_hyper_vmware) > + if (x86_hyper_type != X86_HYPER_VMWARE) > return -ENODEV; > > for (is_2m_pages = 0; is_2m_pages < VMW_BALLOON_NUM_PAGE_SIZES; > -- > 2.12.3 >
Dmitry Torokhov
2017-Nov-10 18:26 UTC
[PATCH v2 2/5] x86: add enum for hypervisors to replace x86_hyper
On Thu, Nov 09, 2017 at 02:27:36PM +0100, Juergen Gross wrote:> The x86_hyper pointer is only used for checking whether a virtual > device is supporting the hypervisor the system is running on. > > Use an enum for that purpose instead and drop the x86_hyper pointer. > > Cc: kys at microsoft.com > Cc: haiyangz at microsoft.com > Cc: sthemmin at microsoft.com > Cc: akataria at vmware.com > Cc: pbonzini at redhat.com > Cc: rkrcmar at redhat.com > Cc: boris.ostrovsky at oracle.com > Cc: devel at linuxdriverproject.org > Cc: virtualization at lists.linux-foundation.org > Cc: kvm at vger.kernel.org > Cc: xen-devel at lists.xenproject.org > Cc: linux-graphics-maintainer at vmware.com > Cc: pv-drivers at vmware.com > Cc: dmitry.torokhov at gmail.com > Cc: xdeguillard at vmware.com > Cc: moltmann at vmware.com > Cc: arnd at arndb.de > Cc: gregkh at linuxfoundation.org > Cc: linux-input at vger.kernel.org > > Signed-off-by: Juergen Gross <jgross at suse.com> > --- > arch/x86/hyperv/hv_init.c | 2 +- > arch/x86/include/asm/hypervisor.h | 23 ++++++++++++++--------- > arch/x86/kernel/cpu/hypervisor.c | 12 +++++++++--- > arch/x86/kernel/cpu/mshyperv.c | 4 ++-- > arch/x86/kernel/cpu/vmware.c | 4 ++-- > arch/x86/kernel/kvm.c | 4 ++-- > arch/x86/xen/enlighten_hvm.c | 4 ++-- > arch/x86/xen/enlighten_pv.c | 4 ++-- > drivers/hv/vmbus_drv.c | 2 +- > drivers/input/mouse/vmmouse.c | 10 ++++------Acked-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>> drivers/misc/vmw_balloon.c | 2 +- > 11 files changed, 40 insertions(+), 31 deletions(-) > > diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c > index a5db63f728a2..a0b86cf486e0 100644 > --- a/arch/x86/hyperv/hv_init.c > +++ b/arch/x86/hyperv/hv_init.c > @@ -113,7 +113,7 @@ void hyperv_init(void) > u64 guest_id; > union hv_x64_msr_hypercall_contents hypercall_msr; > > - if (x86_hyper != &x86_hyper_ms_hyperv) > + if (x86_hyper_type != X86_HYPER_MS_HYPERV) > return; > > /* Allocate percpu VP index */ > diff --git a/arch/x86/include/asm/hypervisor.h b/arch/x86/include/asm/hypervisor.h > index 0eca7239a7aa..1b0a5abcd8ae 100644 > --- a/arch/x86/include/asm/hypervisor.h > +++ b/arch/x86/include/asm/hypervisor.h > @@ -29,6 +29,16 @@ > /* > * x86 hypervisor information > */ > + > +enum x86_hypervisor_type { > + X86_HYPER_NATIVE = 0, > + X86_HYPER_VMWARE, > + X86_HYPER_MS_HYPERV, > + X86_HYPER_XEN_PV, > + X86_HYPER_XEN_HVM, > + X86_HYPER_KVM, > +}; > + > struct hypervisor_x86 { > /* Hypervisor name */ > const char *name; > @@ -36,6 +46,9 @@ struct hypervisor_x86 { > /* Detection routine */ > uint32_t (*detect)(void); > > + /* Hypervisor type */ > + enum x86_hypervisor_type type; > + > /* init time callbacks */ > struct x86_hyper_init init; > > @@ -43,15 +56,7 @@ struct hypervisor_x86 { > struct x86_hyper_runtime runtime; > }; > > -extern const struct hypervisor_x86 *x86_hyper; > - > -/* Recognized hypervisors */ > -extern const struct hypervisor_x86 x86_hyper_vmware; > -extern const struct hypervisor_x86 x86_hyper_ms_hyperv; > -extern const struct hypervisor_x86 x86_hyper_xen_pv; > -extern const struct hypervisor_x86 x86_hyper_xen_hvm; > -extern const struct hypervisor_x86 x86_hyper_kvm; > - > +extern enum x86_hypervisor_type x86_hyper_type; > extern void init_hypervisor_platform(void); > #else > static inline void init_hypervisor_platform(void) { } > diff --git a/arch/x86/kernel/cpu/hypervisor.c b/arch/x86/kernel/cpu/hypervisor.c > index 22226c1bf092..bea8d3e24f50 100644 > --- a/arch/x86/kernel/cpu/hypervisor.c > +++ b/arch/x86/kernel/cpu/hypervisor.c > @@ -26,6 +26,12 @@ > #include <asm/processor.h> > #include <asm/hypervisor.h> > > +extern const struct hypervisor_x86 x86_hyper_vmware; > +extern const struct hypervisor_x86 x86_hyper_ms_hyperv; > +extern const struct hypervisor_x86 x86_hyper_xen_pv; > +extern const struct hypervisor_x86 x86_hyper_xen_hvm; > +extern const struct hypervisor_x86 x86_hyper_kvm; > + > static const __initconst struct hypervisor_x86 * const hypervisors[] > { > #ifdef CONFIG_XEN_PV > @@ -41,8 +47,8 @@ static const __initconst struct hypervisor_x86 * const hypervisors[] > #endif > }; > > -const struct hypervisor_x86 *x86_hyper; > -EXPORT_SYMBOL(x86_hyper); > +enum x86_hypervisor_type x86_hyper_type; > +EXPORT_SYMBOL(x86_hyper_type); > > static inline const struct hypervisor_x86 * __init > detect_hypervisor_vendor(void) > @@ -87,6 +93,6 @@ void __init init_hypervisor_platform(void) > copy_array(&h->init, &x86_init.hyper, sizeof(h->init)); > copy_array(&h->runtime, &x86_platform.hyper, sizeof(h->runtime)); > > - x86_hyper = h; > + x86_hyper_type = h->type; > x86_init.hyper.init_platform(); > } > diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c > index 6bb84d655e4b..85eb5fc180c8 100644 > --- a/arch/x86/kernel/cpu/mshyperv.c > +++ b/arch/x86/kernel/cpu/mshyperv.c > @@ -254,9 +254,9 @@ static void __init ms_hyperv_init_platform(void) > #endif > } > > -const __refconst struct hypervisor_x86 x86_hyper_ms_hyperv = { > +const __initconst struct hypervisor_x86 x86_hyper_ms_hyperv = { > .name = "Microsoft Hyper-V", > .detect = ms_hyperv_platform, > + .type = X86_HYPER_MS_HYPERV, > .init.init_platform = ms_hyperv_init_platform, > }; > -EXPORT_SYMBOL(x86_hyper_ms_hyperv); > diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c > index 4804c1d063c8..8e005329648b 100644 > --- a/arch/x86/kernel/cpu/vmware.c > +++ b/arch/x86/kernel/cpu/vmware.c > @@ -205,10 +205,10 @@ static bool __init vmware_legacy_x2apic_available(void) > (eax & (1 << VMWARE_PORT_CMD_LEGACY_X2APIC)) != 0; > } > > -const __refconst struct hypervisor_x86 x86_hyper_vmware = { > +const __initconst struct hypervisor_x86 x86_hyper_vmware = { > .name = "VMware", > .detect = vmware_platform, > + .type = X86_HYPER_VMWARE, > .init.init_platform = vmware_platform_setup, > .init.x2apic_available = vmware_legacy_x2apic_available, > }; > -EXPORT_SYMBOL(x86_hyper_vmware); > diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c > index 9dca8437c795..a94de09edbed 100644 > --- a/arch/x86/kernel/kvm.c > +++ b/arch/x86/kernel/kvm.c > @@ -544,12 +544,12 @@ static uint32_t __init kvm_detect(void) > return kvm_cpuid_base(); > } > > -const struct hypervisor_x86 x86_hyper_kvm __refconst = { > +const __initconst struct hypervisor_x86 x86_hyper_kvm = { > .name = "KVM", > .detect = kvm_detect, > + .type = X86_HYPER_KVM, > .init.x2apic_available = kvm_para_available, > }; > -EXPORT_SYMBOL_GPL(x86_hyper_kvm); > > static __init int activate_jump_labels(void) > { > diff --git a/arch/x86/xen/enlighten_hvm.c b/arch/x86/xen/enlighten_hvm.c > index 7b1622089f96..754d5391d9fa 100644 > --- a/arch/x86/xen/enlighten_hvm.c > +++ b/arch/x86/xen/enlighten_hvm.c > @@ -226,12 +226,12 @@ static uint32_t __init xen_platform_hvm(void) > return xen_cpuid_base(); > } > > -const struct hypervisor_x86 x86_hyper_xen_hvm = { > +const __initconst struct hypervisor_x86 x86_hyper_xen_hvm = { > .name = "Xen HVM", > .detect = xen_platform_hvm, > + .type = X86_HYPER_XEN_HVM, > .init.init_platform = xen_hvm_guest_init, > .init.x2apic_available = xen_x2apic_para_available, > .init.init_mem_mapping = xen_hvm_init_mem_mapping, > .runtime.pin_vcpu = xen_pin_vcpu, > }; > -EXPORT_SYMBOL(x86_hyper_xen_hvm); > diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c > index 69d1a7054ddb..168efb2534c0 100644 > --- a/arch/x86/xen/enlighten_pv.c > +++ b/arch/x86/xen/enlighten_pv.c > @@ -1460,9 +1460,9 @@ static uint32_t __init xen_platform_pv(void) > return 0; > } > > -const struct hypervisor_x86 x86_hyper_xen_pv = { > +const __initconst struct hypervisor_x86 x86_hyper_xen_pv = { > .name = "Xen PV", > .detect = xen_platform_pv, > + .type = X86_HYPER_XEN_PV, > .runtime.pin_vcpu = xen_pin_vcpu, > }; > -EXPORT_SYMBOL(x86_hyper_xen_pv); > diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c > index 937801ac2fe0..2cd134dd94d2 100644 > --- a/drivers/hv/vmbus_drv.c > +++ b/drivers/hv/vmbus_drv.c > @@ -1534,7 +1534,7 @@ static int __init hv_acpi_init(void) > { > int ret, t; > > - if (x86_hyper != &x86_hyper_ms_hyperv) > + if (x86_hyper_type != X86_HYPER_MS_HYPERV) > return -ENODEV; > > init_completion(&probe_event); > diff --git a/drivers/input/mouse/vmmouse.c b/drivers/input/mouse/vmmouse.c > index 0f586780ceb4..1ae5c1ef3f5b 100644 > --- a/drivers/input/mouse/vmmouse.c > +++ b/drivers/input/mouse/vmmouse.c > @@ -316,11 +316,9 @@ static int vmmouse_enable(struct psmouse *psmouse) > /* > * Array of supported hypervisors. > */ > -static const struct hypervisor_x86 *vmmouse_supported_hypervisors[] = { > - &x86_hyper_vmware, > -#ifdef CONFIG_KVM_GUEST > - &x86_hyper_kvm, > -#endif > +static enum x86_hypervisor_type vmmouse_supported_hypervisors[] = { > + X86_HYPER_VMWARE, > + X86_HYPER_KVM, > }; > > /** > @@ -331,7 +329,7 @@ static bool vmmouse_check_hypervisor(void) > int i; > > for (i = 0; i < ARRAY_SIZE(vmmouse_supported_hypervisors); i++) > - if (vmmouse_supported_hypervisors[i] == x86_hyper) > + if (vmmouse_supported_hypervisors[i] == x86_hyper_type) > return true; > > return false; > diff --git a/drivers/misc/vmw_balloon.c b/drivers/misc/vmw_balloon.c > index 1e688bfec567..9047c0a529b2 100644 > --- a/drivers/misc/vmw_balloon.c > +++ b/drivers/misc/vmw_balloon.c > @@ -1271,7 +1271,7 @@ static int __init vmballoon_init(void) > * Check if we are running on VMware's hypervisor and bail out > * if we are not. > */ > - if (x86_hyper != &x86_hyper_vmware) > + if (x86_hyper_type != X86_HYPER_VMWARE) > return -ENODEV; > > for (is_2m_pages = 0; is_2m_pages < VMW_BALLOON_NUM_PAGE_SIZES; > -- > 2.12.3 >-- Dmitry
Apparently Analagous Threads
- [PATCH v2 0/5] x86/xen: support booting PVH guest via standard boot path
- [PATCH v2 2/5] x86: add enum for hypervisors to replace x86_hyper
- [PATCH v2 2/5] x86: add enum for hypervisors to replace x86_hyper
- [PATCH] x86, Allow x2apic without IR on VMware platform.
- [PATCH] x86, Allow x2apic without IR on VMware platform.