On Tue, 16 Mar 2021 13:25:59 +0100 Cornelia Huck <cohuck@xxxxxxxxxx> wrote: > On Fri, 12 Mar 2021 20:55:55 -0400 > Jason Gunthorpe <jgg@xxxxxxxxxx> wrote: > > > This makes the struct vfio_pci_device part of the public interface so it s/_pci// > > can be used with container_of and so forth, as is typical for a Linux > > subystem. > > > > This is the first step to bring some type-safety to the vfio interface by > > allowing the replacement of 'void *' and 'struct device *' inputs with a > > simple and clear 'struct vfio_pci_device *' s/_pci// > > > > For now the self-allocating vfio_add_group_dev() interface is kept so each > > user can be updated as a separate patch. > > > > The expected usage pattern is > > > > driver core probe() function: > > my_device = kzalloc(sizeof(*mydevice)); > > vfio_init_group_dev(&my_device->vdev, dev, ops, mydevice); > > /* other driver specific prep */ > > vfio_register_group_dev(&my_device->vdev); > > dev_set_drvdata(my_device); > > > > driver core remove() function: > > my_device = dev_get_drvdata(dev); > > vfio_unregister_group_dev(&my_device->vdev); > > /* other driver specific tear down */ > > kfree(my_device); > > > > Allowing the driver to be able to use the drvdata and vifo_device to go > > s/vifo_device/vfio_device/ > > > to/from its own data. > > > > The pattern also makes it clear that vfio_register_group_dev() must be > > last in the sequence, as once it is called the core code can immediately > > start calling ops. The init/register gap is provided to allow for the > > driver to do setup before ops can be called and thus avoid races. > > > > Reviewed-by: Christoph Hellwig <hch@xxxxxx> > > Reviewed-by: Liu Yi L <yi.l.liu@xxxxxxxxx> > > Signed-off-by: Jason Gunthorpe <jgg@xxxxxxxxxx> > > --- > > Documentation/driver-api/vfio.rst | 31 ++++---- > > drivers/vfio/vfio.c | 123 ++++++++++++++++-------------- > > include/linux/vfio.h | 16 ++++ > > 3 files changed, 98 insertions(+), 72 deletions(-) > > > > diff --git a/Documentation/driver-api/vfio.rst b/Documentation/driver-api/vfio.rst > > index f1a4d3c3ba0bb1..d3a02300913a7f 100644 > > --- a/Documentation/driver-api/vfio.rst > > +++ b/Documentation/driver-api/vfio.rst > > @@ -249,18 +249,23 @@ VFIO bus driver API > > > > VFIO bus drivers, such as vfio-pci make use of only a few interfaces > > into VFIO core. When devices are bound and unbound to the driver, > > -the driver should call vfio_add_group_dev() and vfio_del_group_dev() > > -respectively:: > > - > > - extern int vfio_add_group_dev(struct device *dev, > > - const struct vfio_device_ops *ops, > > - void *device_data); > > - > > - extern void *vfio_del_group_dev(struct device *dev); > > - > > -vfio_add_group_dev() indicates to the core to begin tracking the > > -iommu_group of the specified dev and register the dev as owned by > > -a VFIO bus driver. The driver provides an ops structure for callbacks > > +the driver should call vfio_register_group_dev() and > > +vfio_unregister_group_dev() respectively:: > > + > > + void vfio_init_group_dev(struct vfio_device *device, > > + struct device *dev, > > + const struct vfio_device_ops *ops, > > + void *device_data); > > + int vfio_register_group_dev(struct vfio_device *device); > > + void vfio_unregister_group_dev(struct vfio_device *device); > > + > > +The driver should embed the vfio_device in its own structure and call > > +vfio_init_group_dev() to pre-configure it before going to registration. > > s/it/that structure/ (I guess?) Seems less clear actually, is the object of "that structure" the "vfio_device" or "its own structure". Phrasing somewhat suggests the latter. s/it/the vfio_device structure/ seems excessively verbose. I think "it" is probably sufficient here. Thanks, Alex > > +vfio_register_group_dev() indicates to the core to begin tracking the > > +iommu_group of the specified dev and register the dev as owned by a VFIO bus > > +driver. Once vfio_register_group_dev() returns it is possible for userspace to > > +start accessing the driver, thus the driver should ensure it is completely > > +ready before calling it. The driver provides an ops structure for callbacks > > similar to a file operations structure:: > > > > struct vfio_device_ops { > > Reviewed-by: Cornelia Huck <cohuck@xxxxxxxxxx>