Re: [PATCH] KVM: X86: Fix preempt the preemption timer cancel

From: Paolo Bonzini
Date: Fri May 26 2017 - 11:45:38 EST




On 21/05/2017 05:32, Wanpeng Li wrote:
> vmx_cancel_hv_timer
> vCPU0's vmx->hv_deadline_tsc = -1
>
> preempt occur
>
> clear preemption timer field in CPU1's active vmcs
> vCPU0's apic_timer.hv_timer_in_use = false
> vmx_vcpu_run(vCPU0)
> vmx_arm_hv_timer
> if (vmx->hv_deadline_tsc == -1)
> nothing change
>
> handle_preemption_timer(vCPU0)
> kvm_lapic_expired_hv_timer
> WARN_ON(!apic->lapic_timer.hv_timer_in_use);
>
> Preemption can occur during cancel preemption timer, and there will be inconsistent
> status in lapic, vmx and vmcs field. This patch fixes it by disable preemption for
> cancelling preemption timer.

I see, so the purpose is to serialize against kvm_arch_vcpu_load. Nice
catch, I've queued the patch for kvm/master.

Paolo

> Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx>
> Cc: Radim KrÄmÃÅ <rkrcmar@xxxxxxxxxx>
> Signed-off-by: Wanpeng Li <wanpeng.li@xxxxxxxxxxx>
> ---
> arch/x86/kvm/lapic.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
> index c329d28..6e6f345 100644
> --- a/arch/x86/kvm/lapic.c
> +++ b/arch/x86/kvm/lapic.c
> @@ -1495,8 +1495,10 @@ EXPORT_SYMBOL_GPL(kvm_lapic_hv_timer_in_use);
>
> static void cancel_hv_timer(struct kvm_lapic *apic)
> {
> + preempt_disable();
> kvm_x86_ops->cancel_hv_timer(apic->vcpu);
> apic->lapic_timer.hv_timer_in_use = false;
> + preempt_enable();
> }
>
> static bool start_hv_timer(struct kvm_lapic *apic)
> --