On Thu, 02 Nov 2023 14:35:07 +0000,Sorry to replay so late.
Kunkun Jiang <jiangkunkun@xxxxxxxxxx> wrote:
In some scenarios, the guest virtio-pci driver will request two MSI-X,Well, VFIO will request *all* available MSI-X. It doesn't know what a
one vector for config, one shared for queues. However, the host driver
(vDPA or VFIO) will request a vector for each queue.
queue is.
In the current implementation of GICv4/4.1 direct injection of vLPI,This matching is a hard requirement that matches the architecture. You
pINTID and vINTID have one-to-one correspondence. Therefore, the
cannot change it.
above scenario cannot be handled correctly. The host kernel willWhy does it hang? As far as it is concerned, it has unmapped the
execute its_map_vlpi multiple times but only execute its_unmap_vlpi
once. This may cause guest hang[1].
interrupts it cares about. Where are the calls to its_map_vlpi()
coming from? It should only occur if the guest actively programs the
MSI-X registers. What is your VMM? How can I reproduce this issue?
| WARN_ON(!(irq->hw && irq->host_irq == virq));This makes no sense. You are blindly associating multiple host
| if (irq->hw) {
| atomic_dec(&irq->target_vcpu->arch.vgic_cpu.vgic_v3.its_vpe.vlpi_count);
| irq->hw = false;
| ret = its_unmap_vlpi(virq);
| }
Add a list to struct vgic_irq to record all host irqs mapped to the vlpi.
When performing an action on the vlpi, traverse the list and perform this
action on all host irqs.
interrupts with a single guest interrupt. This is a blatant violation
of the architecture. When unmapping a VLPI from a guest, only this one
should be turned again into an LPI. Not two, not all, just this one.
Maybe you have found an actual issue, but this patch is absolutely
unacceptable. Please fully describe the problem, provide traces, and
if possible a reproducer.
Link: https://lore.kernel.org/all/0d9fdf42-76b1-afc6-85a9-159c5490bbd4@xxxxxxxxxx/#tI tried to parse this, but it hardly makes sense either. You seem to
imply that the host driver pre-configures the device, which is
completely wrong. The host driver (VFIO) should simply request all
possible physical LPIs, and that's all. It is expected that this
requesting has no other effect on the HW. Also, since your guest
driver only configures a single vLPI, there should be only a single
its_map_vlpi() call.
entry-0 0
entry-1 1
entry-2 1
entry-3 1
entry-4 1
entry-5 1
entry-6 1
kvm_irqfd_assign
irq_bypass_register_consumer
...
kvm_arch_irq_bypass_add_producer
kvm_vgic_v4_set_forwarding
its_map_vlpi
kvm_arch_irq_bypass_del_producer
kvm_vgic_v4_unset_forwarding
WARN_ON(!(irq->hw && irq->host_irq == virq));
if (irq->hw) {
irq->hw = false;
its_unmap_vlpi
}
So it seems to me that your HW and SW are doing things that are not
expected at all.
M.