• Christoffer Dall's avatar
    arm/arm64: KVM: vgic: Factor out level irq processing on guest exit · 9103617d
    Christoffer Dall authored
    Currently vgic_process_maintenance() processes dealing with a completed
    level-triggered interrupt directly, but we are soon going to reuse this
    logic for level-triggered mapped interrupts with the HW bit set, so
    move this logic into a separate static function.
    
    Probably the most scary part of this commit is convincing yourself that
    the current flow is safe compared to the old one.  In the following I
    try to list the changes and why they are harmless:
    
      Move vgic_irq_clear_queued after kvm_notify_acked_irq:
        Harmless because the only potential effect of clearing the queued
        flag wrt.  kvm_set_irq is that vgic_update_irq_pending does not set
        the pending bit on the emulated CPU interface or in the
        pending_on_cpu bitmask if the function is called with level=1.
        However, the point of kvm_notify_acked_irq is to call kvm_set_irq
        with level=0, and we set the queued flag again in
        __kvm_vgic_sync_hwstate later on if the level is stil high.
    
      Move vgic_set_lr before kvm_notify_acked_irq:
        Also, harmless because the LR are cpu-local operations and
        kvm_notify_acked only affects the dist
    
      Move vgic_dist_irq_clear_soft_pend after kvm_notify_acked_irq:
        Also harmless, because now we check the level state in the
        clear_soft_pend function and lower the pending bits if the level is
        low.
    Reviewed-by: default avatarEric Auger <eric.auger@linaro.org>
    Reviewed-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
    Signed-off-by: default avatarChristoffer Dall <christoffer.dall@linaro.org>
    9103617d
vgic.c 65 KB