From: Eli Cohen <hidden> Date: 2021-02-18 08:50:03
Allow to control vdpa device creation and destruction using the vdpa
management tool.
Examples:
1. List the management devices
$ vdpa mgmtdev show
pci/0000:3b:00.1:
supported_classes net
2. Create vdpa instance
$ vdpa dev add mgmtdev pci/0000:3b:00.1 name vdpa0
3. Show vdpa devices
$ vdpa dev show
vdpa0: type network mgmtdev pci/0000:3b:00.1 vendor_id 5555 max_vqs 16 \
max_vq_size 256
Signed-off-by: Eli Cohen <redacted>
Reviewed-by: Parav Pandit <redacted>
---
v0->v1:
set mgtdev->ndev NULL on dev delete
v1->v2: Resend
drivers/vdpa/mlx5/net/mlx5_vnet.c | 79 +++++++++++++++++++++++++++----
1 file changed, 70 insertions(+), 9 deletions(-)
@@ -1974,23 +1974,32 @@ static void init_mvqs(struct mlx5_vdpa_net *ndev)}}-staticintmlx5v_probe(structauxiliary_device*adev,-conststructauxiliary_device_id*id)+structmlx5_vdpa_mgmtdev{+structvdpa_mgmt_devmgtdev;+structmlx5_adev*madev;+structmlx5_vdpa_net*ndev;+};++staticintmlx5_vdpa_dev_add(structvdpa_mgmt_dev*v_mdev,constchar*name){-structmlx5_adev*madev=container_of(adev,structmlx5_adev,adev);-structmlx5_core_dev*mdev=madev->mdev;+structmlx5_vdpa_mgmtdev*mgtdev=container_of(v_mdev,structmlx5_vdpa_mgmtdev,mgtdev);structvirtio_net_config*config;structmlx5_vdpa_dev*mvdev;structmlx5_vdpa_net*ndev;+structmlx5_core_dev*mdev;u32max_vqs;interr;+if(mgtdev->ndev)+return-ENOSPC;++mdev=mgtdev->madev->mdev;/* we save one virtqueue for control virtqueue should we require it */max_vqs=MLX5_CAP_DEV_VDPA_EMULATION(mdev,max_num_virtio_queues);max_vqs=min_t(u32,max_vqs,MLX5_MAX_SUPPORTED_VQS);ndev=vdpa_alloc_device(structmlx5_vdpa_net,mvdev.vdev,mdev->device,&mlx5_vdpa_ops,-2*mlx5_vdpa_max_qps(max_vqs),NULL);+2*mlx5_vdpa_max_qps(max_vqs),name);if(IS_ERR(ndev))returnPTR_ERR(ndev);
@@ -2018,11 +2027,12 @@ static int mlx5v_probe(struct auxiliary_device *adev,if(err)gotoerr_res;-err=vdpa_register_device(&mvdev->vdev);+mvdev->vdev.mdev=&mgtdev->mgtdev;+err=_vdpa_register_device(&mvdev->vdev);if(err)gotoerr_reg;-dev_set_drvdata(&adev->dev,ndev);+mgtdev->ndev=ndev;return0;err_reg:
@@ -2035,11 +2045,62 @@ static int mlx5v_probe(struct auxiliary_device *adev,returnerr;}+staticvoidmlx5_vdpa_dev_del(structvdpa_mgmt_dev*v_mdev,structvdpa_device*dev)+{+structmlx5_vdpa_mgmtdev*mgtdev=container_of(v_mdev,structmlx5_vdpa_mgmtdev,mgtdev);++_vdpa_unregister_device(dev);+mgtdev->ndev=NULL;+}++staticconststructvdpa_mgmtdev_opsmdev_ops={+.dev_add=mlx5_vdpa_dev_add,+.dev_del=mlx5_vdpa_dev_del,+};++staticstructvirtio_device_idid_table[]={+{VIRTIO_ID_NET,VIRTIO_DEV_ANY_ID},+{0},+};++staticintmlx5v_probe(structauxiliary_device*adev,+conststructauxiliary_device_id*id)++{+structmlx5_adev*madev=container_of(adev,structmlx5_adev,adev);+structmlx5_core_dev*mdev=madev->mdev;+structmlx5_vdpa_mgmtdev*mgtdev;+interr;++mgtdev=kzalloc(sizeof(*mgtdev),GFP_KERNEL);+if(!mgtdev)+return-ENOMEM;++mgtdev->mgtdev.ops=&mdev_ops;+mgtdev->mgtdev.device=mdev->device;+mgtdev->mgtdev.id_table=id_table;+mgtdev->madev=madev;++err=vdpa_mgmtdev_register(&mgtdev->mgtdev);+if(err)+gotoreg_err;++dev_set_drvdata(&adev->dev,mgtdev);++return0;++reg_err:+kfree(mdev);+returnerr;+}+staticvoidmlx5v_remove(structauxiliary_device*adev){-structmlx5_vdpa_dev*mvdev=dev_get_drvdata(&adev->dev);+structmlx5_vdpa_mgmtdev*mgtdev;-vdpa_unregister_device(&mvdev->vdev);+mgtdev=dev_get_drvdata(&adev->dev);+vdpa_mgmtdev_unregister(&mgtdev->mgtdev);+kfree(mgtdev);}staticconststructauxiliary_device_idmlx5v_id_table[]={
From: "Michael S. Tsirkin" <mst@redhat.com> Date: 2021-02-23 12:31:35
On Thu, Feb 18, 2021 at 09:41:57AM +0200, Eli Cohen wrote:
Allow to control vdpa device creation and destruction using the vdpa
management tool.
Examples:
1. List the management devices
$ vdpa mgmtdev show
pci/0000:3b:00.1:
supported_classes net
2. Create vdpa instance
$ vdpa dev add mgmtdev pci/0000:3b:00.1 name vdpa0
3. Show vdpa devices
$ vdpa dev show
vdpa0: type network mgmtdev pci/0000:3b:00.1 vendor_id 5555 max_vqs 16 \
max_vq_size 256
Signed-off-by: Eli Cohen <redacted>
Reviewed-by: Parav Pandit <redacted>
Not sure which tree this is for, I could not apply this.
quoted hunk
---
v0->v1:
set mgtdev->ndev NULL on dev delete
v1->v2: Resend
drivers/vdpa/mlx5/net/mlx5_vnet.c | 79 +++++++++++++++++++++++++++----
1 file changed, 70 insertions(+), 9 deletions(-)
@@ -1974,23 +1974,32 @@ static void init_mvqs(struct mlx5_vdpa_net *ndev)}}-staticintmlx5v_probe(structauxiliary_device*adev,-conststructauxiliary_device_id*id)+structmlx5_vdpa_mgmtdev{+structvdpa_mgmt_devmgtdev;+structmlx5_adev*madev;+structmlx5_vdpa_net*ndev;+};++staticintmlx5_vdpa_dev_add(structvdpa_mgmt_dev*v_mdev,constchar*name){-structmlx5_adev*madev=container_of(adev,structmlx5_adev,adev);-structmlx5_core_dev*mdev=madev->mdev;+structmlx5_vdpa_mgmtdev*mgtdev=container_of(v_mdev,structmlx5_vdpa_mgmtdev,mgtdev);structvirtio_net_config*config;structmlx5_vdpa_dev*mvdev;structmlx5_vdpa_net*ndev;+structmlx5_core_dev*mdev;u32max_vqs;interr;+if(mgtdev->ndev)+return-ENOSPC;++mdev=mgtdev->madev->mdev;/* we save one virtqueue for control virtqueue should we require it */max_vqs=MLX5_CAP_DEV_VDPA_EMULATION(mdev,max_num_virtio_queues);max_vqs=min_t(u32,max_vqs,MLX5_MAX_SUPPORTED_VQS);ndev=vdpa_alloc_device(structmlx5_vdpa_net,mvdev.vdev,mdev->device,&mlx5_vdpa_ops,-2*mlx5_vdpa_max_qps(max_vqs),NULL);+2*mlx5_vdpa_max_qps(max_vqs),name);if(IS_ERR(ndev))returnPTR_ERR(ndev);
@@ -2018,11 +2027,12 @@ static int mlx5v_probe(struct auxiliary_device *adev,if(err)gotoerr_res;-err=vdpa_register_device(&mvdev->vdev);+mvdev->vdev.mdev=&mgtdev->mgtdev;+err=_vdpa_register_device(&mvdev->vdev);if(err)gotoerr_reg;-dev_set_drvdata(&adev->dev,ndev);+mgtdev->ndev=ndev;return0;err_reg:
@@ -2035,11 +2045,62 @@ static int mlx5v_probe(struct auxiliary_device *adev,returnerr;}+staticvoidmlx5_vdpa_dev_del(structvdpa_mgmt_dev*v_mdev,structvdpa_device*dev)+{+structmlx5_vdpa_mgmtdev*mgtdev=container_of(v_mdev,structmlx5_vdpa_mgmtdev,mgtdev);++_vdpa_unregister_device(dev);+mgtdev->ndev=NULL;+}++staticconststructvdpa_mgmtdev_opsmdev_ops={+.dev_add=mlx5_vdpa_dev_add,+.dev_del=mlx5_vdpa_dev_del,+};++staticstructvirtio_device_idid_table[]={+{VIRTIO_ID_NET,VIRTIO_DEV_ANY_ID},+{0},+};++staticintmlx5v_probe(structauxiliary_device*adev,+conststructauxiliary_device_id*id)++{+structmlx5_adev*madev=container_of(adev,structmlx5_adev,adev);+structmlx5_core_dev*mdev=madev->mdev;+structmlx5_vdpa_mgmtdev*mgtdev;+interr;++mgtdev=kzalloc(sizeof(*mgtdev),GFP_KERNEL);+if(!mgtdev)+return-ENOMEM;++mgtdev->mgtdev.ops=&mdev_ops;+mgtdev->mgtdev.device=mdev->device;+mgtdev->mgtdev.id_table=id_table;+mgtdev->madev=madev;++err=vdpa_mgmtdev_register(&mgtdev->mgtdev);+if(err)+gotoreg_err;++dev_set_drvdata(&adev->dev,mgtdev);++return0;++reg_err:+kfree(mdev);+returnerr;+}+staticvoidmlx5v_remove(structauxiliary_device*adev){-structmlx5_vdpa_dev*mvdev=dev_get_drvdata(&adev->dev);+structmlx5_vdpa_mgmtdev*mgtdev;-vdpa_unregister_device(&mvdev->vdev);+mgtdev=dev_get_drvdata(&adev->dev);+vdpa_mgmtdev_unregister(&mgtdev->mgtdev);+kfree(mgtdev);}staticconststructauxiliary_device_idmlx5v_id_table[]={
From: Eli Cohen <hidden> Date: 2021-02-23 12:33:58
On Tue, Feb 23, 2021 at 07:29:32AM -0500, Michael S. Tsirkin wrote:
On Thu, Feb 18, 2021 at 09:41:57AM +0200, Eli Cohen wrote:
quoted
Allow to control vdpa device creation and destruction using the vdpa
management tool.
Examples:
1. List the management devices
$ vdpa mgmtdev show
pci/0000:3b:00.1:
supported_classes net
2. Create vdpa instance
$ vdpa dev add mgmtdev pci/0000:3b:00.1 name vdpa0
3. Show vdpa devices
$ vdpa dev show
vdpa0: type network mgmtdev pci/0000:3b:00.1 vendor_id 5555 max_vqs 16 \
max_vq_size 256
Signed-off-by: Eli Cohen <redacted>
Reviewed-by: Parav Pandit <redacted>
Not sure which tree this is for, I could not apply this.
Depends on Parav's vdpa tool patches. We'll send the entire series again
- Parav's and my patches.
quoted
---
v0->v1:
set mgtdev->ndev NULL on dev delete
v1->v2: Resend
drivers/vdpa/mlx5/net/mlx5_vnet.c | 79 +++++++++++++++++++++++++++----
1 file changed, 70 insertions(+), 9 deletions(-)
@@ -1974,23 +1974,32 @@ static void init_mvqs(struct mlx5_vdpa_net *ndev)}}-staticintmlx5v_probe(structauxiliary_device*adev,-conststructauxiliary_device_id*id)+structmlx5_vdpa_mgmtdev{+structvdpa_mgmt_devmgtdev;+structmlx5_adev*madev;+structmlx5_vdpa_net*ndev;+};++staticintmlx5_vdpa_dev_add(structvdpa_mgmt_dev*v_mdev,constchar*name){-structmlx5_adev*madev=container_of(adev,structmlx5_adev,adev);-structmlx5_core_dev*mdev=madev->mdev;+structmlx5_vdpa_mgmtdev*mgtdev=container_of(v_mdev,structmlx5_vdpa_mgmtdev,mgtdev);structvirtio_net_config*config;structmlx5_vdpa_dev*mvdev;structmlx5_vdpa_net*ndev;+structmlx5_core_dev*mdev;u32max_vqs;interr;+if(mgtdev->ndev)+return-ENOSPC;++mdev=mgtdev->madev->mdev;/* we save one virtqueue for control virtqueue should we require it */max_vqs=MLX5_CAP_DEV_VDPA_EMULATION(mdev,max_num_virtio_queues);max_vqs=min_t(u32,max_vqs,MLX5_MAX_SUPPORTED_VQS);ndev=vdpa_alloc_device(structmlx5_vdpa_net,mvdev.vdev,mdev->device,&mlx5_vdpa_ops,-2*mlx5_vdpa_max_qps(max_vqs),NULL);+2*mlx5_vdpa_max_qps(max_vqs),name);if(IS_ERR(ndev))returnPTR_ERR(ndev);
@@ -2018,11 +2027,12 @@ static int mlx5v_probe(struct auxiliary_device *adev,if(err)gotoerr_res;-err=vdpa_register_device(&mvdev->vdev);+mvdev->vdev.mdev=&mgtdev->mgtdev;+err=_vdpa_register_device(&mvdev->vdev);if(err)gotoerr_reg;-dev_set_drvdata(&adev->dev,ndev);+mgtdev->ndev=ndev;return0;err_reg:
@@ -2035,11 +2045,62 @@ static int mlx5v_probe(struct auxiliary_device *adev,returnerr;}+staticvoidmlx5_vdpa_dev_del(structvdpa_mgmt_dev*v_mdev,structvdpa_device*dev)+{+structmlx5_vdpa_mgmtdev*mgtdev=container_of(v_mdev,structmlx5_vdpa_mgmtdev,mgtdev);++_vdpa_unregister_device(dev);+mgtdev->ndev=NULL;+}++staticconststructvdpa_mgmtdev_opsmdev_ops={+.dev_add=mlx5_vdpa_dev_add,+.dev_del=mlx5_vdpa_dev_del,+};++staticstructvirtio_device_idid_table[]={+{VIRTIO_ID_NET,VIRTIO_DEV_ANY_ID},+{0},+};++staticintmlx5v_probe(structauxiliary_device*adev,+conststructauxiliary_device_id*id)++{+structmlx5_adev*madev=container_of(adev,structmlx5_adev,adev);+structmlx5_core_dev*mdev=madev->mdev;+structmlx5_vdpa_mgmtdev*mgtdev;+interr;++mgtdev=kzalloc(sizeof(*mgtdev),GFP_KERNEL);+if(!mgtdev)+return-ENOMEM;++mgtdev->mgtdev.ops=&mdev_ops;+mgtdev->mgtdev.device=mdev->device;+mgtdev->mgtdev.id_table=id_table;+mgtdev->madev=madev;++err=vdpa_mgmtdev_register(&mgtdev->mgtdev);+if(err)+gotoreg_err;++dev_set_drvdata(&adev->dev,mgtdev);++return0;++reg_err:+kfree(mdev);+returnerr;+}+staticvoidmlx5v_remove(structauxiliary_device*adev){-structmlx5_vdpa_dev*mvdev=dev_get_drvdata(&adev->dev);+structmlx5_vdpa_mgmtdev*mgtdev;-vdpa_unregister_device(&mvdev->vdev);+mgtdev=dev_get_drvdata(&adev->dev);+vdpa_mgmtdev_unregister(&mgtdev->mgtdev);+kfree(mgtdev);}staticconststructauxiliary_device_idmlx5v_id_table[]={
From: "Michael S. Tsirkin" <mst@redhat.com> Date: 2021-02-23 12:54:17
On Tue, Feb 23, 2021 at 02:33:04PM +0200, Eli Cohen wrote:
On Tue, Feb 23, 2021 at 07:29:32AM -0500, Michael S. Tsirkin wrote:
quoted
On Thu, Feb 18, 2021 at 09:41:57AM +0200, Eli Cohen wrote:
quoted
Allow to control vdpa device creation and destruction using the vdpa
management tool.
Examples:
1. List the management devices
$ vdpa mgmtdev show
pci/0000:3b:00.1:
supported_classes net
2. Create vdpa instance
$ vdpa dev add mgmtdev pci/0000:3b:00.1 name vdpa0
3. Show vdpa devices
$ vdpa dev show
vdpa0: type network mgmtdev pci/0000:3b:00.1 vendor_id 5555 max_vqs 16 \
max_vq_size 256
Signed-off-by: Eli Cohen <redacted>
Reviewed-by: Parav Pandit <redacted>
Not sure which tree this is for, I could not apply this.
Depends on Parav's vdpa tool patches. We'll send the entire series again
- Parav's and my patches.
I think I have them in the linux next branch, no?
quoted
quoted
---
v0->v1:
set mgtdev->ndev NULL on dev delete
v1->v2: Resend
drivers/vdpa/mlx5/net/mlx5_vnet.c | 79 +++++++++++++++++++++++++++----
1 file changed, 70 insertions(+), 9 deletions(-)
@@ -1974,23 +1974,32 @@ static void init_mvqs(struct mlx5_vdpa_net *ndev)}}-staticintmlx5v_probe(structauxiliary_device*adev,-conststructauxiliary_device_id*id)+structmlx5_vdpa_mgmtdev{+structvdpa_mgmt_devmgtdev;+structmlx5_adev*madev;+structmlx5_vdpa_net*ndev;+};++staticintmlx5_vdpa_dev_add(structvdpa_mgmt_dev*v_mdev,constchar*name){-structmlx5_adev*madev=container_of(adev,structmlx5_adev,adev);-structmlx5_core_dev*mdev=madev->mdev;+structmlx5_vdpa_mgmtdev*mgtdev=container_of(v_mdev,structmlx5_vdpa_mgmtdev,mgtdev);structvirtio_net_config*config;structmlx5_vdpa_dev*mvdev;structmlx5_vdpa_net*ndev;+structmlx5_core_dev*mdev;u32max_vqs;interr;+if(mgtdev->ndev)+return-ENOSPC;++mdev=mgtdev->madev->mdev;/* we save one virtqueue for control virtqueue should we require it */max_vqs=MLX5_CAP_DEV_VDPA_EMULATION(mdev,max_num_virtio_queues);max_vqs=min_t(u32,max_vqs,MLX5_MAX_SUPPORTED_VQS);ndev=vdpa_alloc_device(structmlx5_vdpa_net,mvdev.vdev,mdev->device,&mlx5_vdpa_ops,-2*mlx5_vdpa_max_qps(max_vqs),NULL);+2*mlx5_vdpa_max_qps(max_vqs),name);if(IS_ERR(ndev))returnPTR_ERR(ndev);
@@ -2018,11 +2027,12 @@ static int mlx5v_probe(struct auxiliary_device *adev,if(err)gotoerr_res;-err=vdpa_register_device(&mvdev->vdev);+mvdev->vdev.mdev=&mgtdev->mgtdev;+err=_vdpa_register_device(&mvdev->vdev);if(err)gotoerr_reg;-dev_set_drvdata(&adev->dev,ndev);+mgtdev->ndev=ndev;return0;err_reg:
@@ -2035,11 +2045,62 @@ static int mlx5v_probe(struct auxiliary_device *adev,returnerr;}+staticvoidmlx5_vdpa_dev_del(structvdpa_mgmt_dev*v_mdev,structvdpa_device*dev)+{+structmlx5_vdpa_mgmtdev*mgtdev=container_of(v_mdev,structmlx5_vdpa_mgmtdev,mgtdev);++_vdpa_unregister_device(dev);+mgtdev->ndev=NULL;+}++staticconststructvdpa_mgmtdev_opsmdev_ops={+.dev_add=mlx5_vdpa_dev_add,+.dev_del=mlx5_vdpa_dev_del,+};++staticstructvirtio_device_idid_table[]={+{VIRTIO_ID_NET,VIRTIO_DEV_ANY_ID},+{0},+};++staticintmlx5v_probe(structauxiliary_device*adev,+conststructauxiliary_device_id*id)++{+structmlx5_adev*madev=container_of(adev,structmlx5_adev,adev);+structmlx5_core_dev*mdev=madev->mdev;+structmlx5_vdpa_mgmtdev*mgtdev;+interr;++mgtdev=kzalloc(sizeof(*mgtdev),GFP_KERNEL);+if(!mgtdev)+return-ENOMEM;++mgtdev->mgtdev.ops=&mdev_ops;+mgtdev->mgtdev.device=mdev->device;+mgtdev->mgtdev.id_table=id_table;+mgtdev->madev=madev;++err=vdpa_mgmtdev_register(&mgtdev->mgtdev);+if(err)+gotoreg_err;++dev_set_drvdata(&adev->dev,mgtdev);++return0;++reg_err:+kfree(mdev);+returnerr;+}+staticvoidmlx5v_remove(structauxiliary_device*adev){-structmlx5_vdpa_dev*mvdev=dev_get_drvdata(&adev->dev);+structmlx5_vdpa_mgmtdev*mgtdev;-vdpa_unregister_device(&mvdev->vdev);+mgtdev=dev_get_drvdata(&adev->dev);+vdpa_mgmtdev_unregister(&mgtdev->mgtdev);+kfree(mgtdev);}staticconststructauxiliary_device_idmlx5v_id_table[]={