APPLIED: [PATCH][SRU Cosmic] arm64: KVM: Always set ICH_HCR_EL2.EN if GICv4 is enabled

Kleber Souza kleber.souza at canonical.com
Wed Jun 5 10:55:18 UTC 2019


On 5/23/19 9:00 PM, dann frazier wrote:
> From: Marc Zyngier <marc.zyngier at arm.com>
> 
> BugLink: https://bugs.launchpad.net/bugs/1829942
> 
> The normal interrupt flow is not to enable the vgic when no virtual
> interrupt is to be injected (i.e. the LRs are empty). But when a guest
> is likely to use GICv4 for LPIs, we absolutely need to switch it on
> at all times. Otherwise, VLPIs only get delivered when there is something
> in the LRs, which doesn't happen very often.
> 
> Reported-by: Nianyao Tang <tangnianyao at huawei.com>
> Tested-by: Shameerali Kolothum Thodi <shameerali.kolothum.thodi at huawei.com>
> Signed-off-by: Marc Zyngier <marc.zyngier at arm.com>
> (backported from commit ca71228b42a96908eca7658861eafacd227856c9)
> [ dannf: Fixed to apply by retaining spin_lock calls, that were later
>   changed to raw_spin_lock calls ]
> Signed-off-by: dann frazier <dann.frazier at canonical.com>
> ---
>  virt/kvm/arm/hyp/vgic-v3-sr.c |  4 ++--
>  virt/kvm/arm/vgic/vgic.c      | 14 ++++++++++----
>  2 files changed, 12 insertions(+), 6 deletions(-)
> 
> diff --git a/virt/kvm/arm/hyp/vgic-v3-sr.c b/virt/kvm/arm/hyp/vgic-v3-sr.c
> index 616e5a433ab0f..e20e797a1b69b 100644
> --- a/virt/kvm/arm/hyp/vgic-v3-sr.c
> +++ b/virt/kvm/arm/hyp/vgic-v3-sr.c
> @@ -222,7 +222,7 @@ void __hyp_text __vgic_v3_save_state(struct kvm_vcpu *vcpu)
>  		}
>  	}
>  
> -	if (used_lrs) {
> +	if (used_lrs || cpu_if->its_vpe.its_vm) {
>  		int i;
>  		u32 elrsr;
>  
> @@ -247,7 +247,7 @@ void __hyp_text __vgic_v3_restore_state(struct kvm_vcpu *vcpu)
>  	u64 used_lrs = vcpu->arch.vgic_cpu.used_lrs;
>  	int i;
>  
> -	if (used_lrs) {
> +	if (used_lrs || cpu_if->its_vpe.its_vm) {
>  		write_gicreg(cpu_if->vgic_hcr, ICH_HCR_EL2);
>  
>  		for (i = 0; i < used_lrs; i++)
> diff --git a/virt/kvm/arm/vgic/vgic.c b/virt/kvm/arm/vgic/vgic.c
> index 7007468e24712..f48662234cd41 100644
> --- a/virt/kvm/arm/vgic/vgic.c
> +++ b/virt/kvm/arm/vgic/vgic.c
> @@ -871,15 +871,21 @@ void kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu)
>  	 * either observe the new interrupt before or after doing this check,
>  	 * and introducing additional synchronization mechanism doesn't change
>  	 * this.
> +	 *
> +	 * Note that we still need to go through the whole thing if anything
> +	 * can be directly injected (GICv4).
>  	 */
> -	if (list_empty(&vcpu->arch.vgic_cpu.ap_list_head))
> +	if (list_empty(&vcpu->arch.vgic_cpu.ap_list_head) &&
> +	    !vgic_supports_direct_msis(vcpu->kvm))
>  		return;
>  
>  	DEBUG_SPINLOCK_BUG_ON(!irqs_disabled());
>  
> -	spin_lock(&vcpu->arch.vgic_cpu.ap_list_lock);
> -	vgic_flush_lr_state(vcpu);
> -	spin_unlock(&vcpu->arch.vgic_cpu.ap_list_lock);
> +	if (!list_empty(&vcpu->arch.vgic_cpu.ap_list_head)) {
> +		spin_lock(&vcpu->arch.vgic_cpu.ap_list_lock);
> +		vgic_flush_lr_state(vcpu);
> +		spin_unlock(&vcpu->arch.vgic_cpu.ap_list_lock);
> +	}
>  
>  	if (can_access_vgic_from_kernel())
>  		vgic_restore_state(vcpu);
> 

Applied to cosmic/master-next branch.

Thanks,
Kleber



More information about the kernel-team mailing list