[dpdk-dev] [PATCH v2 27/44] net/virtio: add Virtio-user features ops

Xia, Chenbo chenbo.xia at intel.com
Fri Jan 22 08:25:55 CET 2021


Hi Maxime,

> -----Original Message-----
> From: Maxime Coquelin <maxime.coquelin at redhat.com>
> Sent: Wednesday, January 20, 2021 5:25 AM
> To: dev at dpdk.org; Xia, Chenbo <chenbo.xia at intel.com>; olivier.matz at 6wind.com;
> amorenoz at redhat.com; david.marchand at redhat.com
> Cc: Maxime Coquelin <maxime.coquelin at redhat.com>
> Subject: [PATCH v2 27/44] net/virtio: add Virtio-user features ops
> 
> This patch introduces new callbacks for getting
> and setting Virtio features, and implements them
> for the different backend types.
> 
> Signed-off-by: Maxime Coquelin <maxime.coquelin at redhat.com>
> ---
>  drivers/net/virtio/virtio_user/vhost.h        |   2 +
>  drivers/net/virtio/virtio_user/vhost_kernel.c | 150 +++++++++---------
>  .../net/virtio/virtio_user/vhost_kernel_tap.c |  23 +++
>  .../net/virtio/virtio_user/vhost_kernel_tap.h |   1 +
>  drivers/net/virtio/virtio_user/vhost_user.c   |  64 +++++++-
>  drivers/net/virtio/virtio_user/vhost_vdpa.c   |  38 +++--
>  .../net/virtio/virtio_user/virtio_user_dev.c  |   5 +-
>  drivers/net/virtio/virtio_user_ethdev.c       |   3 +-
>  8 files changed, 190 insertions(+), 96 deletions(-)
> 
> diff --git a/drivers/net/virtio/virtio_user/vhost.h
> b/drivers/net/virtio/virtio_user/vhost.h
> index 5413ec6778..13a88c7671 100644
> --- a/drivers/net/virtio/virtio_user/vhost.h
> +++ b/drivers/net/virtio/virtio_user/vhost.h
> @@ -110,6 +110,8 @@ struct virtio_user_dev;

<snip>

> +
> +	ret = tap_support_features(&tap_features);
> +	if (ret < 0) {
> +		PMD_DRV_LOG(ERR, "Failed to get TAP features)");

Delete the ')' before " ?

> +		return -1;
> +	}
> +

<snip>

> 
> +static int
> +vhost_user_get_features(struct virtio_user_dev *dev, uint64_t *features)
> +{
> +	int ret;
> +	struct vhost_user_msg msg = {
> +		.request = VHOST_USER_GET_FEATURES,
> +		.flags = VHOST_USER_VERSION,
> +	};
> +
> +	ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0);
> +	if (ret < 0)
> +		goto err;
> +
> +	ret = vhost_user_read(dev->vhostfd, &msg);
> +	if (ret < 0)
> +		goto err;

Better add error log both after write and read?

Thanks!
Chenbo

