Message ID | 20200425094426.162962-1-maz@kernel.org (mailing list archive) |
---|---|
State | Mainlined |
Commit | 958e8e14fd24c0aa1fe6a6beb2b985cb638577d6 |
Headers | show |
Series | KVM: arm64: vgic-v4: Initialize GICv4.1 even in the absence of a virtual ITS | expand |
Hi Marc, On 2020/4/25 17:44, Marc Zyngier wrote: > KVM now expects to be able to use HW-accelerated delivery of vSGIs > as soon as the guest has enabled thm. Unfortunately, we only them > initialize the GICv4 context if we have a virtual ITS exposed to > the guest. > > Fix it by always initializing the GICv4.1 context if it is > available on the host. > > Fixes: 2291ff2f2a56 ("KVM: arm64: GICv4.1: Plumb SGI implementation selection in the distributor") > Signed-off-by: Marc Zyngier <maz@kernel.org> > --- > virt/kvm/arm/vgic/vgic-init.c | 9 ++++++++- > virt/kvm/arm/vgic/vgic-mmio-v3.c | 3 ++- > 2 files changed, 10 insertions(+), 2 deletions(-) > > diff --git a/virt/kvm/arm/vgic/vgic-init.c b/virt/kvm/arm/vgic/vgic-init.c > index a963b9d766b73..8e6f350c3bcd1 100644 > --- a/virt/kvm/arm/vgic/vgic-init.c > +++ b/virt/kvm/arm/vgic/vgic-init.c > @@ -294,8 +294,15 @@ int vgic_init(struct kvm *kvm) > } > } > > - if (vgic_has_its(kvm)) { > + if (vgic_has_its(kvm)) > vgic_lpi_translation_cache_init(kvm); > + > + /* > + * If we have GICv4.1 enabled, unconditionnaly request enable the > + * v4 support so that we get HW-accelerated vSGIs. Otherwise, only > + * enable it if we present a virtual ITS to the guest. > + */ > + if (vgic_supports_direct_msis(kvm)) { > ret = vgic_v4_init(kvm); > if (ret) > goto out; > diff --git a/virt/kvm/arm/vgic/vgic-mmio-v3.c b/virt/kvm/arm/vgic/vgic-mmio-v3.c > index e72dcc4542475..26b11dcd45524 100644 > --- a/virt/kvm/arm/vgic/vgic-mmio-v3.c > +++ b/virt/kvm/arm/vgic/vgic-mmio-v3.c > @@ -50,7 +50,8 @@ bool vgic_has_its(struct kvm *kvm) > > bool vgic_supports_direct_msis(struct kvm *kvm) > { > - return kvm_vgic_global_state.has_gicv4 && vgic_has_its(kvm); > + return (kvm_vgic_global_state.has_gicv4_1 || > + (kvm_vgic_global_state.has_gicv4 && vgic_has_its(kvm))); > } Not related to this patch, but I think that the function name can be improved a bit after this change. It now indicates whether the vGIC supports direct MSIs injection *or* direct SGIs injection, not just MSIs. And if vgic_has_its() is false, we don't even support MSIs. The fix itself looks correct to me, Reviewed-by: Zenghui Yu <yuzenghui@huawei.com> Thanks.
Hi Zenghui, On 2020-04-30 12:24, Zenghui Yu wrote: > Hi Marc, > > On 2020/4/25 17:44, Marc Zyngier wrote: >> KVM now expects to be able to use HW-accelerated delivery of vSGIs >> as soon as the guest has enabled thm. Unfortunately, we only > them >> initialize the GICv4 context if we have a virtual ITS exposed to >> the guest. >> >> Fix it by always initializing the GICv4.1 context if it is >> available on the host. >> >> Fixes: 2291ff2f2a56 ("KVM: arm64: GICv4.1: Plumb SGI implementation >> selection in the distributor") >> Signed-off-by: Marc Zyngier <maz@kernel.org> >> --- >> virt/kvm/arm/vgic/vgic-init.c | 9 ++++++++- >> virt/kvm/arm/vgic/vgic-mmio-v3.c | 3 ++- >> 2 files changed, 10 insertions(+), 2 deletions(-) >> >> diff --git a/virt/kvm/arm/vgic/vgic-init.c >> b/virt/kvm/arm/vgic/vgic-init.c >> index a963b9d766b73..8e6f350c3bcd1 100644 >> --- a/virt/kvm/arm/vgic/vgic-init.c >> +++ b/virt/kvm/arm/vgic/vgic-init.c >> @@ -294,8 +294,15 @@ int vgic_init(struct kvm *kvm) >> } >> } >> - if (vgic_has_its(kvm)) { >> + if (vgic_has_its(kvm)) >> vgic_lpi_translation_cache_init(kvm); >> + >> + /* >> + * If we have GICv4.1 enabled, unconditionnaly request enable the >> + * v4 support so that we get HW-accelerated vSGIs. Otherwise, only >> + * enable it if we present a virtual ITS to the guest. >> + */ >> + if (vgic_supports_direct_msis(kvm)) { >> ret = vgic_v4_init(kvm); >> if (ret) >> goto out; >> diff --git a/virt/kvm/arm/vgic/vgic-mmio-v3.c >> b/virt/kvm/arm/vgic/vgic-mmio-v3.c >> index e72dcc4542475..26b11dcd45524 100644 >> --- a/virt/kvm/arm/vgic/vgic-mmio-v3.c >> +++ b/virt/kvm/arm/vgic/vgic-mmio-v3.c >> @@ -50,7 +50,8 @@ bool vgic_has_its(struct kvm *kvm) >> bool vgic_supports_direct_msis(struct kvm *kvm) >> { >> - return kvm_vgic_global_state.has_gicv4 && vgic_has_its(kvm); >> + return (kvm_vgic_global_state.has_gicv4_1 || >> + (kvm_vgic_global_state.has_gicv4 && vgic_has_its(kvm))); >> } > > Not related to this patch, but I think that the function name can be > improved a bit after this change. It now indicates whether the vGIC > supports direct MSIs injection *or* direct SGIs injection, not just > MSIs. And if vgic_has_its() is false, we don't even support MSIs. Yes, I noticed that too. But in the spirit of keeping the change minimal and avoid later conflicts with potential fixes, I decided against changing it right now. > The fix itself looks correct to me, > > Reviewed-by: Zenghui Yu <yuzenghui@huawei.com> Thanks, M.
diff --git a/virt/kvm/arm/vgic/vgic-init.c b/virt/kvm/arm/vgic/vgic-init.c index a963b9d766b73..8e6f350c3bcd1 100644 --- a/virt/kvm/arm/vgic/vgic-init.c +++ b/virt/kvm/arm/vgic/vgic-init.c @@ -294,8 +294,15 @@ int vgic_init(struct kvm *kvm) } } - if (vgic_has_its(kvm)) { + if (vgic_has_its(kvm)) vgic_lpi_translation_cache_init(kvm); + + /* + * If we have GICv4.1 enabled, unconditionnaly request enable the + * v4 support so that we get HW-accelerated vSGIs. Otherwise, only + * enable it if we present a virtual ITS to the guest. + */ + if (vgic_supports_direct_msis(kvm)) { ret = vgic_v4_init(kvm); if (ret) goto out; diff --git a/virt/kvm/arm/vgic/vgic-mmio-v3.c b/virt/kvm/arm/vgic/vgic-mmio-v3.c index e72dcc4542475..26b11dcd45524 100644 --- a/virt/kvm/arm/vgic/vgic-mmio-v3.c +++ b/virt/kvm/arm/vgic/vgic-mmio-v3.c @@ -50,7 +50,8 @@ bool vgic_has_its(struct kvm *kvm) bool vgic_supports_direct_msis(struct kvm *kvm) { - return kvm_vgic_global_state.has_gicv4 && vgic_has_its(kvm); + return (kvm_vgic_global_state.has_gicv4_1 || + (kvm_vgic_global_state.has_gicv4 && vgic_has_its(kvm))); } /*
KVM now expects to be able to use HW-accelerated delivery of vSGIs as soon as the guest has enabled thm. Unfortunately, we only initialize the GICv4 context if we have a virtual ITS exposed to the guest. Fix it by always initializing the GICv4.1 context if it is available on the host. Fixes: 2291ff2f2a56 ("KVM: arm64: GICv4.1: Plumb SGI implementation selection in the distributor") Signed-off-by: Marc Zyngier <maz@kernel.org> --- virt/kvm/arm/vgic/vgic-init.c | 9 ++++++++- virt/kvm/arm/vgic/vgic-mmio-v3.c | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-)