The elrsr registers should only be used when synchronizing the vgic state after running. It shouldn't be trusted in another context. Use lr_used instead, which tracks the LR allocation. Signed-off-by: Marc Zyngier <marc.zyngier@xxxxxxx> --- arch/arm/kvm/vgic.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/arch/arm/kvm/vgic.c b/arch/arm/kvm/vgic.c index 57929db..581faf2 100644 --- a/arch/arm/kvm/vgic.c +++ b/arch/arm/kvm/vgic.c @@ -738,7 +738,7 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq) } /* Try to use another LR for this interrupt */ - lr = find_first_bit((unsigned long *)vgic_cpu->vgic_elrsr, + lr = find_first_zero_bit((unsigned long *)vgic_cpu->lr_used, vgic_cpu->nr_lr); if (lr >= vgic_cpu->nr_lr) return false; @@ -751,7 +751,6 @@ static bool vgic_queue_irq(struct kvm_vcpu *vcpu, u8 sgi_source_id, int irq) } vgic_cpu->vgic_irq_lr_map[irq] = lr; - clear_bit(lr, (unsigned long *)vgic_cpu->vgic_elrsr); set_bit(lr, vgic_cpu->lr_used); return true; -- 1.7.12 _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm