x86/paravirt: Use a single ops structure
Instead of using six globally visible paravirt ops structures combine them in a single structure, keeping the original structures as sub-structures. This avoids the need to assemble struct paravirt_patch_template at runtime on the stack each time apply_paravirt() is being called (i.e. when loading a module). [ tglx: Made the struct and the initializer tabular for readability sake ] Signed-off-by: Juergen Gross <jgross@suse.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: xen-devel@lists.xenproject.org Cc: virtualization@lists.linux-foundation.org Cc: akataria@vmware.com Cc: rusty@rustcorp.com.au Cc: boris.ostrovsky@oracle.com Cc: hpa@zytor.com Link: https://lkml.kernel.org/r/20180828074026.820-9-jgross@suse.com
此提交包含在:
@@ -995,11 +995,14 @@ void __init xen_setup_vcpu_info_placement(void)
|
||||
* percpu area for all cpus, so make use of it.
|
||||
*/
|
||||
if (xen_have_vcpu_info_placement) {
|
||||
pv_irq_ops.save_fl = __PV_IS_CALLEE_SAVE(xen_save_fl_direct);
|
||||
pv_irq_ops.restore_fl = __PV_IS_CALLEE_SAVE(xen_restore_fl_direct);
|
||||
pv_irq_ops.irq_disable = __PV_IS_CALLEE_SAVE(xen_irq_disable_direct);
|
||||
pv_irq_ops.irq_enable = __PV_IS_CALLEE_SAVE(xen_irq_enable_direct);
|
||||
pv_mmu_ops.read_cr2 = xen_read_cr2_direct;
|
||||
pv_ops.irq.save_fl = __PV_IS_CALLEE_SAVE(xen_save_fl_direct);
|
||||
pv_ops.irq.restore_fl =
|
||||
__PV_IS_CALLEE_SAVE(xen_restore_fl_direct);
|
||||
pv_ops.irq.irq_disable =
|
||||
__PV_IS_CALLEE_SAVE(xen_irq_disable_direct);
|
||||
pv_ops.irq.irq_enable =
|
||||
__PV_IS_CALLEE_SAVE(xen_irq_enable_direct);
|
||||
pv_ops.mmu.read_cr2 = xen_read_cr2_direct;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1174,14 +1177,14 @@ static void __init xen_boot_params_init_edd(void)
|
||||
*/
|
||||
static void __init xen_setup_gdt(int cpu)
|
||||
{
|
||||
pv_cpu_ops.write_gdt_entry = xen_write_gdt_entry_boot;
|
||||
pv_cpu_ops.load_gdt = xen_load_gdt_boot;
|
||||
pv_ops.cpu.write_gdt_entry = xen_write_gdt_entry_boot;
|
||||
pv_ops.cpu.load_gdt = xen_load_gdt_boot;
|
||||
|
||||
setup_stack_canary_segment(cpu);
|
||||
switch_to_new_gdt(cpu);
|
||||
|
||||
pv_cpu_ops.write_gdt_entry = xen_write_gdt_entry;
|
||||
pv_cpu_ops.load_gdt = xen_load_gdt;
|
||||
pv_ops.cpu.write_gdt_entry = xen_write_gdt_entry;
|
||||
pv_ops.cpu.load_gdt = xen_load_gdt;
|
||||
}
|
||||
|
||||
static void __init xen_dom0_set_legacy_features(void)
|
||||
@@ -1206,8 +1209,8 @@ asmlinkage __visible void __init xen_start_kernel(void)
|
||||
|
||||
/* Install Xen paravirt ops */
|
||||
pv_info = xen_info;
|
||||
pv_init_ops.patch = paravirt_patch_default;
|
||||
pv_cpu_ops = xen_cpu_ops;
|
||||
pv_ops.init.patch = paravirt_patch_default;
|
||||
pv_ops.cpu = xen_cpu_ops;
|
||||
xen_init_irq_ops();
|
||||
|
||||
/*
|
||||
@@ -1276,8 +1279,10 @@ asmlinkage __visible void __init xen_start_kernel(void)
|
||||
#endif
|
||||
|
||||
if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) {
|
||||
pv_mmu_ops.ptep_modify_prot_start = xen_ptep_modify_prot_start;
|
||||
pv_mmu_ops.ptep_modify_prot_commit = xen_ptep_modify_prot_commit;
|
||||
pv_ops.mmu.ptep_modify_prot_start =
|
||||
xen_ptep_modify_prot_start;
|
||||
pv_ops.mmu.ptep_modify_prot_commit =
|
||||
xen_ptep_modify_prot_commit;
|
||||
}
|
||||
|
||||
machine_ops = xen_machine_ops;
|
||||
|
新增問題並參考
封鎖使用者