net/virtio: introduce backend data
authorMaxime Coquelin <maxime.coquelin@redhat.com>
Tue, 26 Jan 2021 10:16:34 +0000 (11:16 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 29 Jan 2021 17:16:09 +0000 (18:16 +0100)
The goal of this patch is to introduce backend-specific
data in order to better isolate what is backend-specific
from what is generic to Virtio-user.

For now, only Vhost-user protocol features are moved to
Vhost-user backend data.

Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
drivers/net/virtio/virtio_user/vhost.h
drivers/net/virtio/virtio_user/vhost_kernel.c
drivers/net/virtio/virtio_user/vhost_user.c
drivers/net/virtio/virtio_user/vhost_vdpa.c
drivers/net/virtio/virtio_user/virtio_user_dev.c
drivers/net/virtio/virtio_user/virtio_user_dev.h

index dfa2735..fc4f059 100644 (file)
@@ -65,6 +65,7 @@ struct virtio_user_dev;
 
 struct virtio_user_backend_ops {
        int (*setup)(struct virtio_user_dev *dev);
+       int (*destroy)(struct virtio_user_dev *dev);
        int (*get_backend_features)(uint64_t *features);
        int (*set_owner)(struct virtio_user_dev *dev);
        int (*get_features)(struct virtio_user_dev *dev, uint64_t *features);
index 2047d41..26a71ad 100644 (file)
@@ -357,6 +357,12 @@ vhost_kernel_setup(struct virtio_user_dev *dev)
        return 0;
 }
 
+static int
+vhost_kernel_destroy(struct virtio_user_dev *dev __rte_unused)
+{
+       return 0;
+}
+
 static int
 vhost_kernel_set_backend(int vhostfd, int tapfd)
 {
@@ -455,6 +461,7 @@ vhost_kernel_get_backend_features(uint64_t *features)
 
 struct virtio_user_backend_ops virtio_ops_kernel = {
        .setup = vhost_kernel_setup,
+       .destroy = vhost_kernel_destroy,
        .get_backend_features = vhost_kernel_get_backend_features,
        .set_owner = vhost_kernel_set_owner,
        .get_features = vhost_kernel_get_features,
index e3bc5a9..26b8c9e 100644 (file)
@@ -17,6 +17,9 @@
 #include "vhost.h"
 #include "virtio_user_dev.h"
 
+struct vhost_user_data {
+       uint64_t protocol_features;
+};
 
 #ifndef VHOST_USER_F_PROTOCOL_FEATURES
 #define VHOST_USER_F_PROTOCOL_FEATURES 30
@@ -287,6 +290,7 @@ static int
 vhost_user_get_features(struct virtio_user_dev *dev, uint64_t *features)
 {
        int ret;
+       struct vhost_user_data *data = dev->backend_data;
        struct vhost_user_msg msg = {
                .request = VHOST_USER_GET_FEATURES,
                .flags = VHOST_USER_VERSION,
@@ -316,17 +320,17 @@ vhost_user_get_features(struct virtio_user_dev *dev, uint64_t *features)
                return 0;
 
        /* Negotiate protocol features */
-       ret = vhost_user_get_protocol_features(dev, &dev->protocol_features);
+       ret = vhost_user_get_protocol_features(dev, &data->protocol_features);
        if (ret < 0)
                goto err;
 
-       dev->protocol_features &= VHOST_USER_SUPPORTED_PROTOCOL_FEATURES;
+       data->protocol_features &= VHOST_USER_SUPPORTED_PROTOCOL_FEATURES;
 
-       ret = vhost_user_set_protocol_features(dev, dev->protocol_features);
+       ret = vhost_user_set_protocol_features(dev, data->protocol_features);
        if (ret < 0)
                goto err;
 
-       if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_MQ)))
+       if (!(data->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_MQ)))
                dev->unsupported_features |= (1ull << VIRTIO_NET_F_MQ);
 
        return 0;
@@ -444,12 +448,13 @@ vhost_user_set_memory_table(struct virtio_user_dev *dev)
        struct walk_arg wa;
        int fds[VHOST_MEMORY_MAX_NREGIONS];
        int ret, fd_num;
+       struct vhost_user_data *data = dev->backend_data;
        struct vhost_user_msg msg = {
                .request = VHOST_USER_SET_MEM_TABLE,
                .flags = VHOST_USER_VERSION,
        };
 
-       if (dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK))
+       if (data->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK))
                msg.flags |= VHOST_USER_NEED_REPLY_MASK;
 
        wa.region_nr = 0;
@@ -628,6 +633,7 @@ static int
 vhost_user_get_status(struct virtio_user_dev *dev, uint8_t *status)
 {
        int ret;
+       struct vhost_user_data *data = dev->backend_data;
        struct vhost_user_msg msg = {
                .request = VHOST_USER_GET_STATUS,
                .flags = VHOST_USER_VERSION,
@@ -644,7 +650,7 @@ vhost_user_get_status(struct virtio_user_dev *dev, uint8_t *status)
        if (!(dev->device_features & (1ULL << VHOST_USER_F_PROTOCOL_FEATURES)))
                return -ENOTSUP;
 
-       if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS)))
+       if (!(data->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS)))
                return -ENOTSUP;
 
        ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0);
