Procházet zdrojové kódy

vhost-net: fix improper cleanup in vhost_net_start

vhost_net_start() missed a corresponding stop_one() upon error from
vhost_set_vring_enable(). While at it, make the error handling for
err_start more robust. No real issue was found due to this though.

Signed-off-by: Si-Wei Liu <si-wei.liu@oracle.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Message-Id: <1651890498-24478-5-git-send-email-si-wei.liu@oracle.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Si-Wei Liu před 3 roky
rodič
revize
6f3910b5ee
1 změnil soubory, kde provedl 3 přidání a 1 odebrání
  1. 3 1
      hw/net/vhost_net.c

+ 3 - 1
hw/net/vhost_net.c

@@ -381,6 +381,7 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
             r = vhost_set_vring_enable(peer, peer->vring_enable);
             r = vhost_set_vring_enable(peer, peer->vring_enable);
 
 
             if (r < 0) {
             if (r < 0) {
+                vhost_net_stop_one(get_vhost_net(peer), dev);
                 goto err_start;
                 goto err_start;
             }
             }
         }
         }
@@ -390,7 +391,8 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
 
 
 err_start:
 err_start:
     while (--i >= 0) {
     while (--i >= 0) {
-        peer = qemu_get_peer(ncs , i);
+        peer = qemu_get_peer(ncs, i < data_queue_pairs ?
+                                  i : n->max_queue_pairs);
         vhost_net_stop_one(get_vhost_net(peer), dev);
         vhost_net_stop_one(get_vhost_net(peer), dev);
     }
     }
     e = k->set_guest_notifiers(qbus->parent, total_notifiers, false);
     e = k->set_guest_notifiers(qbus->parent, total_notifiers, false);