yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone
9ae3a8
From 20d6241976e9adff2ae4a52defb8d8074ccbeff6 Mon Sep 17 00:00:00 2001
9ae3a8
From: Markus Armbruster <armbru@redhat.com>
9ae3a8
Date: Thu, 23 Jan 2014 14:03:32 +0100
9ae3a8
Subject: [PATCH 05/14] virtio-pci: remove vdev field
9ae3a8
9ae3a8
RH-Author: Markus Armbruster <armbru@redhat.com>
9ae3a8
Message-id: <1390485820-7585-3-git-send-email-armbru@redhat.com>
9ae3a8
Patchwork-id: 56925
9ae3a8
O-Subject: [PATCH 7.0 qemu-kvm 02/10] virtio-pci: remove vdev field
9ae3a8
Bugzilla: 983344
9ae3a8
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
9ae3a8
RH-Acked-by: Marcel Apfelbaum <marcel.a@redhat.com>
9ae3a8
RH-Acked-by: Michael S. Tsirkin <mst@redhat.com>
9ae3a8
9ae3a8
From: Paolo Bonzini <pbonzini@redhat.com>
9ae3a8
9ae3a8
The vdev field is complicated to synchronize.  Just access the
9ae3a8
BusState's list of children.
9ae3a8
9ae3a8
Cc: qemu-stable@nongnu.org
9ae3a8
Acked-by: Andreas Faerber <afaerber@suse.de>
9ae3a8
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
9ae3a8
(cherry picked from commit a3fc66d9fd37acbfcee013692246a8ae42bd93bb)
9ae3a8
9ae3a8
Conflicts:
9ae3a8
	hw/virtio/virtio-pci.c
9ae3a8
9ae3a8
Conflicts because we lack commit 9e64f8a "hw: set interrupts using pci
9ae3a8
irq wrappers".
9ae3a8
Signed-off-by: Markus Armbruster <armbru@redhat.com>
9ae3a8
---
9ae3a8
 hw/virtio/virtio-pci.c | 110 +++++++++++++++++++++++++++++--------------------
9ae3a8
 hw/virtio/virtio-pci.h |   1 -
9ae3a8
 2 files changed, 65 insertions(+), 46 deletions(-)
9ae3a8
9ae3a8
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
---
9ae3a8
 hw/virtio/virtio-pci.c |  110 ++++++++++++++++++++++++++++-------------------
9ae3a8
 hw/virtio/virtio-pci.h |    1 -
9ae3a8
 2 files changed, 65 insertions(+), 46 deletions(-)
9ae3a8
9ae3a8
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
9ae3a8
index 1287e59..02ddbe9 100644
9ae3a8
--- a/hw/virtio/virtio-pci.c
9ae3a8
+++ b/hw/virtio/virtio-pci.c
9ae3a8
@@ -118,31 +118,40 @@ static inline VirtIOPCIProxy *to_virtio_pci_proxy_fast(DeviceState *d)
9ae3a8
 static void virtio_pci_notify(DeviceState *d, uint16_t vector)
9ae3a8
 {
9ae3a8
     VirtIOPCIProxy *proxy = to_virtio_pci_proxy_fast(d);
9ae3a8
+
9ae3a8
     if (msix_enabled(&proxy->pci_dev))
9ae3a8
         msix_notify(&proxy->pci_dev, vector);
9ae3a8
-    else
9ae3a8
-        qemu_set_irq(proxy->pci_dev.irq[0], proxy->vdev->isr & 1);
9ae3a8
+    else {
9ae3a8
+        VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
+        qemu_set_irq(proxy->pci_dev.irq[0], vdev->isr & 1);
9ae3a8
+    }
9ae3a8
 }
9ae3a8
 
9ae3a8
 static void virtio_pci_save_config(DeviceState *d, QEMUFile *f)
