Skip to content

Commit 82221a4

Browse files
committed
KVM: arm64: Disambiguate support for vSGIs v. vLPIs
vgic_supports_direct_msis() is a bit of a misnomer, as it returns true if either vSGIs or vLPIs are supported. Pick it apart into a few predicates and replace some open-coded checks for vSGIs, including an opportunistic fix to always check if the CPUIF is capable of handling vSGIs. Reviewed-by: Marc Zyngier <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Oliver Upton <[email protected]>
1 parent 86731a2 commit 82221a4

File tree

5 files changed

+25
-15
lines changed

5 files changed

+25
-15
lines changed

arch/arm64/kvm/vgic/vgic-init.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -391,11 +391,10 @@ int vgic_init(struct kvm *kvm)
391391
goto out;
392392

393393
/*
394-
* If we have GICv4.1 enabled, unconditionally request enable the
395-
* v4 support so that we get HW-accelerated vSGIs. Otherwise, only
396-
* enable it if we present a virtual ITS to the guest.
394+
* Ensure vPEs are allocated if direct IRQ injection (e.g. vSGIs,
395+
* vLPIs) is supported.
397396
*/
398-
if (vgic_supports_direct_msis(kvm)) {
397+
if (vgic_supports_direct_irqs(kvm)) {
399398
ret = vgic_v4_init(kvm);
400399
if (ret)
401400
goto out;
@@ -443,7 +442,7 @@ static void kvm_vgic_dist_destroy(struct kvm *kvm)
443442
dist->vgic_cpu_base = VGIC_ADDR_UNDEF;
444443
}
445444

446-
if (vgic_supports_direct_msis(kvm))
445+
if (vgic_supports_direct_irqs(kvm))
447446
vgic_v4_teardown(kvm);
448447

449448
xa_destroy(&dist->lpi_xa);

arch/arm64/kvm/vgic/vgic-mmio-v3.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,12 @@ bool vgic_has_its(struct kvm *kvm)
5050

5151
bool vgic_supports_direct_msis(struct kvm *kvm)
5252
{
53-
return (kvm_vgic_global_state.has_gicv4_1 ||
54-
(kvm_vgic_global_state.has_gicv4 && vgic_has_its(kvm)));
53+
return kvm_vgic_global_state.has_gicv4 && vgic_has_its(kvm);
54+
}
55+
56+
bool vgic_supports_direct_sgis(struct kvm *kvm)
57+
{
58+
return kvm_vgic_global_state.has_gicv4_1 && gic_cpuif_has_vsgi();
5559
}
5660

5761
/*
@@ -86,7 +90,7 @@ static unsigned long vgic_mmio_read_v3_misc(struct kvm_vcpu *vcpu,
8690
}
8791
break;
8892
case GICD_TYPER2:
89-
if (kvm_vgic_global_state.has_gicv4_1 && gic_cpuif_has_vsgi())
93+
if (vgic_supports_direct_sgis(vcpu->kvm))
9094
value = GICD_TYPER2_nASSGIcap;
9195
break;
9296
case GICD_IIDR:
@@ -119,7 +123,7 @@ static void vgic_mmio_write_v3_misc(struct kvm_vcpu *vcpu,
119123
dist->enabled = val & GICD_CTLR_ENABLE_SS_G1;
120124

121125
/* Not a GICv4.1? No HW SGIs */
122-
if (!kvm_vgic_global_state.has_gicv4_1 || !gic_cpuif_has_vsgi())
126+
if (!vgic_supports_direct_sgis(vcpu->kvm))
123127
val &= ~GICD_CTLR_nASSGIreq;
124128

125129
/* Dist stays enabled? nASSGIreq is RO */
@@ -133,7 +137,7 @@ static void vgic_mmio_write_v3_misc(struct kvm_vcpu *vcpu,
133137
if (is_hwsgi != dist->nassgireq)
134138
vgic_v4_configure_vsgis(vcpu->kvm);
135139

136-
if (kvm_vgic_global_state.has_gicv4_1 &&
140+
if (vgic_supports_direct_sgis(vcpu->kvm) &&
137141
was_enabled != dist->enabled)
138142
kvm_make_all_cpus_request(vcpu->kvm, KVM_REQ_RELOAD_GICv4);
139143
else if (!was_enabled && dist->enabled)
@@ -178,7 +182,7 @@ static int vgic_mmio_uaccess_write_v3_misc(struct kvm_vcpu *vcpu,
178182
}
179183
case GICD_CTLR:
180184
/* Not a GICv4.1? No HW SGIs */
181-
if (!kvm_vgic_global_state.has_gicv4_1)
185+
if (!vgic_supports_direct_sgis(vcpu->kvm))
182186
val &= ~GICD_CTLR_nASSGIreq;
183187

184188
dist->enabled = val & GICD_CTLR_ENABLE_SS_G1;

arch/arm64/kvm/vgic/vgic-v4.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ int vgic_v4_put(struct kvm_vcpu *vcpu)
356356
{
357357
struct its_vpe *vpe = &vcpu->arch.vgic_cpu.vgic_v3.its_vpe;
358358

359-
if (!vgic_supports_direct_msis(vcpu->kvm) || !vpe->resident)
359+
if (!vgic_supports_direct_irqs(vcpu->kvm) || !vpe->resident)
360360
return 0;
361361

362362
return its_make_vpe_non_resident(vpe, vgic_v4_want_doorbell(vcpu));
@@ -367,7 +367,7 @@ int vgic_v4_load(struct kvm_vcpu *vcpu)
367367
struct its_vpe *vpe = &vcpu->arch.vgic_cpu.vgic_v3.its_vpe;
368368
int err;
369369

370-
if (!vgic_supports_direct_msis(vcpu->kvm) || vpe->resident)
370+
if (!vgic_supports_direct_irqs(vcpu->kvm) || vpe->resident)
371371
return 0;
372372

373373
if (vcpu_get_flag(vcpu, IN_WFI))

arch/arm64/kvm/vgic/vgic.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -951,7 +951,7 @@ void kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu)
951951
* can be directly injected (GICv4).
952952
*/
953953
if (list_empty(&vcpu->arch.vgic_cpu.ap_list_head) &&
954-
!vgic_supports_direct_msis(vcpu->kvm))
954+
!vgic_supports_direct_irqs(vcpu->kvm))
955955
return;
956956

957957
DEBUG_SPINLOCK_BUG_ON(!irqs_disabled());
@@ -965,7 +965,7 @@ void kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu)
965965
if (can_access_vgic_from_kernel())
966966
vgic_restore_state(vcpu);
967967

968-
if (vgic_supports_direct_msis(vcpu->kvm))
968+
if (vgic_supports_direct_irqs(vcpu->kvm))
969969
vgic_v4_commit(vcpu);
970970
}
971971

arch/arm64/kvm/vgic/vgic.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,13 @@ int vgic_its_inv_lpi(struct kvm *kvm, struct vgic_irq *irq);
370370
int vgic_its_invall(struct kvm_vcpu *vcpu);
371371

372372
bool vgic_supports_direct_msis(struct kvm *kvm);
373+
bool vgic_supports_direct_sgis(struct kvm *kvm);
374+
375+
static inline bool vgic_supports_direct_irqs(struct kvm *kvm)
376+
{
377+
return vgic_supports_direct_msis(kvm) || vgic_supports_direct_sgis(kvm);
378+
}
379+
373380
int vgic_v4_init(struct kvm *kvm);
374381
void vgic_v4_teardown(struct kvm *kvm);
375382
void vgic_v4_configure_vsgis(struct kvm *kvm);

0 commit comments

Comments
 (0)