From: "Michael S. Tsirkin" <mst@redhat.com>
To: Eli Cohen <elic@nvidia.com>
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
virtualization@lists.linux-foundation.org, si-wei.liu@oracle.com
Subject: Re: [PATCH v2] vdpa/mlx5: Enable user to add/delete vdpa device
Date: Tue, 23 Feb 2021 07:29:32 -0500 [thread overview]
Message-ID: <20210223072847-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20210218074157.43220-1-elic@nvidia.com>
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 <elic@nvidia.com>
> Reviewed-by: Parav Pandit <parav@nvidia.com>
Not sure which tree this is for, I could not apply this.
> ---
> 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(-)
>
> diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c
> index a51b0f86afe2..08fb481ddc4f 100644
> --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c
> +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c
> @@ -1974,23 +1974,32 @@ static void init_mvqs(struct mlx5_vdpa_net *ndev)
> }
> }
>
> -static int mlx5v_probe(struct auxiliary_device *adev,
> - const struct auxiliary_device_id *id)
> +struct mlx5_vdpa_mgmtdev {
> + struct vdpa_mgmt_dev mgtdev;
> + struct mlx5_adev *madev;
> + struct mlx5_vdpa_net *ndev;
> +};
> +
> +static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name)
> {
> - struct mlx5_adev *madev = container_of(adev, struct mlx5_adev, adev);
> - struct mlx5_core_dev *mdev = madev->mdev;
> + struct mlx5_vdpa_mgmtdev *mgtdev = container_of(v_mdev, struct mlx5_vdpa_mgmtdev, mgtdev);
> struct virtio_net_config *config;
> struct mlx5_vdpa_dev *mvdev;
> struct mlx5_vdpa_net *ndev;
> + struct mlx5_core_dev *mdev;
> u32 max_vqs;
> int err;
>
> + 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(struct mlx5_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))
> return PTR_ERR(ndev);
>
> @@ -2018,11 +2027,12 @@ static int mlx5v_probe(struct auxiliary_device *adev,
> if (err)
> goto err_res;
>
> - err = vdpa_register_device(&mvdev->vdev);
> + mvdev->vdev.mdev = &mgtdev->mgtdev;
> + err = _vdpa_register_device(&mvdev->vdev);
> if (err)
> goto err_reg;
>
> - dev_set_drvdata(&adev->dev, ndev);
> + mgtdev->ndev = ndev;
> return 0;
>
> err_reg:
> @@ -2035,11 +2045,62 @@ static int mlx5v_probe(struct auxiliary_device *adev,
> return err;
> }
>
> +static void mlx5_vdpa_dev_del(struct vdpa_mgmt_dev *v_mdev, struct vdpa_device *dev)
> +{
> + struct mlx5_vdpa_mgmtdev *mgtdev = container_of(v_mdev, struct mlx5_vdpa_mgmtdev, mgtdev);
> +
> + _vdpa_unregister_device(dev);
> + mgtdev->ndev = NULL;
> +}
> +
> +static const struct vdpa_mgmtdev_ops mdev_ops = {
> + .dev_add = mlx5_vdpa_dev_add,
> + .dev_del = mlx5_vdpa_dev_del,
> +};
> +
> +static struct virtio_device_id id_table[] = {
> + { VIRTIO_ID_NET, VIRTIO_DEV_ANY_ID },
> + { 0 },
> +};
> +
> +static int mlx5v_probe(struct auxiliary_device *adev,
> + const struct auxiliary_device_id *id)
> +
> +{
> + struct mlx5_adev *madev = container_of(adev, struct mlx5_adev, adev);
> + struct mlx5_core_dev *mdev = madev->mdev;
> + struct mlx5_vdpa_mgmtdev *mgtdev;
> + int err;
> +
> + 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)
> + goto reg_err;
> +
> + dev_set_drvdata(&adev->dev, mgtdev);
> +
> + return 0;
> +
> +reg_err:
> + kfree(mdev);
> + return err;
> +}
> +
> static void mlx5v_remove(struct auxiliary_device *adev)
> {
> - struct mlx5_vdpa_dev *mvdev = dev_get_drvdata(&adev->dev);
> + struct mlx5_vdpa_mgmtdev *mgtdev;
>
> - vdpa_unregister_device(&mvdev->vdev);
> + mgtdev = dev_get_drvdata(&adev->dev);
> + vdpa_mgmtdev_unregister(&mgtdev->mgtdev);
> + kfree(mgtdev);
> }
>
> static const struct auxiliary_device_id mlx5v_id_table[] = {
> --
> 2.29.2
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization
WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Eli Cohen <elic@nvidia.com>
Cc: jasowang@redhat.com, si-wei.liu@oracle.com,
linux-kernel@vger.kernel.org,
virtualization@lists.linux-foundation.org,
netdev@vger.kernel.org, Parav Pandit <parav@nvidia.com>
Subject: Re: [PATCH v2] vdpa/mlx5: Enable user to add/delete vdpa device
Date: Tue, 23 Feb 2021 07:29:32 -0500 [thread overview]
Message-ID: <20210223072847-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20210218074157.43220-1-elic@nvidia.com>
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 <elic@nvidia.com>
> Reviewed-by: Parav Pandit <parav@nvidia.com>
Not sure which tree this is for, I could not apply this.
> ---
> 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(-)
>
> diff --git a/drivers/vdpa/mlx5/net/mlx5_vnet.c b/drivers/vdpa/mlx5/net/mlx5_vnet.c
> index a51b0f86afe2..08fb481ddc4f 100644
> --- a/drivers/vdpa/mlx5/net/mlx5_vnet.c
> +++ b/drivers/vdpa/mlx5/net/mlx5_vnet.c
> @@ -1974,23 +1974,32 @@ static void init_mvqs(struct mlx5_vdpa_net *ndev)
> }
> }
>
> -static int mlx5v_probe(struct auxiliary_device *adev,
> - const struct auxiliary_device_id *id)
> +struct mlx5_vdpa_mgmtdev {
> + struct vdpa_mgmt_dev mgtdev;
> + struct mlx5_adev *madev;
> + struct mlx5_vdpa_net *ndev;
> +};
> +
> +static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name)
> {
> - struct mlx5_adev *madev = container_of(adev, struct mlx5_adev, adev);
> - struct mlx5_core_dev *mdev = madev->mdev;
> + struct mlx5_vdpa_mgmtdev *mgtdev = container_of(v_mdev, struct mlx5_vdpa_mgmtdev, mgtdev);
> struct virtio_net_config *config;
> struct mlx5_vdpa_dev *mvdev;
> struct mlx5_vdpa_net *ndev;
> + struct mlx5_core_dev *mdev;
> u32 max_vqs;
> int err;
>
> + 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(struct mlx5_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))
> return PTR_ERR(ndev);
>
> @@ -2018,11 +2027,12 @@ static int mlx5v_probe(struct auxiliary_device *adev,
> if (err)
> goto err_res;
>
> - err = vdpa_register_device(&mvdev->vdev);
> + mvdev->vdev.mdev = &mgtdev->mgtdev;
> + err = _vdpa_register_device(&mvdev->vdev);
> if (err)
> goto err_reg;
>
> - dev_set_drvdata(&adev->dev, ndev);
> + mgtdev->ndev = ndev;
> return 0;
>
> err_reg:
> @@ -2035,11 +2045,62 @@ static int mlx5v_probe(struct auxiliary_device *adev,
> return err;
> }
>
> +static void mlx5_vdpa_dev_del(struct vdpa_mgmt_dev *v_mdev, struct vdpa_device *dev)
> +{
> + struct mlx5_vdpa_mgmtdev *mgtdev = container_of(v_mdev, struct mlx5_vdpa_mgmtdev, mgtdev);
> +
> + _vdpa_unregister_device(dev);
> + mgtdev->ndev = NULL;
> +}
> +
> +static const struct vdpa_mgmtdev_ops mdev_ops = {
> + .dev_add = mlx5_vdpa_dev_add,
> + .dev_del = mlx5_vdpa_dev_del,
> +};
> +
> +static struct virtio_device_id id_table[] = {
> + { VIRTIO_ID_NET, VIRTIO_DEV_ANY_ID },
> + { 0 },
> +};
> +
> +static int mlx5v_probe(struct auxiliary_device *adev,
> + const struct auxiliary_device_id *id)
> +
> +{
> + struct mlx5_adev *madev = container_of(adev, struct mlx5_adev, adev);
> + struct mlx5_core_dev *mdev = madev->mdev;
> + struct mlx5_vdpa_mgmtdev *mgtdev;
> + int err;
> +
> + 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)
> + goto reg_err;
> +
> + dev_set_drvdata(&adev->dev, mgtdev);
> +
> + return 0;
> +
> +reg_err:
> + kfree(mdev);
> + return err;
> +}
> +
> static void mlx5v_remove(struct auxiliary_device *adev)
> {
> - struct mlx5_vdpa_dev *mvdev = dev_get_drvdata(&adev->dev);
> + struct mlx5_vdpa_mgmtdev *mgtdev;
>
> - vdpa_unregister_device(&mvdev->vdev);
> + mgtdev = dev_get_drvdata(&adev->dev);
> + vdpa_mgmtdev_unregister(&mgtdev->mgtdev);
> + kfree(mgtdev);
> }
>
> static const struct auxiliary_device_id mlx5v_id_table[] = {
> --
> 2.29.2
next prev parent reply other threads:[~2021-02-23 12:29 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-18 7:41 [PATCH v2] vdpa/mlx5: Enable user to add/delete vdpa device Eli Cohen
2021-02-23 12:29 ` Michael S. Tsirkin [this message]
2021-02-23 12:29 ` Michael S. Tsirkin
2021-02-23 12:33 ` Eli Cohen
2021-02-23 12:52 ` Michael S. Tsirkin
2021-02-23 12:52 ` Michael S. Tsirkin
2021-02-23 12:54 ` Eli Cohen
2021-02-23 12:56 ` Michael S. Tsirkin
2021-02-23 12:56 ` Michael S. Tsirkin
2021-02-23 12:59 ` Eli Cohen
2021-02-23 13:01 ` Michael S. Tsirkin
2021-02-23 13:01 ` Michael S. Tsirkin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210223072847-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=elic@nvidia.com \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=si-wei.liu@oracle.com \
--cc=virtualization@lists.linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.