Re: [PATCH kernel 14/15] vfio/spapr_tce: Export container API for external users
flat view
From: David Gibson <hidden>
Date: 2016-08-12 05:44:04
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 <redacted>
I'll address Alex W's broader concerns in a different mail. But there are some more superficial problems with this as well.
quoted hunk ↗ jump to hunk
--- 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.
quoted hunk ↗ jump to hunk
+{ + 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
Attachments
- signature.asc [application/pgp-signature] 819 bytes