Message ID | 20240807052024.2084-1-yuzenghui@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: arm64: vgic-debug: Exit the iterator properly w/o LPI | expand |
On Wed, 07 Aug 2024 06:20:24 +0100, Zenghui Yu <yuzenghui@huawei.com> wrote: > > In case the guest doesn't have any LPI, we previously relied on the > iterator setting > > 'intid = nr_spis + VGIC_NR_PRIVATE_IRQS' && 'lpi_idx = 1' > > to exit the iterator. But it was broken with commit 85d3ccc8b75b ("KVM: > arm64: vgic-debug: Use an xarray mark for debug iterator") -- the intid > remains at 'nr_spis + VGIC_NR_PRIVATE_IRQS - 1', and we end up endlessly > printing the last SPI's state. > > Consider that it's meaningless to search the LPI xarray and populate > lpi_idx when there is no LPI, let's just skip the process for that case. > > The result is that > > * If there's no LPI, we focus on the intid and exit the iterator when it > runs out of the valid SPI range. > * Otherwise we keep the current logic and let the xarray drive the > iterator. > > Fixes: 85d3ccc8b75b ("KVM: arm64: vgic-debug: Use an xarray mark for debug iterator") > Signed-off-by: Zenghui Yu <yuzenghui@huawei.com> Acked-by: Marc Zyngier <maz@kernel.org> M.
On Wed, 7 Aug 2024 13:20:24 +0800, Zenghui Yu wrote: > In case the guest doesn't have any LPI, we previously relied on the > iterator setting > > 'intid = nr_spis + VGIC_NR_PRIVATE_IRQS' && 'lpi_idx = 1' > > to exit the iterator. But it was broken with commit 85d3ccc8b75b ("KVM: > arm64: vgic-debug: Use an xarray mark for debug iterator") -- the intid > remains at 'nr_spis + VGIC_NR_PRIVATE_IRQS - 1', and we end up endlessly > printing the last SPI's state. > > [...] Applied to kvmarm/fixes, thanks! [1/1] KVM: arm64: vgic-debug: Exit the iterator properly w/o LPI https://git.kernel.org/kvmarm/kvmarm/c/01ab08cafece -- Best, Oliver
diff --git a/arch/arm64/kvm/vgic/vgic-debug.c b/arch/arm64/kvm/vgic/vgic-debug.c index bcbc8c986b1d..bc74d06398ef 100644 --- a/arch/arm64/kvm/vgic/vgic-debug.c +++ b/arch/arm64/kvm/vgic/vgic-debug.c @@ -45,7 +45,8 @@ static void iter_next(struct kvm *kvm, struct vgic_state_iter *iter) * Let the xarray drive the iterator after the last SPI, as the iterator * has exhausted the sequentially-allocated INTID space. */ - if (iter->intid >= (iter->nr_spis + VGIC_NR_PRIVATE_IRQS - 1)) { + if (iter->intid >= (iter->nr_spis + VGIC_NR_PRIVATE_IRQS - 1) && + iter->nr_lpis) { if (iter->lpi_idx < iter->nr_lpis) xa_find_after(&dist->lpi_xa, &iter->intid, VGIC_LPI_MAX_INTID, @@ -112,7 +113,7 @@ static bool end_of_vgic(struct vgic_state_iter *iter) return iter->dist_id > 0 && iter->vcpu_id == iter->nr_cpus && iter->intid >= (iter->nr_spis + VGIC_NR_PRIVATE_IRQS) && - iter->lpi_idx > iter->nr_lpis; + (!iter->nr_lpis || iter->lpi_idx > iter->nr_lpis); } static void *vgic_debug_start(struct seq_file *s, loff_t *pos)
In case the guest doesn't have any LPI, we previously relied on the iterator setting 'intid = nr_spis + VGIC_NR_PRIVATE_IRQS' && 'lpi_idx = 1' to exit the iterator. But it was broken with commit 85d3ccc8b75b ("KVM: arm64: vgic-debug: Use an xarray mark for debug iterator") -- the intid remains at 'nr_spis + VGIC_NR_PRIVATE_IRQS - 1', and we end up endlessly printing the last SPI's state. Consider that it's meaningless to search the LPI xarray and populate lpi_idx when there is no LPI, let's just skip the process for that case. The result is that * If there's no LPI, we focus on the intid and exit the iterator when it runs out of the valid SPI range. * Otherwise we keep the current logic and let the xarray drive the iterator. Fixes: 85d3ccc8b75b ("KVM: arm64: vgic-debug: Use an xarray mark for debug iterator") Signed-off-by: Zenghui Yu <yuzenghui@huawei.com> --- arch/arm64/kvm/vgic/vgic-debug.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)