• Dave Martin's avatar
    KVM: arm64: Don't mask softirq with IRQs disabled in vcpu_put() · b045e4d0
    Dave Martin authored
    Commit e6b673b7 ("KVM: arm64: Optimise FPSIMD handling to reduce
    guest/host thrashing") introduces a specific helper
    kvm_arch_vcpu_put_fp() for saving the vcpu FPSIMD state during
    vcpu_put().
    
    This function uses local_bh_disable()/_enable() to protect the
    FPSIMD context manipulation from interruption by softirqs.
    
    This approach is not correct, because vcpu_put() can be invoked
    either from the KVM host vcpu thread (when exiting the vcpu run
    loop), or via a preempt notifier.  In the former case, only
    preemption is disabled.  In the latter case, the function is called
    from inside __schedule(), which means that IRQs are disabled.
    
    Use of local_bh_disable()/_enable() with IRQs disabled is considerd
    an error, resulting in lockdep splats while running VMs if lockdep
    is enabled.
    
    This patch disables IRQs instead of attempting to disable softirqs,
    avoiding the problem of calling local_bh_enable() with IRQs
    disabled in the __schedule() path.  This creates an additional
    interrupt blackout during vcpu run loop exit, but this is the rare
    case and the blackout latency is still less than that of
    __schedule().
    
    Fixes: e6b673b7 ("KVM: arm64: Optimise FPSIMD handling to reduce guest/host thrashing")
    Reported-by: default avatarAndre Przywara <andre.przywara@arm.com>
    Signed-off-by: default avatarDave Martin <Dave.Martin@arm.com>
    Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    b045e4d0
fpsimd.c 3.22 KB