On Thu, 17 Oct 2019 18:48:35 +0800
Jason Wang <jasowang@xxxxxxxxxx> 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 <jasowang@xxxxxxxxxx>
---
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)Hm, so how is that mdev features interface supposed to work? If
+{
+ 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;
+ }
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;
+}