Re: [PATCH v4 2/6] vfio/mdev: Add "aggregation" attribute for supported mdev type

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 26 Nov 2018 16:48:52 +0800
Zhenyu Wang <zhenyuw@xxxxxxxxxxxxxxx> wrote:

> For supported mdev driver to create aggregated device, this creates
> new "aggregation" attribute for target type, which will show maximum
> number of instance resources that can be aggregated.
> 
> Cc: Kirti Wankhede <kwankhede@xxxxxxxxxx>
> Cc: Alex Williamson <alex.williamson@xxxxxxxxxx>
> Cc: Kevin Tian <kevin.tian@xxxxxxxxx>
> Cc: Cornelia Huck <cohuck@xxxxxxxxxx>
> Signed-off-by: Zhenyu Wang <zhenyuw@xxxxxxxxxxxxxxx>
> ---
>  drivers/vfio/mdev/mdev_core.c    | 19 +++++++++++++++++++
>  drivers/vfio/mdev/mdev_private.h |  2 ++
>  drivers/vfio/mdev/mdev_sysfs.c   | 22 ++++++++++++++++++++++
>  include/linux/mdev.h             |  8 ++++++++
>  4 files changed, 51 insertions(+)
> 
> diff --git a/drivers/vfio/mdev/mdev_core.c b/drivers/vfio/mdev/mdev_core.c
> index 545c52ec7618..8f8bbb72e5d9 100644
> --- a/drivers/vfio/mdev/mdev_core.c
> +++ b/drivers/vfio/mdev/mdev_core.c
> @@ -161,6 +161,25 @@ static int mdev_device_remove_cb(struct device *dev, void *data)
>  	return mdev_device_remove(dev, data ? *(bool *)data : true);
>  }
>  
> +int mdev_max_aggregated_instances(struct kobject *kobj, struct device *dev,
> +				  unsigned int *m)
> +{
> +	struct mdev_parent *parent;
> +	struct mdev_type *type = to_mdev_type(kobj);
> +	int ret;
> +
> +	parent = mdev_get_parent(type->parent);
> +	if (!parent)
> +		return -EINVAL;
> +
> +	if (parent->ops->max_aggregated_instances) {
> +		ret = parent->ops->max_aggregated_instances(kobj, dev, m);
> +	} else
> +		ret = -EINVAL;
> +	mdev_put_parent(parent);
> +	return ret;
> +}
> +
>  /*
>   * mdev_register_device : Register a device
>   * @dev: device structure representing parent device.
> diff --git a/drivers/vfio/mdev/mdev_private.h b/drivers/vfio/mdev/mdev_private.h
> index e90d295d3927..f1289db75884 100644
> --- a/drivers/vfio/mdev/mdev_private.h
> +++ b/drivers/vfio/mdev/mdev_private.h
> @@ -63,4 +63,6 @@ int  mdev_device_create(struct kobject *kobj, struct device *dev, uuid_le uuid,
>  			unsigned int instances);
>  int  mdev_device_remove(struct device *dev, bool force_remove);
>  
> +int  mdev_max_aggregated_instances(struct kobject *kobj, struct device *dev,
> +				   unsigned int *m);
>  #endif /* MDEV_PRIVATE_H */
> diff --git a/drivers/vfio/mdev/mdev_sysfs.c b/drivers/vfio/mdev/mdev_sysfs.c
> index aefed0c8891b..a329d6ab6cb9 100644
> --- a/drivers/vfio/mdev/mdev_sysfs.c
> +++ b/drivers/vfio/mdev/mdev_sysfs.c
> @@ -103,6 +103,18 @@ static ssize_t create_store(struct kobject *kobj, struct device *dev,
>  
>  MDEV_TYPE_ATTR_WO(create);
>  
> +static ssize_t
> +aggregation_show(struct kobject *kobj, struct device *dev, char *buf)
> +{
> +	unsigned int m;
> +
> +	if (mdev_max_aggregated_instances(kobj, dev, &m))
> +		return sprintf(buf, "1\n");
> +	else
> +		return sprintf(buf, "%u\n", m);
> +}
> +MDEV_TYPE_ATTR_RO(aggregation);
> +
>  static void mdev_type_release(struct kobject *kobj)
>  {
>  	struct mdev_type *type = to_mdev_type(kobj);
> @@ -145,6 +157,14 @@ struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent,
>  	if (ret)
>  		goto attr_create_failed;
>  
> +	if (parent->ops->create_with_instances &&
> +	    parent->ops->max_aggregated_instances) {
> +		ret = sysfs_create_file(&type->kobj,
> +					&mdev_type_attr_aggregation.attr);
> +		if (ret)
> +			goto attr_aggregate_failed;
> +	}
> +
>  	type->devices_kobj = kobject_create_and_add("devices", &type->kobj);
>  	if (!type->devices_kobj) {
>  		ret = -ENOMEM;
> @@ -165,6 +185,8 @@ struct mdev_type *add_mdev_supported_type(struct mdev_parent *parent,
>  attrs_failed:
>  	kobject_put(type->devices_kobj);
>  attr_devices_failed:
> +	sysfs_remove_file(&type->kobj, &mdev_type_attr_aggregation.attr);
> +attr_aggregate_failed:
>  	sysfs_remove_file(&type->kobj, &mdev_type_attr_create.attr);
>  attr_create_failed:
>  	kobject_del(&type->kobj);

Where's the matching entry in remove_mdev_supported_type()?  Thanks,

Alex

> diff --git a/include/linux/mdev.h b/include/linux/mdev.h
> index c12c0bfc5598..66cfdb0bf0d6 100644
> --- a/include/linux/mdev.h
> +++ b/include/linux/mdev.h
> @@ -39,6 +39,11 @@ struct mdev_device;
>   *			      that is being created
>   *                      @instances: number of instances to aggregate
>   *			Returns integer: success (0) or error (< 0)
> + * @max_aggregated_instances: Return max number for aggregated resources
> + *			@kobj: kobject of type
> + *                      @dev: mdev parent device for target type
> + *                      @max: return max number of instances which can aggregate
> + *			Returns integer: success (0) or error (< 0)
>   * @remove:		Called to free resources in parent device's driver for a
>   *			a mediated device. It is mandatory to provide 'remove'
>   *			ops.
> @@ -82,6 +87,9 @@ struct mdev_parent_ops {
>  	int     (*create_with_instances)(struct kobject *kobj,
>  					 struct mdev_device *mdev,
>  					 unsigned int instances);
> +	int     (*max_aggregated_instances)(struct kobject *kobj,
> +					    struct device *dev,
> +					    unsigned int *max);
>  	int     (*remove)(struct mdev_device *mdev);
>  	int     (*open)(struct mdev_device *mdev);
>  	void    (*release)(struct mdev_device *mdev);




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux