[PATCH kernel 14/15] vfio/spapr_tce: Export container API for external users
David Gibson
david at gibson.dropbear.id.au
Fri Aug 12 15:25:50 AEST 2016
On Wed, Aug 03, 2016 at 06:40:55PM +1000, Alexey Kardashevskiy 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>
I'll address Alex W's broader concerns in a different mail. But
there are some more superficial problems with this as well.
> ---
> 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)
I really dislike this name. I was confused for a while why this
existed on top of vfio_container_get_ext(), the names are so similar.
Making it take a void * is also really nasty since that void * has to
be something specific. It would be better to have this take a
vfio_container *, verify that the container really does have an
spapr_tce backend, then lookup the tce_container and the actual IOMMU
tables within.
That might also let you drop vfio_container_get_iommu_data_ext()
entirely.
> +{
> + 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
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.ozlabs.org/pipermail/linuxppc-dev/attachments/20160812/f65348ac/attachment-0001.sig>
More information about the Linuxppc-dev
mailing list