Patch "x86/virt, x86/platform: Merge 'struct x86_hyper' into 'struct x86_platform' and 'struct x86_init'" has been added to the 4.14-stable tree
Subsystems (8)
This is a note to let you know that I've just added the patch titled
x86/virt, x86/platform: Merge 'struct x86_hyper' into 'struct x86_platform' and 'struct x86_init'
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
x86-virt-x86-platform-merge-struct-x86_hyper-into-struct-x86_platform-and-struct-x86_init.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
f72e38e8ec8869ac0ba5a75d7d2f897d98a1454eMon Sep 17 00:00:00 2001
From: Juergen Gross <[email protected]>
Date: Thu, 9 Nov 2017 14:27:35 +0100
Subject: x86/virt, x86/platform: Merge 'struct x86_hyper' into 'struct x86_platform' and 'struct x86_init'
From: Juergen Gross <[email protected]>
commit f72e38e8ec8869ac0ba5a75d7d2f897d98a1454e upstream.
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.
--- 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 | 56 ++++++++++++++++++-------------------- 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, 82 insertions(+), 62 deletions(-)
arch/x86/include/asm/hypervisor.h +5 -20
@@ -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_hextern 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 */
arch/x86/include/asm/x86_init.h +24 -0
@@ -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 ;
arch/x86/kernel/apic/apic.c +1 -1
@@ -1645,7 +1645,7 @@ static __init void try_to_enable_x2apic(* 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 ;
arch/x86/kernel/cpu/hypervisor.c +27 -29
78 lines not on this page · raw message
arch/x86/kernel/cpu/mshyperv.c +1 -1
@@ -257,6 +257,6 @@ static void __init ms_hyperv_init_platfoconst __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);
arch/x86/kernel/cpu/vmware.c +2 -2
@@ -208,7 +208,7 @@ static bool __init vmware_legacy_x2apic_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);
arch/x86/kernel/kvm.c +1 -1
@@ -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);
arch/x86/kernel/x86_init.c +9 -0
@@ -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 __r .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);
arch/x86/mm/init.c +1 -1
@@ -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 ); }
arch/x86/xen/enlighten_hvm.c +4 -4
@@ -229,9 +229,9 @@ static uint32_t __init xen_platform_hvm(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);
arch/x86/xen/enlighten_pv.c +1 -1
@@ -1462,6 +1462,6 @@ static uint32_t __init xen_platform_pv(vconst 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);
include/linux/hypervisor.h +6 -2
@@ -7,8 +7,12 @@* Juergen Gross <[email protected]> */ -#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) {
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/x86-entry-64-move-the-ist-stacks-into-struct-cpu_entry_area.patch queue-4.14/x86-dumpstack-add-get_stack_info-support-for-the-sysenter-stack.patch queue-4.14/x86-virt-add-enum-for-hypervisors-to-replace-x86_hyper.patch queue-4.14/x86-xen-provide-pre-built-page-tables-only-for-config_xen_pv-y-and-config_xen_pvh-y.patch queue-4.14/x86-entry-remap-the-tss-into-the-cpu-entry-area.patch queue-4.14/x86-entry-64-paravirt-use-paravirt-safe-macro-to-access-eflags.patch queue-4.14/x86-mm-fixmap-generalize-the-gdt-fixmap-mechanism-introduce-struct-cpu_entry_area.patch queue-4.14/x86-xen-drop-5-level-paging-support-code-from-the-xen_pv-code.patch queue-4.14/x86-paravirt-dont-patch-flush_tlb_single.patch queue-4.14/x86-dumpstack-handle-stack-overflow-on-all-stacks.patch queue-4.14/x86-entry-64-return-to-userspace-from-the-trampoline-stack.patch queue-4.14/x86-paravirt-provide-a-way-to-check-for-hypervisors.patch queue-4.14/xen-x86-entry-64-add-xen-nmi-trap-entry.patch queue-4.14/x86-entry-64-create-a-per-cpu-syscall-entry-trampoline.patch queue-4.14/x86-xen-64-x86-entry-64-clean-up-sp-code-in-cpu_initialize_context.patch queue-4.14/x86-entry-64-de-xen-ify-our-nmi-code.patch queue-4.14/objtool-don-t-report-end-of-section-error-after-an-empty-unwind-hint.patch queue-4.14/x86-entry-64-use-a-per-cpu-trampoline-stack-for-idt-entries.patch queue-4.14/x86-cpufeatures-make-cpu-bugs-sticky.patch queue-4.14/x86-espfix-64-stop-assuming-that-pt_regs-is-on-the-entry-stack.patch queue-4.14/x86-xen-fix-xen-head-elf-annotations.patch queue-4.14/x86-entry-move-sysenter_stack-to-the-beginning-of-struct-tss_struct.patch queue-4.14/x86-entry-64-allocate-and-enable-the-sysenter-stack.patch queue-4.14/x86-unwinder-orc-dont-bail-on-stack-overflow.patch queue-4.14/x86-head-fix-head-elf-function-annotations.patch queue-4.14/x86-head-add-unwind-hint-annotations.patch queue-4.14/x86-head-remove-unused-bad_address-code.patch queue-4.14/x86-xen-add-unwind-hint-annotations.patch queue-4.14/x86-kasan-64-teach-kasan-about-the-cpu_entry_area.patch queue-4.14/x86-head-remove-confusing-comment.patch queue-4.14/x86-entry-64-remove-the-sysenter-stack-canary.patch queue-4.14/x86-entry-gdt-put-per-cpu-gdt-remaps-in-ascending-order.patch queue-4.14/x86-entry-fix-assumptions-that-the-hw-tss-is-at-the-beginning-of-cpu_tss.patch queue-4.14/x86-entry-64-make-cpu_entry_area.tss-read-only.patch queue-4.14/x86-virt-x86-platform-merge-struct-x86_hyper-into-struct-x86_platform-and-struct-x86_init.patch queue-4.14/x86-unwinder-handle-stack-overflows-more-gracefully.patch queue-4.14/x86-irq-64-print-the-offending-ip-in-the-stack-overflow-warning.patch queue-4.14/x86-entry-clean-up-the-sysenter_stack-code.patch queue-4.14/x86-entry-64-separate-cpu_current_top_of_stack-from-tss.sp0.patch queue-4.14/x86-boot-annotate-verify_cpu-as-a-callable-function.patch queue-4.14/x86-irq-remove-an-old-outdated-comment-about-context-tracking-races.patch