On Mon, 2014-08-25 at 15:27 +0200, Eric Auger wrote: > New functions are added to be called from ARM KVM-VFIO device. > > - vfio_device_get_external_user enables to get a vfio device from > its fd > - vfio_device_put_external_user puts the vfio device > - vfio_external_get_type enables to retrieve the type of the device > (PCI or platform) > - vfio_external_get_base_device enables to get the > struct device*, useful to access the platform_device > > Signed-off-by: Eric Auger <eric.auger@xxxxxxxxxx> > --- > drivers/vfio/vfio.c | 35 +++++++++++++++++++++++++++++++++++ > include/linux/vfio.h | 4 ++++ > 2 files changed, 39 insertions(+) > > diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c > index 8e84471..c93b9e4 100644 > --- a/drivers/vfio/vfio.c > +++ b/drivers/vfio/vfio.c > @@ -1401,6 +1401,41 @@ void vfio_group_put_external_user(struct vfio_group *group) > } > EXPORT_SYMBOL_GPL(vfio_group_put_external_user); > > +struct vfio_device *vfio_device_get_external_user(struct file *filep) > +{ > + struct vfio_device *vdev = filep->private_data; > + > + if (filep->f_op != &vfio_device_fops) > + return ERR_PTR(-EINVAL); > + > + vfio_device_get(vdev); > + return vdev; > +} > +EXPORT_SYMBOL_GPL(vfio_device_get_external_user); > + > +void vfio_device_put_external_user(struct vfio_device *vdev) > +{ > + vfio_device_put(vdev); > +} > +EXPORT_SYMBOL_GPL(vfio_device_put_external_user); > + > +int vfio_external_get_type(struct vfio_device *vdev) > +{ > + if (!strcmp(vdev->ops->name, "vfio-platform")) > + return VFIO_DEVICE_FLAGS_PLATFORM; > + else if (!strcmp(vdev->ops->name, "vfio-pci")) > + return VFIO_DEVICE_FLAGS_PCI; > + else > + return -EINVAL; > +} > +EXPORT_SYMBOL_GPL(vfio_external_get_type); Returning the bit of the flag we use in get_device_info looks rather sloppy here. Should we define a new enum for use with this? Actually, is this interface even necessary? If we can get the struct device then we can get the bus_type and keep vfio out of this. For both of these last two, I like to use the convention that where there is a "get" there is a matching "put". These aren't reference counting anything, so let's not use get in the name. > + > +struct device *vfio_external_get_base_device(struct vfio_device *vdev) > +{ > + return vdev->dev; > +} > +EXPORT_SYMBOL_GPL(vfio_external_get_base_device); > + Looks almost too simple, but reviewing the object lifecycles, this all looks safe. Thanks, Alex > int vfio_external_user_iommu_id(struct vfio_group *group) > { > return iommu_group_id(group->iommu_group); > diff --git a/include/linux/vfio.h b/include/linux/vfio.h > index ffe04ed..19e98eb 100644 > --- a/include/linux/vfio.h > +++ b/include/linux/vfio.h > @@ -99,6 +99,10 @@ 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_device *vfio_device_get_external_user(struct file *filep); > +extern void vfio_device_put_external_user(struct vfio_device *vdev); > +extern int vfio_external_get_type(struct vfio_device *vdev); > +extern struct device *vfio_external_get_base_device(struct vfio_device *vdev); > > struct pci_dev; > #ifdef CONFIG_EEH -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html