net/vhost: fix queue state not reset on destroy
authorRich Lane <rich.lane@bigswitch.com>
Fri, 1 Jul 2016 16:31:12 +0000 (09:31 -0700)
committerYuanhan Liu <yuanhan.liu@linux.intel.com>
Mon, 11 Jul 2016 02:57:39 +0000 (04:57 +0200)
Fixes a bug where rte_eth_vhost_get_queue_event would not return enabled
queues after a guest application restart.

Fixes: ee584e9710b9 ("vhost: add driver on top of the library")

Signed-off-by: Rich Lane <rich.lane@bigswitch.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
drivers/net/vhost/rte_eth_vhost.c

index 596faea..7539cd4 100644 (file)
@@ -303,6 +303,7 @@ destroy_device(int vid)
        struct internal_list *list;
        char ifname[PATH_MAX];
        unsigned i;
+       struct rte_vhost_vring_state *state;
 
        rte_vhost_get_ifname(vid, ifname, sizeof(ifname));
        list = find_internal_resource(ifname);
@@ -345,6 +346,15 @@ destroy_device(int vid)
                vq->vid = -1;
        }
 
+       state = vring_states[eth_dev->data->port_id];
+       rte_spinlock_lock(&state->lock);
+       for (i = 0; i <= state->max_vring; i++) {
+               state->cur[i] = false;
+               state->seen[i] = false;
+       }
+       state->max_vring = 0;
+       rte_spinlock_unlock(&state->lock);
+
        RTE_LOG(INFO, PMD, "Connection closed\n");
 
        _rte_eth_dev_callback_process(eth_dev, RTE_ETH_EVENT_INTR_LSC);