qemu/msi: fix segfault in msix_save
PATCH v5 1/5 qemu/msi: fix segfault in msix_save
In reply to a message not in the archiveThis fixes segfault reported by Kevin Wolf,
and simplifies the code in msix_save.
--- hw/msix.c | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-)
hw/msix.c +7 -5
@@ -284,11 +284,13 @@ int msix_uninit(PCIDevice *dev)void msix_save (PCIDevice *dev,QEMUFile *f) { -unsigned nentries = (pci_get_word (dev->config +PCI_MSIX_FLAGS ) & -PCI_MSIX_FLAGS_QSIZE ) +1 ; -qemu_put_buffer (f, dev->msix_table_page, nentries *MSIX_ENTRY_SIZE ); -qemu_put_buffer (f, dev->msix_table_page +MSIX_PAGE_PENDING , - (nentries +7 ) /8 ); +unsigned n = dev->msix_entries_nr; + +if (!(dev->cap_present &QEMU_PCI_CAP_MSIX )) { +return ; + } +qemu_put_buffer (f, dev->msix_table_page, n *MSIX_ENTRY_SIZE ); +qemu_put_buffer (f, dev->msix_table_page +MSIX_PAGE_PENDING , (n +7 ) /8 ); }/* Should be called after restoring the config space. */
Signature · 1 line
1.6.2.2
PATCH v5 2/5 qemu/virtio: remove control vector save
In reply to a message not in the archivecontrol vector is already saved/restored by virtio-pci, it does not need to be done in virtio.
--- hw/virtio.c | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-)
hw/virtio.c +0 -3
@@ -626,9 +626,6 @@ void virtio_save(VirtIODevice *vdev, QEMUFile *f)qemu_put_be32 (f, vdev->config_len);qemu_put_buffer (f, vdev->config, vdev->config_len); -if (vdev->nvectors) -qemu_put_be16s (f, &vdev->config_vector); -for (i =0 ; i <VIRTIO_PCI_QUEUE_MAX ; i++) {if (vdev->vq[i].vring.num ==0 )break ;
Signature · 1 line
1.6.2.2
PATCH v5 3/5 qemu/msi: clean used vectors state on load
In reply to a message not in the archiveClean up msix vector usage state on load. Since guest might have control over it through the device, the device will have to load this state from file.
--- hw/msix.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
hw/msix.c +1 -0
@@ -301,6 +301,7 @@ void msix_load(PCIDevice *dev, QEMUFile *f)if (!dev->cap_present &QEMU_PCI_CAP_MSIX )return ; +msix_free_irq_entries (dev);qemu_get_buffer (f, dev->msix_table_page, n *MSIX_ENTRY_SIZE );qemu_get_buffer (f, dev->msix_table_page +MSIX_PAGE_PENDING , (n +7 ) /8 ); }
Signature · 1 line
1.6.2.2
PATCH v5 4/5 qemu/msi: missing braces
In reply to a message not in the archiveMSIX present bit is tested incorrectly, and only happens to work because the bit we are testing is 0x1. Add braces to fix this.
--- hw/msix.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
hw/msix.c +2 -2
@@ -298,9 +298,9 @@ void msix_load(PCIDevice *dev, QEMUFile *f) {unsigned n = dev->msix_entries_nr; -if (!dev->cap_present &QEMU_PCI_CAP_MSIX ) +if (!(dev->cap_present &QEMU_PCI_CAP_MSIX )) {return ; - + }msix_free_irq_entries (dev);qemu_get_buffer (f, dev->msix_table_page, n *MSIX_ENTRY_SIZE );qemu_get_buffer (f, dev->msix_table_page +MSIX_PAGE_PENDING , (n +7 ) /8 );
Signature · 1 line
1.6.2.2
PATCH v5 5/5 qemu/virtio: mark msi vectors used on load
In reply to a message not in the archiveUsage of msi vectors is controlled by the guest and so needs to be restored on load. Do this for msi vectors used by the virtio device.
--- hw/virtio-pci.c | 22 +++++++++++++++++----- 1 files changed, 17 insertions(+), 5 deletions(-)
hw/virtio-pci.c +17 -5
@@ -126,11 +126,18 @@ static int virtio_pci_load_config(void * opaque, QEMUFile *f)VirtIOPCIProxy *proxy = opaque;int ret; ret =pci_device_load (&proxy->pci_dev, f); -if (ret) +if (ret) {return ret; + }msix_load (&proxy->pci_dev, f); -if (msix_present (&proxy->pci_dev)) +if (msix_present (&proxy->pci_dev)) {qemu_get_be16s (f, &proxy->vdev->config_vector); + }else { + proxy->vdev->config_vector =VIRTIO_NO_VECTOR ; + } +if (proxy->vdev->config_vector !=VIRTIO_NO_VECTOR ) { +return msix_vector_use (&proxy->pci_dev, proxy->vdev->config_vector); + }return 0 ; }
@@ -138,10 +145,15 @@ static int virtio_pci_load_queue(void * opaque, int n, QEMUFile *f) {VirtIOPCIProxy *proxy = opaque;uint16_t vector; -if (!msix_present (&proxy->pci_dev)) -return 0 ; -qemu_get_be16s (f, &vector); +if (msix_present (&proxy->pci_dev)) { +qemu_get_be16s (f, &vector); + }else { + vector =VIRTIO_NO_VECTOR ; + }virtio_queue_set_vector (proxy->vdev, n, vector); +if (vector !=VIRTIO_NO_VECTOR ) { +return msix_vector_use (&proxy->pci_dev, vector); + }return 0 ; }
Signature · 1 line
1.6.2.2
Quoted 5 lines · On Sun, 5 Jul 2009 15:58:23 +0300 "Michael S. Tsirkin" <[email protected]> wrote:
This fixes segfault reported by Kevin Wolf,
and simplifies the code inmsix_save.Reported-by Kevin Wolf <[email protected]>Signed-off-by Michael S. Tsirkin <[email protected]>
Any reason on why this wasn't applied yet?
Spent some time bisecting this just to find out it's already
fixed. I'm unable to migrate w/o this one.
Quoted 7 lines · Luiz Capitulino
Quoted 3 lines · On Sun, 5 Jul 2009 15:58:23 +0300 "Michael S. Tsirkin" <[email protected]> wrote:
This fixes segfault reported by Kevin Wolf,
and simplifies the code inmsix_save.
Quoted 9 lines
Quoted 3 lines
Reported-by Kevin Wolf <[email protected]>Signed-off-by Michael S. Tsirkin <[email protected]>Any reason on why this wasn't applied yet?
Spent some time bisecting this just to find out it's already
fixed. I'm unable to migrate w/o this one.
It was just posted on Sunday, give a chance for people to review it and apply.
Signature · 3 lines
Regards, Anthony Liguori