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 <a...@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
signature.asc
Description: PGP signature