From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jianfeng Tan Subject: [PATCH v2] net/virtio-user: fix cannot get initialized Date: Thu, 13 Apr 2017 10:11:27 +0000 Message-ID: <1492078287-138040-1-git-send-email-jianfeng.tan@intel.com> References: <1491551860-15005-1-git-send-email-jianfeng.tan@intel.com> Cc: yuanhan.liu@linux.intel.com, maxime.coquelin@redhat.com, Jianfeng Tan To: dev@dpdk.org Return-path: Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by dpdk.org (Postfix) with ESMTP id 30E5E2C6E for ; Thu, 13 Apr 2017 12:10:41 +0200 (CEST) In-Reply-To: <1491551860-15005-1-git-send-email-jianfeng.tan@intel.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" The feature negotiation in virtio-user is proven to be broken, which results in device initialization failure. Originally, we get features from vhost backend, and remove those that are not supported. But when new feature is added, for example, VIRTIO_NET_F_MTU, we fail to remove this new feature. Then, this new feature will be negotiated, as both frontend and backend claim to support this feature. To fix it, we add a macro to record supported featues, as a filter to remove newly added features. Fixes: 37a7eb2ae816 ("net/virtio-user: add device emulation layer") Signed-off-by: Jianfeng Tan --- drivers/net/virtio/virtio_user/virtio_user_dev.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index 6871cd4..299ee16 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -311,6 +311,25 @@ virtio_user_dev_setup(struct virtio_user_dev *dev) return dev->ops->setup(dev); } +/* Use below macro to filter features from vhost backend */ +#define VIRTIO_USER_SUPPORTED_FEATURES \ + (1ULL << VIRTIO_NET_F_MAC | \ + 1ULL << VIRTIO_NET_F_STATUS | \ + 1ULL << VIRTIO_NET_F_MQ | \ + 1ULL << VIRTIO_NET_F_CTRL_MAC_ADDR | \ + 1ULL << VIRTIO_NET_F_CTRL_VQ | \ + 1ULL << VIRTIO_NET_F_CTRL_RX | \ + 1ULL << VIRTIO_NET_F_CTRL_VLAN | \ + 1ULL << VIRTIO_NET_F_CSUM | \ + 1ULL << VIRTIO_NET_F_HOST_TSO4 | \ + 1ULL << VIRTIO_NET_F_HOST_TSO6 | \ + 1ULL << VIRTIO_NET_F_MRG_RXBUF | \ + 1ULL << VIRTIO_RING_F_INDIRECT_DESC | \ + 1ULL << VIRTIO_NET_F_GUEST_CSUM | \ + 1ULL << VIRTIO_NET_F_GUEST_TSO4 | \ + 1ULL << VIRTIO_NET_F_GUEST_TSO6 | \ + 1ULL << VIRTIO_F_VERSION_1) + int virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, int cq, int queue_size, const char *mac, char **ifname) @@ -362,6 +381,8 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, /* The backend will not report this feature, we add it explicitly */ dev->device_features |= (1ull << VIRTIO_NET_F_STATUS); + dev->device_features &= VIRTIO_USER_SUPPORTED_FEATURES; + return 0; } -- 2.7.4