Yes, will test shortly. Cam
On Wed, Aug 29, 2012 at 10:47 AM, Michael S. Tsirkin <m...@redhat.com> wrote: > On Wed, Aug 29, 2012 at 06:44:49PM +0200, Jan Kiszka wrote: >> On 2012-08-29 18:40, Michael S. Tsirkin wrote: >> > The facility to use/unuse vectors dynamically is helpful >> > for virtio but little else: everyone just seems to use >> > vectors in their init function. >> > >> > Avoid clearing msix vector use info on reset and load. >> > For virtio, clear it explicitly. >> > This should fix regressions reported with ivshmem - though >> > I didn't test this, I verified that virtio keeps >> > working like it did. >> > >> > Signed-off-by: Michael S. Tsirkin <m...@redhat.com> >> > --- >> > hw/msix.c | 13 +++++++++++-- >> > hw/virtio-pci.c | 2 ++ >> > 2 files changed, 13 insertions(+), 2 deletions(-) >> > >> > diff --git a/hw/msix.c b/hw/msix.c >> > index 800fc32..d040cc2 100644 >> > --- a/hw/msix.c >> > +++ b/hw/msix.c >> > @@ -340,6 +340,15 @@ static void msix_free_irq_entries(PCIDevice *dev) >> > } >> > } >> > >> > +static void msix_clear_all_vectors(PCIDevice *dev) >> > +{ >> > + int vector; >> > + >> > + for (vector = 0; vector < dev->msix_entries_nr; ++vector) { >> > + msix_clr_pending(dev, vector); >> > + } >> > +} >> > + >> > /* Clean up resources for the device. */ >> > void msix_uninit(PCIDevice *dev, MemoryRegion *table_bar, MemoryRegion >> > *pba_bar) >> > { >> > @@ -394,7 +403,7 @@ void msix_load(PCIDevice *dev, QEMUFile *f) >> > return; >> > } >> > >> > - msix_free_irq_entries(dev); >> > + msix_clear_all_vectors(dev); >> > qemu_get_buffer(f, dev->msix_table, n * PCI_MSIX_ENTRY_SIZE); >> > qemu_get_buffer(f, dev->msix_pba, (n + 7) / 8); >> > msix_update_function_masked(dev); >> > @@ -440,7 +449,7 @@ void msix_reset(PCIDevice *dev) >> > if (!msix_present(dev)) { >> > return; >> > } >> > - msix_free_irq_entries(dev); >> > + msix_clear_all_vectors(dev); >> > dev->config[dev->msix_cap + MSIX_CONTROL_OFFSET] &= >> > ~dev->wmask[dev->msix_cap + MSIX_CONTROL_OFFSET]; >> > memset(dev->msix_table, 0, dev->msix_entries_nr * >> > PCI_MSIX_ENTRY_SIZE); >> > diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c >> > index 125eded..ca0b204 100644 >> > --- a/hw/virtio-pci.c >> > +++ b/hw/virtio-pci.c >> > @@ -131,6 +131,7 @@ static int virtio_pci_load_config(void * opaque, >> > QEMUFile *f) >> > if (ret) { >> > return ret; >> > } >> > + msix_unuse_all_vectors(&proxy->pci_dev); >> > msix_load(&proxy->pci_dev, f); >> > if (msix_present(&proxy->pci_dev)) { >> > qemu_get_be16s(f, &proxy->vdev->config_vector); >> > @@ -246,6 +247,7 @@ void virtio_pci_reset(DeviceState *d) >> > VirtIOPCIProxy *proxy = container_of(d, VirtIOPCIProxy, pci_dev.qdev); >> > virtio_pci_stop_ioeventfd(proxy); >> > virtio_reset(proxy->vdev); >> > + msix_unuse_all_vectors(&proxy->pci_dev); >> > proxy->flags &= ~VIRTIO_PCI_FLAG_BUS_MASTER_BUG; >> > } >> > >> > >> >> Fine with me, but let's ask Cam to test. >> >> Jan > > Cam deadline is today - can u test quickly pls? > >> -- >> Siemens AG, Corporate Technology, CT RTC ITP SDP-DE >> Corporate Competence Center Embedded Linux >