This patch sets the 'virtio-net/virtio-mmio' VirtIOMMIOProxy host_features
to all possible virtio-net features supported. Currently most
host_features are
turned off including performance related ones, this impacts virtio network
performance.

Host features update should be done earlier but at the time 'virtio-mmio'
is created the device to be plugged in is unknown.

Signed-off-by: Mario Smarduch <m.smard...@samsung.com>
---
 hw/virtio/virtio-mmio.c |   29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/hw/virtio/virtio-mmio.c b/hw/virtio/virtio-mmio.c
index 8829eb0..1d940b7 100644
--- a/hw/virtio/virtio-mmio.c
+++ b/hw/virtio/virtio-mmio.c
@@ -23,6 +23,7 @@
 #include "hw/virtio/virtio.h"
 #include "qemu/host-utils.h"
 #include "hw/virtio/virtio-bus.h"
+#include "hw/virtio/virtio-net.h"

 /* #define DEBUG_VIRTIO_MMIO */

@@ -92,6 +93,12 @@ typedef struct {
 static void virtio_mmio_bus_new(VirtioBusState *bus, size_t bus_size,
                                 VirtIOMMIOProxy *dev);

+/* all possible virtio-net features supported */
+static Property virtio_mmio_net_properties[] = {
+    DEFINE_VIRTIO_NET_FEATURES(VirtIOMMIOProxy, host_features),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
 static uint64_t virtio_mmio_read(void *opaque, hwaddr offset, unsigned
size)
 {
     VirtIOMMIOProxy *proxy = (VirtIOMMIOProxy *)opaque;
@@ -347,11 +354,33 @@ static void virtio_mmio_reset(DeviceState *d)

 /* virtio-mmio device */

+/* Walk virtio-net possible supported features and set host_features, this
+ * should be done earlier when the object is instantiated but at that point
+ * you don't know what type of device will be plugged in.
+ */
+static void virtio_mmio_set_net_features(Property *prop, uint32_t
*features)
+{
+    for (; prop && prop->name; prop++) {
+        if (prop->defval == true) {
+            *features |= (1 << prop->bitnr);
+        }  else  {
+            *features &= ~(1 << prop->bitnr);
+        }
+    }
+}
+
 /* This is called by virtio-bus just after the device is plugged. */
 static void virtio_mmio_device_plugged(DeviceState *opaque)
 {
     VirtIOMMIOProxy *proxy = VIRTIO_MMIO(opaque);
+    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
+    Object *obj = OBJECT(vdev);

+    /* set host features only for virtio-net */
+    if (object_dynamic_cast(obj, TYPE_VIRTIO_NET)) {
+        virtio_mmio_set_net_features(virtio_mmio_net_properties,
+
&proxy->host_features);
+    }
     proxy->host_features |= (0x1 << VIRTIO_F_NOTIFY_ON_EMPTY);
     proxy->host_features = virtio_bus_get_vdev_features(&proxy->bus,

proxy->host_features);
-- 
1.7.9.5


Reply via email to