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 <jlar...@linux.vnet.ibm.com> --- 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