vhost: remove dependency on device private field
authorYuanhan Liu <yuanhan.liu@linux.intel.com>
Tue, 10 May 2016 23:02:58 +0000 (07:02 +0800)
committerYuanhan Liu <yuanhan.liu@linux.intel.com>
Wed, 22 Jun 2016 07:07:36 +0000 (09:07 +0200)
This change could let us avoid the dependency of "virtio_net"
struct, to prepare for the ABI refactoring.

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

index 5c1690d..ce5ca8b 100644 (file)
@@ -275,7 +275,6 @@ new_device(struct virtio_net *dev)
        for (i = 0; i < rte_vhost_get_queue_num(dev->vid) * VIRTIO_QNUM; i++)
                rte_vhost_enable_guest_notification(dev, i, 0);
 
-       dev->priv = eth_dev;
        eth_dev->data->dev_link.link_status = ETH_LINK_UP;
 
        for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
@@ -303,6 +302,8 @@ destroy_device(volatile struct virtio_net *dev)
 {
        struct rte_eth_dev *eth_dev;
        struct vhost_queue *vq;
+       struct internal_list *list;
+       char ifname[PATH_MAX];
        unsigned i;
 
        if (dev == NULL) {
@@ -310,11 +311,13 @@ destroy_device(volatile struct virtio_net *dev)
                return;
        }
 
-       eth_dev = (struct rte_eth_dev *)dev->priv;
-       if (eth_dev == NULL) {
-               RTE_LOG(INFO, PMD, "Failed to find a ethdev\n");
+       rte_vhost_get_ifname(dev->vid, ifname, sizeof(ifname));
+       list = find_internal_resource(ifname);
+       if (list == NULL) {
+               RTE_LOG(ERR, PMD, "Invalid interface name: %s\n", ifname);
                return;
        }
+       eth_dev = list->eth_dev;
 
        /* Wait until rx/tx_pkt_burst stops accessing vhost device */
        for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
@@ -336,8 +339,6 @@ destroy_device(volatile struct virtio_net *dev)
 
        eth_dev->data->dev_link.link_status = ETH_LINK_DOWN;
 
-       dev->priv = NULL;
-
        for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
                vq = eth_dev->data->rx_queues[i];
                if (vq == NULL)
index fb0c7fc..8c627d2 100644 (file)
@@ -919,12 +919,20 @@ destroy_device(volatile struct virtio_net *dev)
        struct virtio_net_data_ll *ll_main_dev_cur;
        struct virtio_net_data_ll *ll_lcore_dev_last = NULL;
        struct virtio_net_data_ll *ll_main_dev_last = NULL;
-       struct vhost_dev *vdev;
+       struct vhost_dev *vdev = NULL;
        int lcore;
 
        dev->flags &= ~VIRTIO_DEV_RUNNING;
 
-       vdev = (struct vhost_dev *)dev->priv;
+       ll_main_dev_cur = ll_root_used;
+       while (ll_main_dev_cur != NULL) {
+               if (ll_main_dev_cur->vdev->vid == dev->vid) {
+                       vdev = ll_main_dev_cur->vdev;
+                       break;
+               }
+       }
+       if (!vdev)
+               return;
 
        /* set the remove flag. */
        vdev->remove = 1;
@@ -1019,7 +1027,7 @@ new_device(struct virtio_net *dev)
                return -1;
        }
        vdev->dev = dev;
-       dev->priv = vdev;
+       vdev->vid = dev->vid;
        /* Add device to main ll */
        ll_dev = get_data_ll_free_entry(&ll_root_free);
        if (ll_dev == NULL) {
index 4b123ab..f786640 100644 (file)
@@ -71,6 +71,7 @@ struct device_statistics {
  * Device linked list structure for data path.
  */
 struct vhost_dev {
+       int vid;
        /**< Pointer to device created by vhost lib. */
        struct virtio_net      *dev;
        /**< Number of memory regions for gpa to hpa translation. */
index 4e26a8b..77214a6 100644 (file)
@@ -1173,10 +1173,15 @@ switch_worker(void *arg __rte_unused)
 static void
 destroy_device (volatile struct virtio_net *dev)
 {
-       struct vhost_dev *vdev;
+       struct vhost_dev *vdev = NULL;
        int lcore;
 
-       vdev = (struct vhost_dev *)dev->priv;
+       TAILQ_FOREACH(vdev, &vhost_dev_list, global_vdev_entry) {
+               if (vdev->vid == dev->vid)
+                       break;
+       }
+       if (!vdev)
+               return;
        /*set the remove flag. */
        vdev->remove = 1;
        while(vdev->ready != DEVICE_SAFE_REMOVE) {
@@ -1231,7 +1236,6 @@ new_device (struct virtio_net *dev)
                return -1;
        }
        vdev->dev = dev;
-       dev->priv = vdev;
        vdev->vid = vid;
 
        TAILQ_INSERT_TAIL(&vhost_dev_list, vdev, global_vdev_entry);