net/virtio: fix crash when closing twice

This commit fixs segment fault when rte_eth_dev_close() is called on
a virtio dev more than once.  Assigning zero after free to avoids
freed memory to be accessed again.

Fixes: 69c80d4ef8 ("net/virtio: allocate queue at init stage")
Cc: stable@dpdk.org

Signed-off-by: Huanle Han <hanxueluo@gmail.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
This commit is contained in:
Huanle Han 2017-02-20 22:04:46 +08:00 committed by Yuanhan Liu
parent 2c2201fb07
commit 0e78cfddc0
2 changed files with 7 additions and 0 deletions

View File

@ -546,6 +546,9 @@ virtio_free_queues(struct virtio_hw *hw)
int queue_type;
uint16_t i;
if (hw->vqs == NULL)
return;
for (i = 0; i < nr_vq; i++) {
vq = hw->vqs[i];
if (!vq)
@ -564,9 +567,11 @@ virtio_free_queues(struct virtio_hw *hw)
}
rte_free(vq);
hw->vqs[i] = NULL;
}
rte_free(hw->vqs);
hw->vqs = NULL;
}
static int

View File

@ -986,8 +986,10 @@ rte_eth_dev_close(uint8_t port_id)
dev->data->dev_started = 0;
(*dev->dev_ops->dev_close)(dev);
dev->data->nb_rx_queues = 0;
rte_free(dev->data->rx_queues);
dev->data->rx_queues = NULL;
dev->data->nb_tx_queues = 0;
rte_free(dev->data->tx_queues);
dev->data->tx_queues = NULL;
}