[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