From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34861) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Uju0x-0006IA-Es for qemu-devel@nongnu.org; Tue, 04 Jun 2013 12:23:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Uju0t-0006B4-Ez for qemu-devel@nongnu.org; Tue, 04 Jun 2013 12:23:15 -0400 Received: from e39.co.us.ibm.com ([32.97.110.160]:60486) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Uju0t-0006Ah-9N for qemu-devel@nongnu.org; Tue, 04 Jun 2013 12:23:11 -0400 Received: from /spool/local by e39.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 4 Jun 2013 10:23:10 -0600 Received: from d01relay07.pok.ibm.com (d01relay07.pok.ibm.com [9.56.227.147]) by d01dlp03.pok.ibm.com (Postfix) with ESMTP id 0E7E1C90041 for ; Tue, 4 Jun 2013 12:23:03 -0400 (EDT) Received: from d01av03.pok.ibm.com (d01av03.pok.ibm.com [9.56.224.217]) by d01relay07.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r54GN2M756164576 for ; Tue, 4 Jun 2013 12:23:02 -0400 Received: from d01av03.pok.ibm.com (loopback [127.0.0.1]) by d01av03.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r54GN1RZ031871 for ; Tue, 4 Jun 2013 13:23:02 -0300 From: Jesse Larrew Date: Tue, 4 Jun 2013 11:22:44 -0500 Message-Id: <1370362965-3937-3-git-send-email-jlarrew@linux.vnet.ibm.com> In-Reply-To: <1370362965-3937-1-git-send-email-jlarrew@linux.vnet.ibm.com> References: <1370362965-3937-1-git-send-email-jlarrew@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH 2/3] virtio-net: implement bus_plugged() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: jasowang@redhat.com, Jesse Larrew , mdroth@linux.vnet.ibm.com, fred.konrad@greensocs.com 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 --- 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