> +
> +	if (msg.request != VHOST_USER_GET_FEATURES) {
> +		PMD_DRV_LOG(ERR, "Unexpected request type (%d)", msg.request);
> +		goto err;
> +	}
> +
> +	if (msg.size != sizeof(*features)) {
> +		PMD_DRV_LOG(ERR, "Unexpected payload size (%u)", msg.size);
> +		goto err;
> +	}
> +
> +	*features = msg.payload.u64;
> +
> +	return 0;
> +err:
> +	PMD_DRV_LOG(ERR, "Failed to get backend features");
> +
> +	return -1;
> +}
> +
> +static int
> +vhost_user_set_features(struct virtio_user_dev *dev, uint64_t features)
> +{
> +	int ret;
> +	struct vhost_user_msg msg = {
> +		.request = VHOST_USER_SET_FEATURES,
> +		.flags = VHOST_USER_VERSION,
> +		.size = sizeof(features),
> +		.payload.u64 = features,
> +	};
> +
> +	msg.payload.u64 |= dev->device_features & (1ULL <<
> VHOST_USER_F_PROTOCOL_FEATURES);
> +
> +	ret = vhost_user_write(dev->vhostfd, &msg, NULL, 0);
> +	if (ret < 0) {
> +		PMD_DRV_LOG(ERR, "Failed to set features");
> +		return -1;
> +	}
> +
> +	return 0;
> +}
> +
>  struct walk_arg {
>  	struct vhost_memory *vm;
>  	int *fds;
> @@ -249,8 +307,6 @@ static struct vhost_user_msg m;
> 
>  const char * const vhost_msg_strings[] = {
>  	[VHOST_USER_RESET_OWNER] = "VHOST_RESET_OWNER",
> -	[VHOST_USER_SET_FEATURES] = "VHOST_SET_FEATURES",
> -	[VHOST_USER_GET_FEATURES] = "VHOST_GET_FEATURES",
>  	[VHOST_USER_SET_VRING_CALL] = "VHOST_SET_VRING_CALL",
>  	[VHOST_USER_SET_VRING_NUM] = "VHOST_SET_VRING_NUM",
>  	[VHOST_USER_SET_VRING_BASE] = "VHOST_SET_VRING_BASE",
> @@ -299,7 +355,6 @@ vhost_user_sock(struct virtio_user_dev *dev,
>  				(1ULL << VHOST_USER_PROTOCOL_F_STATUS))))
>  			return -ENOTSUP;
>  		/* Fallthrough */
> -	case VHOST_USER_GET_FEATURES:
>  	case VHOST_USER_GET_PROTOCOL_FEATURES:
>  		need_reply = 1;
>  		break;
> @@ -398,7 +453,6 @@ vhost_user_sock(struct virtio_user_dev *dev,
>  		}
> 
>  		switch (req) {
> -		case VHOST_USER_GET_FEATURES:
>  		case VHOST_USER_GET_STATUS:
>  		case VHOST_USER_GET_PROTOCOL_FEATURES:
>  			if (msg.size != sizeof(m.payload.u64)) {
> @@ -536,6 +590,8 @@ vhost_user_enable_queue_pair(struct virtio_user_dev *dev,
>  struct virtio_user_backend_ops virtio_ops_user = {
>  	.setup = vhost_user_setup,
>  	.set_owner = vhost_user_set_owner,
> +	.get_features = vhost_user_get_features,
> +	.set_features = vhost_user_set_features,
>  	.send_request = vhost_user_sock,
>  	.enable_qp = vhost_user_enable_queue_pair
>  };
> diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c
> b/drivers/net/virtio/virtio_user/vhost_vdpa.c
> index d9bc213e0d..22a329526a 100644
> --- a/drivers/net/virtio/virtio_user/vhost_vdpa.c
> +++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c
> @@ -40,8 +40,6 @@
> 
>  static uint64_t vhost_req_user_to_vdpa[] = {
>  	[VHOST_USER_RESET_OWNER] = VHOST_RESET_OWNER,
> -	[VHOST_USER_SET_FEATURES] = VHOST_SET_FEATURES,
> -	[VHOST_USER_GET_FEATURES] = VHOST_GET_FEATURES,
>  	[VHOST_USER_SET_VRING_CALL] = VHOST_SET_VRING_CALL,
>  	[VHOST_USER_SET_VRING_NUM] = VHOST_SET_VRING_NUM,
>  	[VHOST_USER_SET_VRING_BASE] = VHOST_SET_VRING_BASE,
> @@ -107,6 +105,32 @@ vhost_vdpa_set_owner(struct virtio_user_dev *dev)
>  	return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_OWNER, NULL);
>  }
> 
> +static int
> +vhost_vdpa_get_features(struct virtio_user_dev *dev, uint64_t *features)
> +{
> +	int ret;
> +
> +	ret = vhost_vdpa_ioctl(dev->vhostfd, VHOST_GET_FEATURES, features);
> +	if (ret) {
> +		PMD_DRV_LOG(ERR, "Failed to get features");
> +		return -1;
> +	}
> +
> +	/* Multiqueue not supported for now */
> +	*features &= ~(1ULL << VIRTIO_NET_F_MQ);
> +
> +	return 0;
> +}
> +
> +static int
> +vhost_vdpa_set_features(struct virtio_user_dev *dev, uint64_t features)
> +{
> +	/* WORKAROUND */
> +	features |= 1ULL << VIRTIO_F_IOMMU_PLATFORM;
> +
> +	return vhost_vdpa_ioctl(dev->vhostfd, VHOST_SET_FEATURES, &features);
> +}
> +
>  static int
>  vhost_vdpa_iotlb_batch_begin(struct virtio_user_dev *dev)
>  {
> @@ -343,14 +367,6 @@ vhost_vdpa_send_request(struct virtio_user_dev *dev,
>  	if (req_vdpa == VHOST_SET_MEM_TABLE)
>  		return vhost_vdpa_dma_map_all(dev);
> 
> -	if (req_vdpa == VHOST_SET_FEATURES) {
> -		/* WORKAROUND */
> -		*(uint64_t *)arg |= 1ULL << VIRTIO_F_IOMMU_PLATFORM;
> -
> -		/* Multiqueue not supported for now */
> -		*(uint64_t *)arg &= ~(1ULL << VIRTIO_NET_F_MQ);
> -	}
> -
>  	switch (req_vdpa) {
>  	case VHOST_SET_VRING_NUM:
>  	case VHOST_SET_VRING_ADDR:
> @@ -429,6 +445,8 @@ vhost_vdpa_enable_queue_pair(struct virtio_user_dev *dev,
>  struct virtio_user_backend_ops virtio_ops_vdpa = {
>  	.setup = vhost_vdpa_setup,
>  	.set_owner = vhost_vdpa_set_owner,
> +	.get_features = vhost_vdpa_get_features,
> +	.set_features = vhost_vdpa_set_features,
>  	.send_request = vhost_vdpa_send_request,
>  	.enable_qp = vhost_vdpa_enable_queue_pair,
>  	.dma_map = vhost_vdpa_dma_map_batch,
> diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c
> b/drivers/net/virtio/virtio_user/virtio_user_dev.c
> index f4b97d8489..1f3bbae663 100644
> --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c
> +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c
> @@ -141,7 +141,7 @@ virtio_user_dev_set_features(struct virtio_user_dev *dev)
>  	/* Strip VIRTIO_NET_F_CTRL_VQ, as devices do not really need to know */
>  	features &= ~(1ull << VIRTIO_NET_F_CTRL_VQ);
>  	features &= ~(1ull << VIRTIO_NET_F_STATUS);
> -	ret = dev->ops->send_request(dev, VHOST_USER_SET_FEATURES, &features);
> +	ret = dev->ops->set_features(dev, features);
>  	if (ret < 0)
>  		goto error;
>  	PMD_DRV_LOG(INFO, "set features: %" PRIx64, features);
> @@ -496,8 +496,7 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char
> *path, int queues,
>  			return -1;
>  		}
> 
> -		if (dev->ops->send_request(dev, VHOST_USER_GET_FEATURES,
> -					   &dev->device_features) < 0) {
> +		if (dev->ops->get_features(dev, &dev->device_features) < 0) {
>  			PMD_INIT_LOG(ERR, "get_features failed: %s",
>  				     strerror(errno));
>  			return -1;
> diff --git a/drivers/net/virtio/virtio_user_ethdev.c
> b/drivers/net/virtio/virtio_user_ethdev.c
> index 91794b8645..56c379bc15 100644
> --- a/drivers/net/virtio/virtio_user_ethdev.c
> +++ b/drivers/net/virtio/virtio_user_ethdev.c
> @@ -85,8 +85,7 @@ virtio_user_server_reconnect(struct virtio_user_dev *dev)
> 
>  	virtio_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER);
> 
> -	if (dev->ops->send_request(dev, VHOST_USER_GET_FEATURES,
> -				   &dev->device_features) < 0) {
> +	if (dev->ops->get_features(dev, &dev->device_features) < 0) {
>  		PMD_INIT_LOG(ERR, "get_features failed: %s",
>  			     strerror(errno));
>  		return -1;
> --
> 2.29.2



More information about the dev mailing list