Re: [PATCH 1/6] mdev: class id support

From: Jason Wang
Date: Tue Sep 24 2019 - 06:12:04 EST



On 2019/9/24 äå12:05, Alex Williamson wrote:
> On Mon, 23 Sep 2019 21:03:26 +0800
> Jason Wang <jasowang@xxxxxxxxxx> wrote:
>
>> Mdev bus only supports vfio driver right now, so it doesn't implement
>> match method. But in the future, we may add drivers other than vfio,
>> one example is virtio-mdev[1] driver. This means we need to add device
>> class id support in bus match method to pair the mdev device and mdev
>> driver correctly.
>>
>> So this patch adds id_table to mdev_driver and class_id for mdev
>> parent with the match method for mdev bus.
>>
>> Signed-off-by: Jason Wang <jasowang@xxxxxxxxxx>
>> ---
>> Documentation/driver-api/vfio-mediated-device.rst | 7 +++++--
>> drivers/gpu/drm/i915/gvt/kvmgt.c | 2 +-
>> drivers/s390/cio/vfio_ccw_ops.c | 2 +-
>> drivers/s390/crypto/vfio_ap_ops.c | 3 ++-
>> drivers/vfio/mdev/mdev_core.c | 14 ++++++++++++--
>> drivers/vfio/mdev/mdev_driver.c | 14 ++++++++++++++
>> drivers/vfio/mdev/mdev_private.h | 1 +
>> drivers/vfio/mdev/vfio_mdev.c | 6 ++++++
>> include/linux/mdev.h | 7 ++++++-
>> include/linux/mod_devicetable.h | 8 ++++++++
>> samples/vfio-mdev/mbochs.c | 2 +-
>> samples/vfio-mdev/mdpy.c | 2 +-
>> samples/vfio-mdev/mtty.c | 2 +-
>> 13 files changed, 59 insertions(+), 11 deletions(-)
>>
>> diff --git a/Documentation/driver-api/vfio-mediated-device.rst b/Documentation/driver-api/vfio-mediated-device.rst
>> index 25eb7d5b834b..0e052072e1d8 100644
>> --- a/Documentation/driver-api/vfio-mediated-device.rst
>> +++ b/Documentation/driver-api/vfio-mediated-device.rst
>> @@ -102,12 +102,14 @@ structure to represent a mediated device's driver::
>> * @probe: called when new device created
>> * @remove: called when device removed
>> * @driver: device driver structure
>> + * @id_table: the ids serviced by this driver.
>> */
>> struct mdev_driver {
>> const char *name;
>> int (*probe) (struct device *dev);
>> void (*remove) (struct device *dev);
>> struct device_driver driver;
>> + const struct mdev_class_id *id_table;
>> };
>>
>> A mediated bus driver for mdev should use this structure in the function calls
>> @@ -116,7 +118,7 @@ to register and unregister itself with the core driver:
>> * Register::
>>
>> extern int mdev_register_driver(struct mdev_driver *drv,
>> - struct module *owner);
>> + struct module *owner);
>>
>> * Unregister::
>>
>> @@ -163,7 +165,8 @@ A driver should use the mdev_parent_ops structure in the function call to
>> register itself with the mdev core driver::
>>
>> extern int mdev_register_device(struct device *dev,
>> - const struct mdev_parent_ops *ops);
>> + const struct mdev_parent_ops *ops,
>> + u8 class_id);
>>
>> However, the mdev_parent_ops structure is not required in the function call
>> that a driver should use to unregister itself with the mdev core driver::
>> diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c
>> index 23aa3e50cbf8..19d51a35f019 100644
>> --- a/drivers/gpu/drm/i915/gvt/kvmgt.c
>> +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c
>> @@ -1625,7 +1625,7 @@ static int kvmgt_host_init(struct device *dev, void *gvt, const void *ops)
>> return -EFAULT;
>> intel_vgpu_ops.supported_type_groups = kvm_vgpu_type_groups;
>>
>> - return mdev_register_device(dev, &intel_vgpu_ops);
>> + return mdev_register_vfio_device(dev, &intel_vgpu_ops);
>> }
>>
>> static void kvmgt_host_exit(struct device *dev)
>> diff --git a/drivers/s390/cio/vfio_ccw_ops.c b/drivers/s390/cio/vfio_ccw_ops.c
>> index f0d71ab77c50..246ff0f80944 100644
>> --- a/drivers/s390/cio/vfio_ccw_ops.c
>> +++ b/drivers/s390/cio/vfio_ccw_ops.c
>> @@ -588,7 +588,7 @@ static const struct mdev_parent_ops vfio_ccw_mdev_ops = {
>>
>> int vfio_ccw_mdev_reg(struct subchannel *sch)
>> {
>> - return mdev_register_device(&sch->dev, &vfio_ccw_mdev_ops);
>> + return mdev_register_vfio_device(&sch->dev, &vfio_ccw_mdev_ops);
>> }
>>
>> void vfio_ccw_mdev_unreg(struct subchannel *sch)
>> diff --git a/drivers/s390/crypto/vfio_ap_ops.c b/drivers/s390/crypto/vfio_ap_ops.c
>> index 5c0f53c6dde7..7487fc39d2c5 100644
>> --- a/drivers/s390/crypto/vfio_ap_ops.c
>> +++ b/drivers/s390/crypto/vfio_ap_ops.c
>> @@ -1295,7 +1295,8 @@ int vfio_ap_mdev_register(void)
>> {
>> atomic_set(&matrix_dev->available_instances, MAX_ZDEV_ENTRIES_EXT);
>>
>> - return mdev_register_device(&matrix_dev->device, &vfio_ap_matrix_ops);
>> + return mdev_register_vfio_device(&matrix_dev->device,
>> + &vfio_ap_matrix_ops);
>> }
>>
>> void vfio_ap_mdev_unregister(void)
>> diff --git a/drivers/vfio/mdev/mdev_core.c b/drivers/vfio/mdev/mdev_core.c
>> index b558d4cfd082..a02c256a3514 100644
>> --- a/drivers/vfio/mdev/mdev_core.c
>> +++ b/drivers/vfio/mdev/mdev_core.c
>> @@ -135,11 +135,14 @@ static int mdev_device_remove_cb(struct device *dev, void *data)
>> * mdev_register_device : Register a device
>> * @dev: device structure representing parent device.
>> * @ops: Parent device operation structure to be registered.
>> + * @id: device id.
>> *
>> * Add device to list of registered parent devices.
>> * Returns a negative value on error, otherwise 0.
>> */
>> -int mdev_register_device(struct device *dev, const struct mdev_parent_ops *ops)
>> +int mdev_register_device(struct device *dev,
>> + const struct mdev_parent_ops *ops,
>> + u8 class_id)
>> {
>> int ret;
>> struct mdev_parent *parent;
>> @@ -175,6 +178,7 @@ int mdev_register_device(struct device *dev, const struct mdev_parent_ops *ops)
>>
>> parent->dev = dev;
>> parent->ops = ops;
>> + parent->class_id = class_id;
>>
> I don't think we want to tie the class_id to the parent. mdev parent
> devices can create various types of devices, some might be virtio, some
> might be vfio. I think the cover letter even suggests that's a
> direction these virtio devices might be headed. It seems the class
> should be on the resulting device itself. That also suggests that at
> the parent we cannot have a single device_ops, the ops used will depend
> on the type of device created. Perhaps that means we need vfio_ops
> alongside virtio_ops, rather than a common device_ops. Thanks,
>
> Alex
>

Yes, will do it in V2.

Thanks