Am 13.01.2012 23:43, schrieb Cam Macdonell: > Can this patch be merged, please?
You need to cc qemu-stable if you want it backported to v1.0.x once applied. Andreas > On Mon, Dec 5, 2011 at 12:48 PM, Michael S. Tsirkin <m...@redhat.com> wrote: >> ivshmem used msix but didn't call it on either reset or >> config write paths. This used to partically work since >> guests don't use all of msi-x configuration fields, >> and reset is rarely used, but the patch 'msix: track function masked >> in pci device state' broke that. Fix by adding appropriate calls. >> >> Signed-off-by: Michael S. Tsirkin <m...@redhat.com> >> Reported-by: Cam Macdonell <c...@cs.ualberta.ca> >> Tested-by: Cam Macdonell <c...@cs.ualberta.ca> >> >> --- >> >> Please apply the following to both master >> and 1.0 stable branch. Thanks! >> >> diff --git a/hw/ivshmem.c b/hw/ivshmem.c >> index 242fbea..c58f4d3 100644 >> --- a/hw/ivshmem.c >> +++ b/hw/ivshmem.c >> @@ -500,11 +500,29 @@ static void ivshmem_read(void *opaque, const uint8_t * >> buf, int flags) >> return; >> } >> >> +/* Select the MSI-X vectors used by device. >> + * ivshmem maps events to vectors statically, so >> + * we just enable all vectors on init and after reset. */ >> +static void ivshmem_use_msix(IVShmemState * s) >> +{ >> + int i; >> + >> + if (!msix_present(&s->dev)) { >> + return; >> + } >> + >> + for (i = 0; i < s->vectors; i++) { >> + msix_vector_use(&s->dev, i); >> + } >> +} >> + >> static void ivshmem_reset(DeviceState *d) >> { >> IVShmemState *s = DO_UPCAST(IVShmemState, dev.qdev, d); >> >> s->intrstatus = 0; >> + msix_reset(&s->dev); >> + ivshmem_use_msix(s); >> return; >> } >> >> @@ -535,12 +553,8 @@ static uint64_t ivshmem_get_size(IVShmemState * s) { >> return value; >> } >> >> -static void ivshmem_setup_msi(IVShmemState * s) { >> - >> - int i; >> - >> - /* allocate the MSI-X vectors */ >> - >> +static void ivshmem_setup_msi(IVShmemState * s) >> +{ >> memory_region_init(&s->msix_bar, "ivshmem-msix", 4096); >> if (!msix_init(&s->dev, s->vectors, &s->msix_bar, 1, 0)) { >> pci_register_bar(&s->dev, 1, PCI_BASE_ADDRESS_SPACE_MEMORY, >> @@ -551,13 +565,10 @@ static void ivshmem_setup_msi(IVShmemState * s) { >> exit(1); >> } >> >> - /* 'activate' the vectors */ >> - for (i = 0; i < s->vectors; i++) { >> - msix_vector_use(&s->dev, i); >> - } >> - >> /* allocate Qemu char devices for receiving interrupts */ >> s->eventfd_table = g_malloc0(s->vectors * sizeof(EventfdEntry)); >> + >> + ivshmem_use_msix(s); >> } >> >> static void ivshmem_save(QEMUFile* f, void *opaque) >> @@ -610,6 +621,13 @@ static int ivshmem_load(QEMUFile* f, void *opaque, int >> version_id) >> return 0; >> } >> >> +static void ivshmem_write_config(PCIDevice *pci_dev, uint32_t address, >> + uint32_t val, int len) >> +{ >> + pci_default_write_config(pci_dev, address, val, len); >> + msix_write_config(pci_dev, address, val, len); >> +} >> + >> static int pci_ivshmem_init(PCIDevice *dev) >> { >> IVShmemState *s = DO_UPCAST(IVShmemState, dev, dev); >> @@ -734,6 +752,8 @@ static int pci_ivshmem_init(PCIDevice *dev) >> >> } >> >> + s->dev.config_write = ivshmem_write_config; >> + >> return 0; >> } >> -- SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg