> -----Original Message----- > From: Maxime Coquelin <maxime.coque...@redhat.com> > Sent: Wednesday, January 20, 2021 5:25 AM > To: dev@dpdk.org; Xia, Chenbo <chenbo....@intel.com>; olivier.m...@6wind.com; > amore...@redhat.com; david.march...@redhat.com > Cc: Maxime Coquelin <maxime.coque...@redhat.com> > Subject: [PATCH v2 39/44] net/virtio: introduce backend data > > 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.coque...@redhat.com> > --- > drivers/net/virtio/virtio_user/vhost.h | 1 + > drivers/net/virtio/virtio_user/vhost_kernel.c | 7 +++ > drivers/net/virtio/virtio_user/vhost_user.c | 62 +++++++++++++++---- > drivers/net/virtio/virtio_user/vhost_vdpa.c | 7 +++ > .../net/virtio/virtio_user/virtio_user_dev.c | 2 + > .../net/virtio/virtio_user/virtio_user_dev.h | 2 + > 6 files changed, 68 insertions(+), 13 deletions(-) > > diff --git a/drivers/net/virtio/virtio_user/vhost.h > b/drivers/net/virtio/virtio_user/vhost.h > index dfa2735a20..fc4f059c02 100644 > --- a/drivers/net/virtio/virtio_user/vhost.h > +++ b/drivers/net/virtio/virtio_user/vhost.h > @@ -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); > diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c > b/drivers/net/virtio/virtio_user/vhost_kernel.c > index 5477eb7015..47fb4427be 100644 > --- a/drivers/net/virtio/virtio_user/vhost_kernel.c > +++ b/drivers/net/virtio/virtio_user/vhost_kernel.c > @@ -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, > diff --git a/drivers/net/virtio/virtio_user/vhost_user.c > b/drivers/net/virtio/virtio_user/vhost_user.c > index 986d8ac1ac..0147b6d963 100644 > --- a/drivers/net/virtio/virtio_user/vhost_user.c > +++ b/drivers/net/virtio/virtio_user/vhost_user.c > @@ -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, > diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c > b/drivers/net/virtio/virtio_user/vhost_vdpa.c > index 8d354b298e..f5a8943993 100644 > --- a/drivers/net/virtio/virtio_user/vhost_vdpa.c > +++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c > @@ -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, > diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c > b/drivers/net/virtio/virtio_user/virtio_user_dev.c > index 2614bcb349..215819d46d 100644 > --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c > +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c > @@ -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 > diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h > b/drivers/net/virtio/virtio_user/virtio_user_dev.h > index ab62463a5b..7650097b6d 100644 > --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h > +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h > @@ -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); > -- > 2.29.2
Reviewed-by: Chenbo Xia <chenbo....@intel.com>