On Thu, 17 Oct 2019 18:48:35 +0800
Jason Wang <jasow...@redhat.com> wrote:

> This patch introduces a new mdev transport for virtio. This is used to
> use kernel virtio driver to drive the mediated device that is capable
> of populating virtqueue directly.
> 
> A new virtio-mdev driver will be registered to the mdev bus, when a
> new virtio-mdev device is probed, it will register the device with
> mdev based config ops. This means it is a software transport between
> mdev driver and mdev device. The transport was implemented through
> device specific ops which is a part of mdev_parent_ops now.
> 
> Signed-off-by: Jason Wang <jasow...@redhat.com>
> ---
>  drivers/virtio/Kconfig       |   7 +
>  drivers/virtio/Makefile      |   1 +
>  drivers/virtio/virtio_mdev.c | 409 +++++++++++++++++++++++++++++++++++
>  3 files changed, 417 insertions(+)

(...)

> +static int virtio_mdev_probe(struct device *dev)
> +{
> +     struct mdev_device *mdev = mdev_from_dev(dev);
> +     const struct virtio_mdev_device_ops *ops = mdev_get_dev_ops(mdev);
> +     struct virtio_mdev_device *vm_dev;
> +     int rc;
> +
> +     vm_dev = devm_kzalloc(dev, sizeof(*vm_dev), GFP_KERNEL);
> +     if (!vm_dev)
> +             return -ENOMEM;
> +
> +     vm_dev->vdev.dev.parent = dev;
> +     vm_dev->vdev.dev.release = virtio_mdev_release_dev;
> +     vm_dev->vdev.config = &virtio_mdev_config_ops;
> +     vm_dev->mdev = mdev;
> +     INIT_LIST_HEAD(&vm_dev->virtqueues);
> +     spin_lock_init(&vm_dev->lock);
> +
> +     vm_dev->version = ops->get_mdev_features(mdev);
> +     if (vm_dev->version != VIRTIO_MDEV_F_VERSION_1) {
> +             dev_err(dev, "VIRTIO_MDEV_F_VERSION_1 is mandatory\n");
> +             return -ENXIO;
> +     }

Hm, so how is that mdev features interface supposed to work? If
VIRTIO_MDEV_F_VERSION_1 is a bit, I would expect this code to test for
its presence, and not for identity.

What will happen if we come up with a version 2? If this is backwards
compatible, will both version 2 and version 1 be set?

> +
> +     vm_dev->vdev.id.device = ops->get_device_id(mdev);
> +     if (vm_dev->vdev.id.device == 0)
> +             return -ENODEV;
> +
> +     vm_dev->vdev.id.vendor = ops->get_vendor_id(mdev);
> +     rc = register_virtio_device(&vm_dev->vdev);
> +     if (rc)
> +             put_device(dev);
> +     else
> +             dev_set_drvdata(dev, vm_dev);
> +
> +     return rc;
> +}

(...)
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to