mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-31 16:38:12 +00:00
a85863c2ec
Currently, if enable_pml=1 PML remains enabled for the entire lifetime of the VM irrespective of whether dirty logging is enable or disabled. When dirty logging is disabled, all the pages of the VM are manually marked dirty, so that PML is effectively non-operational. Setting the dirty bits is an expensive operation which can cause severe MMU lock contention in a performance sensitive path when dirty logging is disabled after a failed or canceled live migration. Manually setting dirty bits also fails to prevent PML activity if some code path clears dirty bits, which can incur unnecessary VM-Exits. In order to avoid this extra overhead, dynamically enable/disable PML when dirty logging gets turned on/off for the first/last memslot. Signed-off-by: Makarand Sonare <makarandsonare@google.com> Co-developed-by: Sean Christopherson <seanjc@google.com> Signed-off-by: Sean Christopherson <seanjc@google.com> Message-Id: <20210213005015.1651772-12-seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
123 lines
3.6 KiB
C
123 lines
3.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#if !defined(KVM_X86_OP) || !defined(KVM_X86_OP_NULL)
|
|
BUILD_BUG_ON(1)
|
|
#endif
|
|
|
|
/*
|
|
* KVM_X86_OP() and KVM_X86_OP_NULL() are used to help generate
|
|
* "static_call()"s. They are also intended for use when defining
|
|
* the vmx/svm kvm_x86_ops. KVM_X86_OP() can be used for those
|
|
* functions that follow the [svm|vmx]_func_name convention.
|
|
* KVM_X86_OP_NULL() can leave a NULL definition for the
|
|
* case where there is no definition or a function name that
|
|
* doesn't match the typical naming convention is supplied.
|
|
*/
|
|
KVM_X86_OP_NULL(hardware_enable)
|
|
KVM_X86_OP_NULL(hardware_disable)
|
|
KVM_X86_OP_NULL(hardware_unsetup)
|
|
KVM_X86_OP_NULL(cpu_has_accelerated_tpr)
|
|
KVM_X86_OP(has_emulated_msr)
|
|
KVM_X86_OP(vcpu_after_set_cpuid)
|
|
KVM_X86_OP(vm_init)
|
|
KVM_X86_OP_NULL(vm_destroy)
|
|
KVM_X86_OP(vcpu_create)
|
|
KVM_X86_OP(vcpu_free)
|
|
KVM_X86_OP(vcpu_reset)
|
|
KVM_X86_OP(prepare_guest_switch)
|
|
KVM_X86_OP(vcpu_load)
|
|
KVM_X86_OP(vcpu_put)
|
|
KVM_X86_OP(update_exception_bitmap)
|
|
KVM_X86_OP(get_msr)
|
|
KVM_X86_OP(set_msr)
|
|
KVM_X86_OP(get_segment_base)
|
|
KVM_X86_OP(get_segment)
|
|
KVM_X86_OP(get_cpl)
|
|
KVM_X86_OP(set_segment)
|
|
KVM_X86_OP_NULL(get_cs_db_l_bits)
|
|
KVM_X86_OP(set_cr0)
|
|
KVM_X86_OP(is_valid_cr4)
|
|
KVM_X86_OP(set_cr4)
|
|
KVM_X86_OP(set_efer)
|
|
KVM_X86_OP(get_idt)
|
|
KVM_X86_OP(set_idt)
|
|
KVM_X86_OP(get_gdt)
|
|
KVM_X86_OP(set_gdt)
|
|
KVM_X86_OP(sync_dirty_debug_regs)
|
|
KVM_X86_OP(set_dr7)
|
|
KVM_X86_OP(cache_reg)
|
|
KVM_X86_OP(get_rflags)
|
|
KVM_X86_OP(set_rflags)
|
|
KVM_X86_OP(tlb_flush_all)
|
|
KVM_X86_OP(tlb_flush_current)
|
|
KVM_X86_OP_NULL(tlb_remote_flush)
|
|
KVM_X86_OP_NULL(tlb_remote_flush_with_range)
|
|
KVM_X86_OP(tlb_flush_gva)
|
|
KVM_X86_OP(tlb_flush_guest)
|
|
KVM_X86_OP(run)
|
|
KVM_X86_OP_NULL(handle_exit)
|
|
KVM_X86_OP_NULL(skip_emulated_instruction)
|
|
KVM_X86_OP_NULL(update_emulated_instruction)
|
|
KVM_X86_OP(set_interrupt_shadow)
|
|
KVM_X86_OP(get_interrupt_shadow)
|
|
KVM_X86_OP(patch_hypercall)
|
|
KVM_X86_OP(set_irq)
|
|
KVM_X86_OP(set_nmi)
|
|
KVM_X86_OP(queue_exception)
|
|
KVM_X86_OP(cancel_injection)
|
|
KVM_X86_OP(interrupt_allowed)
|
|
KVM_X86_OP(nmi_allowed)
|
|
KVM_X86_OP(get_nmi_mask)
|
|
KVM_X86_OP(set_nmi_mask)
|
|
KVM_X86_OP(enable_nmi_window)
|
|
KVM_X86_OP(enable_irq_window)
|
|
KVM_X86_OP(update_cr8_intercept)
|
|
KVM_X86_OP(check_apicv_inhibit_reasons)
|
|
KVM_X86_OP_NULL(pre_update_apicv_exec_ctrl)
|
|
KVM_X86_OP(refresh_apicv_exec_ctrl)
|
|
KVM_X86_OP(hwapic_irr_update)
|
|
KVM_X86_OP(hwapic_isr_update)
|
|
KVM_X86_OP_NULL(guest_apic_has_interrupt)
|
|
KVM_X86_OP(load_eoi_exitmap)
|
|
KVM_X86_OP(set_virtual_apic_mode)
|
|
KVM_X86_OP_NULL(set_apic_access_page_addr)
|
|
KVM_X86_OP(deliver_posted_interrupt)
|
|
KVM_X86_OP_NULL(sync_pir_to_irr)
|
|
KVM_X86_OP(set_tss_addr)
|
|
KVM_X86_OP(set_identity_map_addr)
|
|
KVM_X86_OP(get_mt_mask)
|
|
KVM_X86_OP(load_mmu_pgd)
|
|
KVM_X86_OP_NULL(has_wbinvd_exit)
|
|
KVM_X86_OP(write_l1_tsc_offset)
|
|
KVM_X86_OP(get_exit_info)
|
|
KVM_X86_OP(check_intercept)
|
|
KVM_X86_OP(handle_exit_irqoff)
|
|
KVM_X86_OP_NULL(request_immediate_exit)
|
|
KVM_X86_OP(sched_in)
|
|
KVM_X86_OP_NULL(update_cpu_dirty_logging)
|
|
KVM_X86_OP_NULL(pre_block)
|
|
KVM_X86_OP_NULL(post_block)
|
|
KVM_X86_OP_NULL(vcpu_blocking)
|
|
KVM_X86_OP_NULL(vcpu_unblocking)
|
|
KVM_X86_OP_NULL(update_pi_irte)
|
|
KVM_X86_OP_NULL(apicv_post_state_restore)
|
|
KVM_X86_OP_NULL(dy_apicv_has_pending_interrupt)
|
|
KVM_X86_OP_NULL(set_hv_timer)
|
|
KVM_X86_OP_NULL(cancel_hv_timer)
|
|
KVM_X86_OP(setup_mce)
|
|
KVM_X86_OP(smi_allowed)
|
|
KVM_X86_OP(pre_enter_smm)
|
|
KVM_X86_OP(pre_leave_smm)
|
|
KVM_X86_OP(enable_smi_window)
|
|
KVM_X86_OP_NULL(mem_enc_op)
|
|
KVM_X86_OP_NULL(mem_enc_reg_region)
|
|
KVM_X86_OP_NULL(mem_enc_unreg_region)
|
|
KVM_X86_OP(get_msr_feature)
|
|
KVM_X86_OP(can_emulate_instruction)
|
|
KVM_X86_OP(apic_init_signal_blocked)
|
|
KVM_X86_OP_NULL(enable_direct_tlbflush)
|
|
KVM_X86_OP_NULL(migrate_timers)
|
|
KVM_X86_OP(msr_filter_changed)
|
|
KVM_X86_OP_NULL(complete_emulated_msr)
|
|
|
|
#undef KVM_X86_OP
|
|
#undef KVM_X86_OP_NULL
|