[PATCH kernel 14/15] vfio/spapr_tce: Export container API for external users

Alexey Kardashevskiy aik at ozlabs.ru
Tue Aug 9 15:19:39 AEST 2016


On 09/08/16 02:43, Alex Williamson wrote:
> On Wed,  3 Aug 2016 18:40:55 +1000
> Alexey Kardashevskiy <aik at ozlabs.ru> wrote:
> 
>> This exports helpers which are needed to keep a VFIO container in
>> memory while there are external users such as KVM.
>>
>> Signed-off-by: Alexey Kardashevskiy <aik at ozlabs.ru>
>> ---
>>  drivers/vfio/vfio.c                 | 30 ++++++++++++++++++++++++++++++
>>  drivers/vfio/vfio_iommu_spapr_tce.c | 16 +++++++++++++++-
>>  include/linux/vfio.h                |  6 ++++++
>>  3 files changed, 51 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c
>> index d1d70e0..baf6a9c 100644
>> --- a/drivers/vfio/vfio.c
>> +++ b/drivers/vfio/vfio.c
>> @@ -1729,6 +1729,36 @@ long vfio_external_check_extension(struct vfio_group *group, unsigned long arg)
>>  EXPORT_SYMBOL_GPL(vfio_external_check_extension);
>>  
>>  /**
>> + * External user API for containers, exported by symbols to be linked
>> + * dynamically.
>> + *
>> + */
>> +struct vfio_container *vfio_container_get_ext(struct file *filep)
>> +{
>> +	struct vfio_container *container = filep->private_data;
>> +
>> +	if (filep->f_op != &vfio_fops)
>> +		return ERR_PTR(-EINVAL);
>> +
>> +	vfio_container_get(container);
>> +
>> +	return container;
>> +}
>> +EXPORT_SYMBOL_GPL(vfio_container_get_ext);
>> +
>> +void vfio_container_put_ext(struct vfio_container *container)
>> +{
>> +	vfio_container_put(container);
>> +}
>> +EXPORT_SYMBOL_GPL(vfio_container_put_ext);
>> +
>> +void *vfio_container_get_iommu_data_ext(struct vfio_container *container)
>> +{
>> +	return container->iommu_data;
>> +}
>> +EXPORT_SYMBOL_GPL(vfio_container_get_iommu_data_ext);
>> +
>> +/**
>>   * Sub-module support
>>   */
>>  /*
>> diff --git a/drivers/vfio/vfio_iommu_spapr_tce.c b/drivers/vfio/vfio_iommu_spapr_tce.c
>> index 3594ad3..fceea3d 100644
>> --- a/drivers/vfio/vfio_iommu_spapr_tce.c
>> +++ b/drivers/vfio/vfio_iommu_spapr_tce.c
>> @@ -1331,6 +1331,21 @@ const struct vfio_iommu_driver_ops tce_iommu_driver_ops = {
>>  	.detach_group	= tce_iommu_detach_group,
>>  };
>>  
>> +struct iommu_table *vfio_container_spapr_tce_table_get_ext(void *iommu_data,
>> +		u64 offset)
>> +{
>> +	struct tce_container *container = iommu_data;
>> +	struct iommu_table *tbl = NULL;
>> +
>> +	if (tce_iommu_find_table(container, offset, &tbl) < 0)
>> +		return NULL;
>> +
>> +	iommu_table_get(tbl);
>> +
>> +	return tbl;
>> +}
>> +EXPORT_SYMBOL_GPL(vfio_container_spapr_tce_table_get_ext);
>> +
>>  static int __init tce_iommu_init(void)
>>  {
>>  	return vfio_register_iommu_driver(&tce_iommu_driver_ops);
>> @@ -1348,4 +1363,3 @@ MODULE_VERSION(DRIVER_VERSION);
>>  MODULE_LICENSE("GPL v2");
>>  MODULE_AUTHOR(DRIVER_AUTHOR);
>>  MODULE_DESCRIPTION(DRIVER_DESC);
>> -
>> diff --git a/include/linux/vfio.h b/include/linux/vfio.h
>> index 0ecae0b..1c2138a 100644
>> --- a/include/linux/vfio.h
>> +++ b/include/linux/vfio.h
>> @@ -91,6 +91,12 @@ extern void vfio_group_put_external_user(struct vfio_group *group);
>>  extern int vfio_external_user_iommu_id(struct vfio_group *group);
>>  extern long vfio_external_check_extension(struct vfio_group *group,
>>  					  unsigned long arg);
>> +extern struct vfio_container *vfio_container_get_ext(struct file *filep);
>> +extern void vfio_container_put_ext(struct vfio_container *container);
>> +extern void *vfio_container_get_iommu_data_ext(
>> +		struct vfio_container *container);
>> +extern struct iommu_table *vfio_container_spapr_tce_table_get_ext(
>> +		void *iommu_data, u64 offset);
>>  
>>  /*
>>   * Sub-module helpers
> 
> 
> I think you need to take a closer look of the lifecycle of a container,
> having a reference means the container itself won't go away, but only
> having a group set within that container holds the actual IOMMU
> references.  container->iommu_data is going to be NULL once the
> groups are lost.  Thanks,


Container owns the iommu tables and this is what I care about here, groups
attached or not - this is handled separately via IOMMU group list in a
specific iommu_table struct, these groups get detached from iommu_table
when they are removed from a container.


-- 
Alexey


More information about the Linuxppc-dev mailing list