On Mon, May 10, 2021 at 02:48:18PM +0100, Marc Zyngier wrote: > As it turns out, not all the interrupt controllers are able to > expose a vGIC maintenance interrupt as a distrete signal. > And to be fair, it doesn't really matter as all we require is > for *something* to kick us out of guest mode out way or another. > > On systems that do not expose a maintenance interrupt as such, > there are two outcomes: > > - either the virtual CPUIF does generate an interrupt, and > by the time we are back to the host the interrupt will have long > been disabled (as we set ICH_HCR_EL2.EN to 0 on exit). In this case, > interrupt latency is as good as it gets. > > - or some other event (physical timer) will take us out of the guest > anyway, and the only drawback is a bad interrupt latency. IIRC we won't have a a guaranteed schedular tick for NO_HZ_FULL, so in that case we'll either need to set a period software maintenance interrupt, or reject this combination at runtime (either when trying to isolate the dynticks CPUs, or when trying to create a VM). Otherwise, it's very likely that something will take us out of the guest from time to time, but we won't have a strict guarantee (e.g. if all guest memory is pinned). Thanks, Mark. > > So let's be tolerant to the lack of maintenance interrupt, and just let > the user know that their mileage may vary... > > Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx> > --- > arch/arm64/kvm/vgic/vgic-init.c | 10 +++++----- > 1 file changed, 5 insertions(+), 5 deletions(-) > > diff --git a/arch/arm64/kvm/vgic/vgic-init.c b/arch/arm64/kvm/vgic/vgic-init.c > index 2fdb65529594..9fd23f32aa54 100644 > --- a/arch/arm64/kvm/vgic/vgic-init.c > +++ b/arch/arm64/kvm/vgic/vgic-init.c > @@ -524,11 +524,6 @@ int kvm_vgic_hyp_init(void) > if (!gic_kvm_info) > return -ENODEV; > > - if (!gic_kvm_info->maint_irq) { > - kvm_err("No vgic maintenance irq\n"); > - return -ENXIO; > - } > - > switch (gic_kvm_info->type) { > case GIC_V2: > ret = vgic_v2_probe(gic_kvm_info); > @@ -552,6 +547,11 @@ int kvm_vgic_hyp_init(void) > if (ret) > return ret; > > + if (!kvm_vgic_global_state.maint_irq) { > + kvm_err("No maintenance interrupt available, fingers crossed...\n"); > + return 0; > + } > + > ret = request_percpu_irq(kvm_vgic_global_state.maint_irq, > vgic_maintenance_handler, > "vgic", kvm_get_running_vcpus()); > -- > 2.29.2 >