@@ -681,6 +687,7 @@ static int
 vhost_user_set_status(struct virtio_user_dev *dev, uint8_t status)
 {
        int ret;
+       struct vhost_user_data *data = dev->backend_data;
        struct vhost_user_msg msg = {
                .request = VHOST_USER_SET_STATUS,
                .flags = VHOST_USER_VERSION,
@@ -699,10 +706,10 @@ vhost_user_set_status(struct virtio_user_dev *dev, uint8_t status)
        if (!(dev->device_features & (1ULL << VHOST_USER_F_PROTOCOL_FEATURES)))
                return -ENOTSUP;
 
-       if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS)))
+       if (!(data->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS)))
                return -ENOTSUP;
 
-       if (dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK))
+       if (data->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK))
                msg.flags |= VHOST_USER_NEED_REPLY_MASK;
 
        ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0);
@@ -762,11 +769,22 @@ vhost_user_setup(struct virtio_user_dev *dev)
        int fd;
        int flag;
        struct sockaddr_un un;
+       struct vhost_user_data *data;
+
+       data = malloc(sizeof(*data));
+       if (!data) {
+               PMD_DRV_LOG(ERR, "(%s) Failed to allocate Vhost-user data\n", dev->path);
+               return -1;
+       }
+
+       memset(data, 0, sizeof(*data));
+
+       dev->backend_data = data;
 
        fd = socket(AF_UNIX, SOCK_STREAM, 0);
        if (fd < 0) {
                PMD_DRV_LOG(ERR, "socket() error, %s", strerror(errno));
-               return -1;
+               goto err_data;
        }
 
        flag = fcntl(fd, F_GETFD);
@@ -781,18 +799,35 @@ vhost_user_setup(struct virtio_user_dev *dev)
                dev->listenfd = fd;
                if (virtio_user_start_server(dev, &un) < 0) {
                        PMD_DRV_LOG(ERR, "virtio-user startup fails in server mode");
-                       close(fd);
-                       return -1;
+                       goto err_socket;
                }
        } else {
                if (connect(fd, (struct sockaddr *)&un, sizeof(un)) < 0) {
                        PMD_DRV_LOG(ERR, "connect error, %s", strerror(errno));
-                       close(fd);
-                       return -1;
+                       goto err_socket;
                }
                dev->vhostfd = fd;
        }
 
+       return 0;
+
+err_socket:
+       close(fd);
+err_data:
+       free(data);
+       dev->backend_data = NULL;
+
+       return -1;
+}
+
+static int
+vhost_user_destroy(struct virtio_user_dev *dev)
+{
+       if (dev->backend_data) {
+               free(dev->backend_data);
+               dev->backend_data = NULL;
+       }
+
        return 0;
 }
 
@@ -830,6 +865,7 @@ vhost_user_get_backend_features(uint64_t *features)
 
 struct virtio_user_backend_ops virtio_ops_user = {
        .setup = vhost_user_setup,
+       .destroy = vhost_user_destroy,
        .get_backend_features = vhost_user_get_backend_features,
        .set_owner = vhost_user_set_owner,
        .get_features = vhost_user_get_features,
index 8d354b2..f5a8943 100644 (file)
@@ -432,6 +432,12 @@ vhost_vdpa_setup(struct virtio_user_dev *dev)
        return 0;
 }
 
+static int
+vhost_vdpa_destroy(struct virtio_user_dev *dev __rte_unused)
+{
+       return 0;
+}
+
 static int
 vhost_vdpa_enable_queue_pair(struct virtio_user_dev *dev,
                               uint16_t pair_idx,
@@ -467,6 +473,7 @@ vhost_vdpa_get_backend_features(uint64_t *features)
 
 struct virtio_user_backend_ops virtio_ops_vdpa = {
        .setup = vhost_vdpa_setup,
+       .destroy = vhost_vdpa_destroy,
        .get_backend_features = vhost_vdpa_get_backend_features,
        .set_owner = vhost_vdpa_set_owner,
        .get_features = vhost_vdpa_get_features,
index 2614bcb..215819d 100644 (file)
@@ -621,6 +621,8 @@ virtio_user_dev_uninit(struct virtio_user_dev *dev)
 
        if (dev->is_server)
                unlink(dev->path);
+
+       dev->ops->destroy(dev);
 }
 
 uint8_t
index ab62463..7650097 100644 (file)
@@ -66,6 +66,8 @@ struct virtio_user_dev {
        struct virtio_user_backend_ops *ops;
        pthread_mutex_t mutex;
        bool            started;
+
+       void *backend_data;
 };
 
 int virtio_user_dev_set_features(struct virtio_user_dev *dev);