This patch adds the ability to negotiate VIRTIO_F_IN_ORDER bit for vhost-vdpa backend when the underlying device supports this feature. This would aid in reaping performance benefits with HW devices that implement this feature. At the same time, it shouldn't have any negative impact as vhost-vdpa backend doesn't involve any userspace virtqueue operations.
Signed-off-by: Gautam Dawar <gda...@xilinx.com> --- hw/net/virtio-net.c | 10 ++++++++++ net/vhost-vdpa.c | 1 + 2 files changed, 11 insertions(+) diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index cf8ab0f8af..a1089d06f6 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -3507,11 +3507,21 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) nc->rxfilter_notify_enabled = 1; if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) { + uint64_t features = BIT_ULL(VIRTIO_F_IN_ORDER); struct virtio_net_config netcfg = {}; + memcpy(&netcfg.mac, &n->nic_conf.macaddr, ETH_ALEN); vhost_net_set_config(get_vhost_net(nc->peer), (uint8_t *)&netcfg, 0, ETH_ALEN, VHOST_SET_CONFIG_TYPE_MASTER); + + /* + * For vhost-vdpa, if underlying device supports IN_ORDER feature, + * make it available for negotiation. + */ + features = vhost_net_get_features(get_vhost_net(nc->peer), features); + n->host_features |= features; } + QTAILQ_INIT(&n->rsc_chains); n->qdev = dev; diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c index 25dd6dd975..2886cba5ec 100644 --- a/net/vhost-vdpa.c +++ b/net/vhost-vdpa.c @@ -62,6 +62,7 @@ const int vdpa_feature_bits[] = { VIRTIO_NET_F_CTRL_VQ, VIRTIO_F_IOMMU_PLATFORM, VIRTIO_F_RING_PACKED, + VIRTIO_F_IN_ORDER, VIRTIO_NET_F_RSS, VIRTIO_NET_F_HASH_REPORT, VIRTIO_NET_F_GUEST_ANNOUNCE, -- 2.30.1