Il 20/07/2014 21:48, Michael S. Tsirkin ha scritto: > I guess an alternative is for callers to check before > invoking msi_notify. Please note is this is only option > when using e.g. irqfd, so this has some advantages. > Is there a specific device that is affected by this? > I would expect drivers to disable msi before clearing > bus master bit ... > >> > --- >> > hw/pci/msi.c | 4 ++++ >> > hw/pci/msix.c | 4 ++++ >> > 2 files changed, 8 insertions(+) >> > >> > diff --git a/hw/pci/msi.c b/hw/pci/msi.c >> > index a4a3040..36b651b 100644 >> > --- a/hw/pci/msi.c >> > +++ b/hw/pci/msi.c >> > @@ -285,6 +285,10 @@ void msi_notify(PCIDevice *dev, unsigned int vector) >> > return; >> > } >> > >> > + if (!(pci_get_word(dev->config + PCI_COMMAND) & PCI_COMMAND_MASTER)) { >> > + return; >> > + } >> > + >> > msg = msi_get_message(dev, vector); >> > >> > MSI_DEV_PRINTF(dev, >> > diff --git a/hw/pci/msix.c b/hw/pci/msix.c >> > index 5c49bfc..c77ae7d 100644 >> > --- a/hw/pci/msix.c >> > +++ b/hw/pci/msix.c >> > @@ -437,6 +437,10 @@ void msix_notify(PCIDevice *dev, unsigned vector) >> > return; >> > } >> > >> > + if (!(pci_get_word(dev->config + PCI_COMMAND) & PCI_COMMAND_MASTER)) { >> > + return; >> > + } >> > + >> > msg = msix_get_message(dev, vector); >> > >> > stl_le_phys(&address_space_memory, msg.address, msg.data);
I think a better way to do this, is to use the PCI bus master address space instead of address_space_memory. Even if it doesn't fix irqfd, it will make the MSI write go through the IOMMU as it should. Paolo