On 06/21/2013 02:37 AM, Anthony Liguori wrote: > Alexey Kardashevskiy <a...@ozlabs.ru> writes: > >> At the moment QEMU creates a route for every MSI IRQ. >> >> Now we are about to add IRQFD support on PPC64-pseries platform. >> pSeries already has in-kernel emulated interrupt controller with >> 8192 IRQs. Also, pSeries PHB already supports MSIMessage to IRQ >> mapping as a part of PAPR requirements for MSI/MSIX guests. >> Specifically, the pSeries guest does not touch MSIMessage's at >> all, instead it uses rtas_ibm_change_msi and rtas_ibm_query_interrupt_source >> rtas calls to do the mapping. >> >> Therefore we do not really need more routing than we got already. >> The patch introduces the infrastructure to enable direct IRQ mapping. >> >> Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru> >> >> --- >> >> The patch is raw and ugly indeed, I made it only to demonstrate >> the idea and see if it has right to live or not. >> >> For some reason which I do not really understand (limited GSI numbers?) >> the existing code always adds routing and I do not see why we would need it. >> >> Thanks! >> --- >> hw/misc/vfio.c | 11 +++++++++-- >> hw/pci/pci.c | 13 +++++++++++++ >> hw/ppc/spapr_pci.c | 13 +++++++++++++ >> hw/virtio/virtio-pci.c | 26 ++++++++++++++++++++------ >> include/hw/pci/pci.h | 4 ++++ >> include/hw/pci/pci_bus.h | 1 + >> 6 files changed, 60 insertions(+), 8 deletions(-) >> >> diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c >> index 14aac04..2d9eef7 100644 >> --- a/hw/misc/vfio.c >> +++ b/hw/misc/vfio.c >> @@ -639,7 +639,11 @@ static int vfio_msix_vector_do_use(PCIDevice *pdev, >> unsigned int nr, >> * Attempt to enable route through KVM irqchip, >> * default to userspace handling if unavailable. >> */ >> - vector->virq = msg ? kvm_irqchip_add_msi_route(kvm_state, *msg) : -1; >> + >> + vector->virq = msg ? pci_bus_map_msi(vdev->pdev.bus, *msg) : -1; >> + if (vector->virq < 0) { >> + vector->virq = msg ? kvm_irqchip_add_msi_route(kvm_state, *msg) : >> -1; >> + } >> if (vector->virq < 0 || >> kvm_irqchip_add_irqfd_notifier(kvm_state, &vector->interrupt, >> vector->virq) < 0) { >> @@ -807,7 +811,10 @@ retry: >> * Attempt to enable route through KVM irqchip, >> * default to userspace handling if unavailable. >> */ >> - vector->virq = kvm_irqchip_add_msi_route(kvm_state, msg); >> + vector->virq = pci_bus_map_msi(vdev->pdev.bus, msg); >> + if (vector->virq < 0) { >> + vector->virq = kvm_irqchip_add_msi_route(kvm_state, msg); >> + } > > I don't understand why you're adding a pci level hook verses just having > a kvmppc specific hook in the kvm_irqchip_add_msi_route function..
Me neither :) I am just asking. The existing mapping code already exists in sPAPR PCI host bridge and it is not going anywhere else. And kvm_irqchip_add_msi_route does not have any link to a device or a bus so I'll have to walk through all PHBs in system and see if PHB's MSI window is the one from MSIMessage and convert MSIMessage to virq. Pretty easy and quick but still dirty hack, would it be better? -- Alexey