9ae3a8
 {
9ae3a8
     VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
+
9ae3a8
     pci_device_save(&proxy->pci_dev, f);
9ae3a8
     msix_save(&proxy->pci_dev, f);
9ae3a8
     if (msix_present(&proxy->pci_dev))
9ae3a8
-        qemu_put_be16(f, proxy->vdev->config_vector);
9ae3a8
+        qemu_put_be16(f, vdev->config_vector);
9ae3a8
 }
9ae3a8
 
9ae3a8
 static void virtio_pci_save_queue(DeviceState *d, int n, QEMUFile *f)
9ae3a8
 {
9ae3a8
     VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
+
9ae3a8
     if (msix_present(&proxy->pci_dev))
9ae3a8
-        qemu_put_be16(f, virtio_queue_vector(proxy->vdev, n));
9ae3a8
+        qemu_put_be16(f, virtio_queue_vector(vdev, n));
9ae3a8
 }
9ae3a8
 
9ae3a8
 static int virtio_pci_load_config(DeviceState *d, QEMUFile *f)
9ae3a8
 {
9ae3a8
     VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
+
9ae3a8
     int ret;
9ae3a8
     ret = pci_device_load(&proxy->pci_dev, f);
9ae3a8
     if (ret) {
9ae3a8
@@ -151,12 +160,12 @@ static int virtio_pci_load_config(DeviceState *d, QEMUFile *f)
9ae3a8
     msix_unuse_all_vectors(&proxy->pci_dev);
9ae3a8
     msix_load(&proxy->pci_dev, f);
9ae3a8
     if (msix_present(&proxy->pci_dev)) {
9ae3a8
-        qemu_get_be16s(f, &proxy->vdev->config_vector);
9ae3a8
+        qemu_get_be16s(f, &vdev->config_vector);
9ae3a8
     } else {
9ae3a8
-        proxy->vdev->config_vector = VIRTIO_NO_VECTOR;
9ae3a8
+        vdev->config_vector = VIRTIO_NO_VECTOR;
9ae3a8
     }
9ae3a8
-    if (proxy->vdev->config_vector != VIRTIO_NO_VECTOR) {
9ae3a8
-        return msix_vector_use(&proxy->pci_dev, proxy->vdev->config_vector);
9ae3a8
+    if (vdev->config_vector != VIRTIO_NO_VECTOR) {
9ae3a8
+        return msix_vector_use(&proxy->pci_dev, vdev->config_vector);
9ae3a8
     }
9ae3a8
     return 0;
9ae3a8
 }
9ae3a8
@@ -164,13 +173,15 @@ static int virtio_pci_load_config(DeviceState *d, QEMUFile *f)
9ae3a8
 static int virtio_pci_load_queue(DeviceState *d, int n, QEMUFile *f)
9ae3a8
 {
9ae3a8
     VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
+
9ae3a8
     uint16_t vector;
9ae3a8
     if (msix_present(&proxy->pci_dev)) {
9ae3a8
         qemu_get_be16s(f, &vector);
9ae3a8
     } else {
9ae3a8
         vector = VIRTIO_NO_VECTOR;
9ae3a8
     }
9ae3a8
-    virtio_queue_set_vector(proxy->vdev, n, vector);
9ae3a8
+    virtio_queue_set_vector(vdev, n, vector);
9ae3a8
     if (vector != VIRTIO_NO_VECTOR) {
9ae3a8
         return msix_vector_use(&proxy->pci_dev, vector);
9ae3a8
     }
9ae3a8
@@ -180,7 +191,8 @@ static int virtio_pci_load_queue(DeviceState *d, int n, QEMUFile *f)
9ae3a8
 static int virtio_pci_set_host_notifier_internal(VirtIOPCIProxy *proxy,
9ae3a8
                                                  int n, bool assign, bool set_handler)
9ae3a8
 {
9ae3a8
-    VirtQueue *vq = virtio_get_queue(proxy->vdev, n);
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
+    VirtQueue *vq = virtio_get_queue(vdev, n);
9ae3a8
     EventNotifier *notifier = virtio_queue_get_host_notifier(vq);
9ae3a8
     int r = 0;
9ae3a8
 
9ae3a8
@@ -205,6 +217,7 @@ static int virtio_pci_set_host_notifier_internal(VirtIOPCIProxy *proxy,
9ae3a8
 
9ae3a8
 static void virtio_pci_start_ioeventfd(VirtIOPCIProxy *proxy)
9ae3a8
 {
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
     int n, r;
9ae3a8
 
9ae3a8
     if (!(proxy->flags & VIRTIO_PCI_FLAG_USE_IOEVENTFD) ||
9ae3a8
@@ -214,7 +227,7 @@ static void virtio_pci_start_ioeventfd(VirtIOPCIProxy *proxy)
9ae3a8
     }
9ae3a8
 
9ae3a8
     for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
9ae3a8
-        if (!virtio_queue_get_num(proxy->vdev, n)) {
9ae3a8
+        if (!virtio_queue_get_num(vdev, n)) {
9ae3a8
             continue;
9ae3a8
         }
9ae3a8
 
9ae3a8
@@ -228,7 +241,7 @@ static void virtio_pci_start_ioeventfd(VirtIOPCIProxy *proxy)
9ae3a8
 
9ae3a8
 assign_error:
9ae3a8
     while (--n >= 0) {
9ae3a8
-        if (!virtio_queue_get_num(proxy->vdev, n)) {
9ae3a8
+        if (!virtio_queue_get_num(vdev, n)) {
9ae3a8
             continue;
9ae3a8
         }
9ae3a8
 
9ae3a8
@@ -241,6 +254,7 @@ assign_error:
9ae3a8
 
9ae3a8
 static void virtio_pci_stop_ioeventfd(VirtIOPCIProxy *proxy)
9ae3a8
 {
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
     int r;
9ae3a8
     int n;
9ae3a8
 
9ae3a8
@@ -249,7 +263,7 @@ static void virtio_pci_stop_ioeventfd(VirtIOPCIProxy *proxy)
9ae3a8
     }
9ae3a8
 
9ae3a8
     for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
9ae3a8
-        if (!virtio_queue_get_num(proxy->vdev, n)) {
9ae3a8
+        if (!virtio_queue_get_num(vdev, n)) {
9ae3a8
             continue;
9ae3a8
         }
9ae3a8
 
9ae3a8
@@ -262,7 +276,7 @@ static void virtio_pci_stop_ioeventfd(VirtIOPCIProxy *proxy)
9ae3a8
 static void virtio_ioport_write(void *opaque, uint32_t addr, uint32_t val)
9ae3a8
 {
9ae3a8
     VirtIOPCIProxy *proxy = opaque;
9ae3a8
-    VirtIODevice *vdev = proxy->vdev;
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
     hwaddr pa;
9ae3a8
 
9ae3a8
     switch (addr) {
9ae3a8
@@ -277,7 +291,7 @@ static void virtio_ioport_write(void *opaque, uint32_t addr, uint32_t val)
9ae3a8
         pa = (hwaddr)val << VIRTIO_PCI_QUEUE_ADDR_SHIFT;
9ae3a8
         if (pa == 0) {
9ae3a8
             virtio_pci_stop_ioeventfd(proxy);
9ae3a8
-            virtio_reset(proxy->vdev);
9ae3a8
+            virtio_reset(vdev);
9ae3a8
             msix_unuse_all_vectors(&proxy->pci_dev);
9ae3a8
         }
9ae3a8
         else
9ae3a8
@@ -304,7 +318,7 @@ static void virtio_ioport_write(void *opaque, uint32_t addr, uint32_t val)
9ae3a8
         }
9ae3a8
 
9ae3a8
         if (vdev->status == 0) {
9ae3a8
-            virtio_reset(proxy->vdev);
9ae3a8
+            virtio_reset(vdev);
9ae3a8
             msix_unuse_all_vectors(&proxy->pci_dev);
9ae3a8
         }
9ae3a8
 
9ae3a8
@@ -340,7 +354,7 @@ static void virtio_ioport_write(void *opaque, uint32_t addr, uint32_t val)
9ae3a8
 
9ae3a8
 static uint32_t virtio_ioport_read(VirtIOPCIProxy *proxy, uint32_t addr)
9ae3a8
 {
9ae3a8
-    VirtIODevice *vdev = proxy->vdev;
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
     uint32_t ret = 0xFFFFFFFF;
9ae3a8
 
9ae3a8
     switch (addr) {
9ae3a8
@@ -386,6 +400,7 @@ static uint64_t virtio_pci_config_read(void *opaque, hwaddr addr,
9ae3a8
                                        unsigned size)
9ae3a8
 {
9ae3a8
     VirtIOPCIProxy *proxy = opaque;
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
     uint32_t config = VIRTIO_PCI_CONFIG(&proxy->pci_dev);
9ae3a8
     uint64_t val = 0;
9ae3a8
     if (addr < config) {
9ae3a8
@@ -395,16 +410,16 @@ static uint64_t virtio_pci_config_read(void *opaque, hwaddr addr,
9ae3a8
 
9ae3a8
     switch (size) {
9ae3a8
     case 1:
9ae3a8
-        val = virtio_config_readb(proxy->vdev, addr);
9ae3a8
+        val = virtio_config_readb(vdev, addr);
9ae3a8
         break;
9ae3a8
     case 2:
9ae3a8
-        val = virtio_config_readw(proxy->vdev, addr);
9ae3a8
+        val = virtio_config_readw(vdev, addr);
9ae3a8
         if (virtio_is_big_endian()) {
9ae3a8
             val = bswap16(val);
9ae3a8
         }
9ae3a8
         break;
9ae3a8
     case 4:
9ae3a8
-        val = virtio_config_readl(proxy->vdev, addr);
9ae3a8
+        val = virtio_config_readl(vdev, addr);
9ae3a8
         if (virtio_is_big_endian()) {
9ae3a8
             val = bswap32(val);
9ae3a8
         }
9ae3a8
@@ -418,6 +433,7 @@ static void virtio_pci_config_write(void *opaque, hwaddr addr,
9ae3a8
 {
9ae3a8
     VirtIOPCIProxy *proxy = opaque;
9ae3a8
     uint32_t config = VIRTIO_PCI_CONFIG(&proxy->pci_dev);
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
     if (addr < config) {
9ae3a8
         virtio_ioport_write(proxy, addr, val);
9ae3a8
         return;
9ae3a8
@@ -429,19 +445,19 @@ static void virtio_pci_config_write(void *opaque, hwaddr addr,
9ae3a8
      */
9ae3a8
     switch (size) {
9ae3a8
     case 1:
9ae3a8
-        virtio_config_writeb(proxy->vdev, addr, val);
9ae3a8
+        virtio_config_writeb(vdev, addr, val);
9ae3a8
         break;
9ae3a8
     case 2:
9ae3a8
         if (virtio_is_big_endian()) {
9ae3a8
             val = bswap16(val);
9ae3a8
         }
9ae3a8
-        virtio_config_writew(proxy->vdev, addr, val);
9ae3a8
+        virtio_config_writew(vdev, addr, val);
9ae3a8
         break;
9ae3a8
     case 4:
9ae3a8
         if (virtio_is_big_endian()) {
9ae3a8
             val = bswap32(val);
9ae3a8
         }
9ae3a8
-        virtio_config_writel(proxy->vdev, addr, val);
9ae3a8
+        virtio_config_writel(vdev, addr, val);
9ae3a8
         break;
9ae3a8
     }
9ae3a8
 }
9ae3a8
@@ -460,6 +476,7 @@ static void virtio_write_config(PCIDevice *pci_dev, uint32_t address,
9ae3a8
                                 uint32_t val, int len)
9ae3a8
 {
9ae3a8
     VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
 
9ae3a8
     pci_default_write_config(pci_dev, address, val, len);
9ae3a8
 
9ae3a8
@@ -467,8 +484,7 @@ static void virtio_write_config(PCIDevice *pci_dev, uint32_t address,
9ae3a8
         !(pci_dev->config[PCI_COMMAND] & PCI_COMMAND_MASTER) &&
9ae3a8
         !(proxy->flags & VIRTIO_PCI_FLAG_BUS_MASTER_BUG)) {
9ae3a8
         virtio_pci_stop_ioeventfd(proxy);
9ae3a8
-        virtio_set_status(proxy->vdev,
9ae3a8
-                          proxy->vdev->status & ~VIRTIO_CONFIG_S_DRIVER_OK);
9ae3a8
+        virtio_set_status(vdev, vdev->status & ~VIRTIO_CONFIG_S_DRIVER_OK);
9ae3a8
     }
9ae3a8
 }
9ae3a8
 
9ae3a8
@@ -511,7 +527,8 @@ static int kvm_virtio_pci_irqfd_use(VirtIOPCIProxy *proxy,
9ae3a8
                                  unsigned int vector)
9ae3a8
 {
9ae3a8
     VirtIOIRQFD *irqfd = &proxy->vector_irqfd[vector];
9ae3a8
-    VirtQueue *vq = virtio_get_queue(proxy->vdev, queue_no);
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
+    VirtQueue *vq = virtio_get_queue(vdev, queue_no);
9ae3a8
     EventNotifier *n = virtio_queue_get_guest_notifier(vq);
9ae3a8
     int ret;
9ae3a8
     ret = kvm_irqchip_add_irqfd_notifier(kvm_state, n, irqfd->virq);
9ae3a8
@@ -522,7 +539,8 @@ static void kvm_virtio_pci_irqfd_release(VirtIOPCIProxy *proxy,
9ae3a8
                                       unsigned int queue_no,
9ae3a8
                                       unsigned int vector)
9ae3a8
 {
9ae3a8
-    VirtQueue *vq = virtio_get_queue(proxy->vdev, queue_no);
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
+    VirtQueue *vq = virtio_get_queue(vdev, queue_no);
9ae3a8
     EventNotifier *n = virtio_queue_get_guest_notifier(vq);
9ae3a8
     VirtIOIRQFD *irqfd = &proxy->vector_irqfd[vector];
9ae3a8
     int ret;
9ae3a8
@@ -534,7 +552,7 @@ static void kvm_virtio_pci_irqfd_release(VirtIOPCIProxy *proxy,
9ae3a8
 static int kvm_virtio_pci_vector_use(VirtIOPCIProxy *proxy, int nvqs)
9ae3a8
 {
9ae3a8
     PCIDevice *dev = &proxy->pci_dev;
9ae3a8
-    VirtIODevice *vdev = proxy->vdev;
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
     VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
9ae3a8
     unsigned int vector;
9ae3a8
     int ret, queue_no;
9ae3a8
@@ -583,7 +601,7 @@ undo:
9ae3a8
 static void kvm_virtio_pci_vector_release(VirtIOPCIProxy *proxy, int nvqs)
9ae3a8
 {
9ae3a8
     PCIDevice *dev = &proxy->pci_dev;
9ae3a8
-    VirtIODevice *vdev = proxy->vdev;
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
     unsigned int vector;
9ae3a8
     int queue_no;
9ae3a8
     VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
9ae3a8
@@ -611,8 +629,9 @@ static int virtio_pci_vq_vector_unmask(VirtIOPCIProxy *proxy,
9ae3a8
                                        unsigned int vector,
9ae3a8
                                        MSIMessage msg)
9ae3a8
 {
9ae3a8
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(proxy->vdev);
9ae3a8
-    VirtQueue *vq = virtio_get_queue(proxy->vdev, queue_no);
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
+    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
9ae3a8
+    VirtQueue *vq = virtio_get_queue(vdev, queue_no);
9ae3a8
     EventNotifier *n = virtio_queue_get_guest_notifier(vq);
9ae3a8
     VirtIOIRQFD *irqfd;
9ae3a8
     int ret = 0;
9ae3a8
@@ -631,10 +650,10 @@ static int virtio_pci_vq_vector_unmask(VirtIOPCIProxy *proxy,
9ae3a8
      * Otherwise, set it up now.
9ae3a8
      */
9ae3a8
     if (k->guest_notifier_mask) {
9ae3a8
-        k->guest_notifier_mask(proxy->vdev, queue_no, false);
9ae3a8
+        k->guest_notifier_mask(vdev, queue_no, false);
9ae3a8
         /* Test after unmasking to avoid losing events. */
9ae3a8
         if (k->guest_notifier_pending &&
9ae3a8
-            k->guest_notifier_pending(proxy->vdev, queue_no)) {
9ae3a8
+            k->guest_notifier_pending(vdev, queue_no)) {
9ae3a8
             event_notifier_set(n);
9ae3a8
         }
9ae3a8
     } else {
9ae3a8
@@ -647,13 +666,14 @@ static void virtio_pci_vq_vector_mask(VirtIOPCIProxy *proxy,
9ae3a8
                                              unsigned int queue_no,
9ae3a8
                                              unsigned int vector)
9ae3a8
 {
9ae3a8
-    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(proxy->vdev);
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
+    VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
9ae3a8
 
9ae3a8
     /* If guest supports masking, keep irqfd but mask it.
9ae3a8
      * Otherwise, clean it up now.
9ae3a8
      */ 
9ae3a8
     if (k->guest_notifier_mask) {
9ae3a8
-        k->guest_notifier_mask(proxy->vdev, queue_no, true);
9ae3a8
+        k->guest_notifier_mask(vdev, queue_no, true);
9ae3a8
     } else {
9ae3a8
         kvm_virtio_pci_irqfd_release(proxy, queue_no, vector);
9ae3a8
     }
9ae3a8
@@ -663,7 +683,7 @@ static int virtio_pci_vector_unmask(PCIDevice *dev, unsigned vector,
9ae3a8
                                     MSIMessage msg)
9ae3a8
 {
9ae3a8
     VirtIOPCIProxy *proxy = container_of(dev, VirtIOPCIProxy, pci_dev);
9ae3a8
-    VirtIODevice *vdev = proxy->vdev;
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
     int ret, queue_no;
9ae3a8
 
9ae3a8
     for (queue_no = 0; queue_no < proxy->nvqs_with_notifiers; queue_no++) {
9ae3a8
@@ -693,7 +713,7 @@ undo:
9ae3a8
 static void virtio_pci_vector_mask(PCIDevice *dev, unsigned vector)
9ae3a8
 {
9ae3a8
     VirtIOPCIProxy *proxy = container_of(dev, VirtIOPCIProxy, pci_dev);
9ae3a8
-    VirtIODevice *vdev = proxy->vdev;
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
     int queue_no;
9ae3a8
 
9ae3a8
     for (queue_no = 0; queue_no < proxy->nvqs_with_notifiers; queue_no++) {
9ae3a8
@@ -712,7 +732,7 @@ static void virtio_pci_vector_poll(PCIDevice *dev,
9ae3a8
                                    unsigned int vector_end)
9ae3a8
 {
9ae3a8
     VirtIOPCIProxy *proxy = container_of(dev, VirtIOPCIProxy, pci_dev);
9ae3a8
-    VirtIODevice *vdev = proxy->vdev;
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
     VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
9ae3a8
     int queue_no;
9ae3a8
     unsigned int vector;
9ae3a8
@@ -744,8 +764,9 @@ static int virtio_pci_set_guest_notifier(DeviceState *d, int n, bool assign,
9ae3a8
                                          bool with_irqfd)
9ae3a8
 {
9ae3a8
     VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
9ae3a8
-    VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(proxy->vdev);
9ae3a8
-    VirtQueue *vq = virtio_get_queue(proxy->vdev, n);
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
+    VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(vdev);
9ae3a8
+    VirtQueue *vq = virtio_get_queue(vdev, n);
9ae3a8
     EventNotifier *notifier = virtio_queue_get_guest_notifier(vq);
9ae3a8
 
9ae3a8
     if (assign) {
9ae3a8
@@ -760,7 +781,7 @@ static int virtio_pci_set_guest_notifier(DeviceState *d, int n, bool assign,
9ae3a8
     }
9ae3a8
 
9ae3a8
     if (!msix_enabled(&proxy->pci_dev) && vdc->guest_notifier_mask) {
9ae3a8
-        vdc->guest_notifier_mask(proxy->vdev, n, !assign);
9ae3a8
+        vdc->guest_notifier_mask(vdev, n, !assign);
9ae3a8
     }
9ae3a8
 
9ae3a8
     return 0;
9ae3a8
@@ -775,7 +796,7 @@ static bool virtio_pci_query_guest_notifiers(DeviceState *d)
9ae3a8
 static int virtio_pci_set_guest_notifiers(DeviceState *d, int nvqs, bool assign)
9ae3a8
 {
9ae3a8
     VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
9ae3a8
-    VirtIODevice *vdev = proxy->vdev;
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
     VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
9ae3a8
     int r, n;
9ae3a8
     bool with_irqfd = msix_enabled(&proxy->pci_dev) &&
9ae3a8
@@ -869,11 +890,12 @@ static int virtio_pci_set_host_notifier(DeviceState *d, int n, bool assign)
9ae3a8
 static void virtio_pci_vmstate_change(DeviceState *d, bool running)
9ae3a8
 {
9ae3a8
     VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
9ae3a8
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
9ae3a8
 
9ae3a8
     if (running) {
9ae3a8
         /* Try to find out if the guest has bus master disabled, but is
9ae3a8
            in ready state. Then we have a buggy guest OS. */
9ae3a8
-        if ((proxy->vdev->status & VIRTIO_CONFIG_S_DRIVER_OK) &&
9ae3a8
+        if ((vdev->status & VIRTIO_CONFIG_S_DRIVER_OK) &&
9ae3a8
             !(proxy->pci_dev.config[PCI_COMMAND] & PCI_COMMAND_MASTER)) {
9ae3a8
             proxy->flags |= VIRTIO_PCI_FLAG_BUS_MASTER_BUG;
9ae3a8
         }
9ae3a8
@@ -948,8 +970,6 @@ static void virtio_pci_device_plugged(DeviceState *d)
9ae3a8
     uint8_t *config;
9ae3a8
     uint32_t size;
9ae3a8
 
9ae3a8
-    proxy->vdev = virtio_bus_get_device(bus);
9ae3a8
-
9ae3a8
     config = proxy->pci_dev.config;
9ae3a8
     if (proxy->class_code) {
9ae3a8
         pci_config_set_class(config, proxy->class_code);
9ae3a8
diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h
9ae3a8
index 917bcc5..dc332ae 100644
9ae3a8
--- a/hw/virtio/virtio-pci.h
9ae3a8
+++ b/hw/virtio/virtio-pci.h
9ae3a8
@@ -82,7 +82,6 @@ typedef struct VirtioPCIClass {
9ae3a8
 
9ae3a8
 struct VirtIOPCIProxy {
9ae3a8
     PCIDevice pci_dev;
9ae3a8
-    VirtIODevice *vdev;
9ae3a8
     MemoryRegion bar;
9ae3a8
     uint32_t flags;
9ae3a8
     uint32_t class_code;
9ae3a8
-- 
9ae3a8
1.7.1
9ae3a8