vdev: use generic vdev struct for probe and remove
[dpdk.git] / drivers / net / vhost / rte_eth_vhost.c
index fbdfecb..cdd8c31 100644 (file)
 #include <rte_memcpy.h>
 #include <rte_vdev.h>
 #include <rte_kvargs.h>
-#include <rte_virtio_net.h>
+#include <rte_vhost.h>
 #include <rte_spinlock.h>
 
 #include "rte_eth_vhost.h"
 
+enum {VIRTIO_RXQ, VIRTIO_TXQ, VIRTIO_QNUM};
+
 #define ETH_VHOST_IFACE_ARG            "iface"
 #define ETH_VHOST_QUEUES_ARG           "queues"
 #define ETH_VHOST_CLIENT_ARG           "client"
@@ -126,9 +128,6 @@ static struct internal_list_head internal_list =
 
 static pthread_mutex_t internal_list_lock = PTHREAD_MUTEX_INITIALIZER;
 
-static rte_atomic16_t nb_started_ports;
-static pthread_t session_th;
-
 static struct rte_eth_link pmd_link = {
                .link_speed = 10000,
                .link_duplex = ETH_LINK_FULL_DUPLEX,
@@ -595,7 +594,7 @@ new_device(int vid)
                vq->port = eth_dev->data->port_id;
        }
 
-       for (i = 0; i < rte_vhost_get_queue_num(vid) * VIRTIO_QNUM; i++)
+       for (i = 0; i < rte_vhost_get_vring_num(vid); i++)
                rte_vhost_enable_guest_notification(vid, i, 0);
 
        rte_vhost_get_mtu(vid, &eth_dev->data->mtu);
@@ -695,6 +694,12 @@ vring_state_changed(int vid, uint16_t vring, int enable)
        return 0;
 }
 
+static struct vhost_device_ops vhost_ops = {
+       .new_device          = new_device,
+       .destroy_device      = destroy_device,
+       .vring_state_changed = vring_state_changed,
+};
+
 int
 rte_eth_vhost_get_queue_event(uint8_t port_id,
                struct rte_eth_vhost_queue_event *event)
@@ -761,51 +766,6 @@ rte_eth_vhost_get_vid_from_port_id(uint8_t port_id)
        return vid;
 }
 
-static void *
-vhost_driver_session(void *param __rte_unused)
-{
-       static struct virtio_net_device_ops vhost_ops;
-
-       /* set vhost arguments */
-       vhost_ops.new_device = new_device;
-       vhost_ops.destroy_device = destroy_device;
-       vhost_ops.vring_state_changed = vring_state_changed;
-       if (rte_vhost_driver_callback_register(&vhost_ops) < 0)
-               RTE_LOG(ERR, PMD, "Can't register callbacks\n");
-
-       /* start event handling */
-       rte_vhost_driver_session_start();
-
-       return NULL;
-}
-
-static int
-vhost_driver_session_start(void)
-{
-       int ret;
-
-       ret = pthread_create(&session_th,
-                       NULL, vhost_driver_session, NULL);
-       if (ret)
-               RTE_LOG(ERR, PMD, "Can't create a thread\n");
-
-       return ret;
-}
-
-static void
-vhost_driver_session_stop(void)
-{
-       int ret;
-
-       ret = pthread_cancel(session_th);
-       if (ret)
-               RTE_LOG(ERR, PMD, "Can't cancel the thread\n");
-
-       ret = pthread_join(session_th, NULL);
-       if (ret)
-               RTE_LOG(ERR, PMD, "Can't join the thread\n");
-}
-
 static int
 eth_dev_start(struct rte_eth_dev *dev)
 {
@@ -1116,10 +1076,15 @@ eth_dev_vhost_create(const char *name, char *iface_name, int16_t queues,
        if (rte_vhost_driver_register(iface_name, flags))
                goto error;
 
-       /* We need only one message handling thread */
-       if (rte_atomic16_add_return(&nb_started_ports, 1) == 1) {
-               if (vhost_driver_session_start())
-                       goto error;
+       if (rte_vhost_driver_callback_register(iface_name, &vhost_ops) < 0) {
+               RTE_LOG(ERR, PMD, "Can't register callbacks\n");
+               goto error;
+       }
+
+       if (rte_vhost_driver_start(iface_name) < 0) {
+               RTE_LOG(ERR, PMD, "Failed to start driver for %s\n",
+                       iface_name);
+               goto error;
        }
 
        return data->port_id;
@@ -1167,8 +1132,9 @@ open_int(const char *key __rte_unused, const char *value, void *extra_args)
 }
 
 static int
-rte_pmd_vhost_probe(const char *name, const char *params)
+rte_pmd_vhost_probe(struct rte_vdev_device *dev)
 {
+       const char *name;
        struct rte_kvargs *kvlist = NULL;
        int ret = 0;
        char *iface_name;
@@ -1177,9 +1143,10 @@ rte_pmd_vhost_probe(const char *name, const char *params)
        int client_mode = 0;
        int dequeue_zero_copy = 0;
 
+       name = rte_vdev_device_name(dev);
        RTE_LOG(INFO, PMD, "Initializing pmd_vhost for %s\n", name);
 
-       kvlist = rte_kvargs_parse(params, valid_arguments);
+       kvlist = rte_kvargs_parse(rte_vdev_device_args(dev), valid_arguments);
        if (kvlist == NULL)
                return -1;
 
@@ -1230,11 +1197,13 @@ out_free:
 }
 
 static int
-rte_pmd_vhost_remove(const char *name)
+rte_pmd_vhost_remove(struct rte_vdev_device *dev)
 {
+       const char *name;
        struct rte_eth_dev *eth_dev = NULL;
        unsigned int i;
 
+       name = rte_vdev_device_name(dev);
        RTE_LOG(INFO, PMD, "Un-Initializing pmd_vhost for %s\n", name);
 
        /* find an ethdev entry */
@@ -1246,9 +1215,6 @@ rte_pmd_vhost_remove(const char *name)
 
        eth_dev_close(eth_dev);
 
-       if (rte_atomic16_sub_return(&nb_started_ports, 1) == 0)
-               vhost_driver_session_stop();
-
        rte_free(vring_states[eth_dev->data->port_id]);
        vring_states[eth_dev->data->port_id] = NULL;