Message ID | 20210119212507.1043636-40-maxime.coquelin@redhat.com (mailing list archive) |
---|---|
State | Superseded, archived |
Delegated to: | Maxime Coquelin |
Headers | show |
Series | net/virtio: Virtio PMD rework | expand |
Context | Check | Description |
---|---|---|
ci/checkpatch | success | coding style OK |
> -----Original Message----- > From: Maxime Coquelin <maxime.coquelin@redhat.com> > Sent: Wednesday, January 20, 2021 5:25 AM > To: dev@dpdk.org; Xia, Chenbo <chenbo.xia@intel.com>; olivier.matz@6wind.com; > amorenoz@redhat.com; david.marchand@redhat.com > Cc: Maxime Coquelin <maxime.coquelin@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.coquelin@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.xia@intel.com>
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);
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> --- 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(-)