qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 2/3] virtio-net: implement bus_plugged()


From: Jesse Larrew
Subject: [Qemu-devel] [PATCH 2/3] virtio-net: implement bus_plugged()
Date: Tue, 4 Jun 2013 11:22:44 -0500

Use the new bus_plugged() callback to calculate and (if necessary) resize
the config struct based on the requested host_features. This will help to
keep the size of the config struct as small as possible, which will help
prevent it from requiring a larger BAR size as future features are added.

Signed-off-by: Jesse Larrew <address@hidden>
---
 hw/net/virtio-net.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 3a6829c..e09288f 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -21,6 +21,7 @@
 #include "hw/virtio/virtio-net.h"
 #include "net/vhost_net.h"
 #include "hw/virtio/virtio-bus.h"
+#include "hw/virtio/virtio-pci.h"
 
 #define VIRTIO_NET_VM_VERSION    11
 
@@ -1322,6 +1323,7 @@ static void virtio_net_guest_notifier_mask(VirtIODevice 
*vdev, int idx,
 
 void virtio_net_set_config_size(VirtIONet *n, uint32_t host_features)
 {
+    VirtIODevice *vdev = VIRTIO_DEVICE(n);
     int i, config_size = 0;
     host_features |= (1 << VIRTIO_NET_F_MAC);
     for (i = 0; feature_sizes[i].flags != 0; i++) {
@@ -1330,6 +1332,21 @@ void virtio_net_set_config_size(VirtIONet *n, uint32_t 
host_features)
         }
     }
     n->config_size = config_size;
+    assert(config_size != 0);
+    if (config_size != vdev->config_len) {
+        vdev->config = g_realloc(vdev->config, config_size);
+        vdev->config_len = config_size;
+    }
+}
+
+static void virtio_net_bus_plugged(VirtIODevice *vdev)
+{
+    DeviceState *qdev = DEVICE(vdev);
+    BusState *qbus = BUS(qdev_get_parent_bus(qdev));
+    VirtIOPCIProxy *proxy = VIRTIO_PCI(qbus->parent);
+    VirtIONet *n = VIRTIO_NET(vdev);
+
+    virtio_net_set_config_size(n, proxy->host_features);
 }
 
 void virtio_net_set_netclient_name(VirtIONet *n, const char *name,
@@ -1515,6 +1532,7 @@ static void virtio_net_class_init(ObjectClass *klass, 
void *data)
     vdc->set_status = virtio_net_set_status;
     vdc->guest_notifier_mask = virtio_net_guest_notifier_mask;
     vdc->guest_notifier_pending = virtio_net_guest_notifier_pending;
+    vdc->bus_plugged = virtio_net_bus_plugged;
 }
 
 static const TypeInfo virtio_net_info = {
-- 
1.7.11.7




reply via email to

[Prev in Thread] Current Thread [Next in Thread]