Enabling vhost-net encounted an error:
  Fatal: VHOST_NET_SET_BACKEND failed 88

The reason is that vhost-net requires tap_fd for VHOST_NET_SET_BACKEND,
however tap_fd is opened after VIRTIO_CONFIG_S_DRIVER_OK. Because the
initialization needs to know the guest features, I suppose the initialization
could be moved to set_guest_features(). Therefore, initialization can be
finished before status VIRTIO_CONFIG_S_DRIVER_OK, and tap_fd can be set
before vhost-net sets backend.

Signed-off-by: Ying-Shiuan Pan <ys...@itri.org.tw>
---
 tools/kvm/virtio/net.c | 31 ++++++++++---------------------
 1 file changed, 10 insertions(+), 21 deletions(-)

diff --git a/tools/kvm/virtio/net.c b/tools/kvm/virtio/net.c
index 3715aaf..dfc4aad 100644
--- a/tools/kvm/virtio/net.c
+++ b/tools/kvm/virtio/net.c
@@ -389,6 +389,16 @@ static void set_guest_features(struct kvm *kvm, void *dev, 
u32 features)
        struct net_dev *ndev = dev;
 
        ndev->features = features;
+
+       if (ndev->mode == NET_MODE_TAP) {
+               if (!virtio_net__tap_init(ndev))
+                       die_perror("You have requested a TAP device, but 
creation of one has failed because");
+       } else {
+               ndev->info.vnet_hdr_len = has_virtio_feature(ndev, 
VIRTIO_NET_F_MRG_RXBUF) ?
+                                               sizeof(struct 
virtio_net_hdr_mrg_rxbuf) :
+                                               sizeof(struct virtio_net_hdr);
+               uip_init(&ndev->info);
+       }
 }
 
 static bool is_ctrl_vq(struct net_dev *ndev, u32 vq)
@@ -530,8 +540,6 @@ static int set_size_vq(struct kvm *kvm, void *dev, u32 vq, 
int size)
        return size;
 }
 
-static void notify_status(struct kvm *kvm, void *dev, u8 status);
-
 static struct virtio_ops net_dev_virtio_ops = (struct virtio_ops) {
        .get_config             = get_config,
        .get_host_features      = get_host_features,
@@ -543,7 +551,6 @@ static struct virtio_ops net_dev_virtio_ops = (struct 
virtio_ops) {
        .notify_vq              = notify_vq,
        .notify_vq_gsi          = notify_vq_gsi,
        .notify_vq_eventfd      = notify_vq_eventfd,
-       .notify_status          = notify_status,
 };
 
 static void virtio_net__vhost_init(struct kvm *kvm, struct net_dev *ndev)
@@ -731,24 +738,6 @@ static int virtio_net__init_one(struct virtio_net_params 
*params)
        return 0;
 }
 
-static void notify_status(struct kvm *kvm, void *dev, u8 status)
-{
-       struct net_dev *ndev = dev;
-
-       if (!(status & VIRTIO_CONFIG_S_DRIVER_OK))
-               return;
-
-       if (ndev->mode == NET_MODE_TAP) {
-               if (!virtio_net__tap_init(ndev))
-                       die_perror("You have requested a TAP device, but 
creation of one has failed because");
-       } else {
-               ndev->info.vnet_hdr_len = has_virtio_feature(ndev, 
VIRTIO_NET_F_MRG_RXBUF) ?
-                                               sizeof(struct 
virtio_net_hdr_mrg_rxbuf) :
-                                               sizeof(struct virtio_net_hdr);
-               uip_init(&ndev->info);
-       }
-}
-
 int virtio_net__init(struct kvm *kvm)
 {
        int i;
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to