lkml.org 
[lkml]   [2017]   [Nov]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.9 24/54] KVM: arm/arm64: Fix occasional warning from the timer work function
    Date
    From: Christoffer Dall <christoffer.dall@linaro.org>

    [ Upstream commit 63e41226afc3f7a044b70325566fa86ac3142538 ]

    When a VCPU blocks (WFI) and has programmed the vtimer, we program a
    soft timer to expire in the future to wake up the vcpu thread when
    appropriate. Because such as wake up involves a vcpu kick, and the
    timer expire function can get called from interrupt context, and the
    kick may sleep, we have to schedule the kick in the work function.

    The work function currently has a warning that gets raised if it turns
    out that the timer shouldn't fire when it's run, which was added because
    the idea was that in that case the work should never have been cancelled.

    However, it turns out that this whole thing is racy and we can get
    spurious warnings. The problem is that we clear the armed flag in the
    work function, which may run in parallel with the
    kvm_timer_unschedule->timer_disarm() call. This results in a possible
    situation where the timer_disarm() call does not call
    cancel_work_sync(), which effectively synchronizes the completion of the
    work function with running the VCPU. As a result, the VCPU thread
    proceeds before the work function completees, causing changes to the
    timer state such that kvm_timer_should_fire(vcpu) returns false in the
    work function.

    All we do in the work function is to kick the VCPU, and an occasional
    rare extra kick never harmed anyone. Since the race above is extremely
    rare, we don't bother checking if the race happens but simply remove the
    check and the clearing of the armed flag from the work function.

    Reported-by: Matthias Brugger <mbrugger@suse.com>
    Reviewed-by: Marc Zyngier <marc.zyngier@arm.com>
    Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
    Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
    Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
    ---
    virt/kvm/arm/arch_timer.c | 3 ---
    1 file changed, 3 deletions(-)

    diff --git a/virt/kvm/arm/arch_timer.c b/virt/kvm/arm/arch_timer.c
    index 27a1f6341d41..7b49a1378c90 100644
    --- a/virt/kvm/arm/arch_timer.c
    +++ b/virt/kvm/arm/arch_timer.c
    @@ -89,9 +89,6 @@ static void kvm_timer_inject_irq_work(struct work_struct *work)
    struct kvm_vcpu *vcpu;

    vcpu = container_of(work, struct kvm_vcpu, arch.timer_cpu.expired);
    - vcpu->arch.timer_cpu.armed = false;
    -
    - WARN_ON(!kvm_timer_should_fire(vcpu));

    /*
    * If the vcpu is blocked we want to wake it up so that it will see
    --
    2.11.0
    \
     
     \ /
      Last update: 2017-11-23 00:16    [W:4.084 / U:0.272 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site