mbox series

[v3,00/14] Embed struct vfio_device in all sub-structures

Message ID 0-v3-225de1400dfc+4e074-vfio1_jgg@nvidia.com (mailing list archive)
Headers show
Series Embed struct vfio_device in all sub-structures | expand

Message

Jason Gunthorpe March 23, 2021, 4:14 p.m. UTC
The main focus of this series is to make VFIO follow the normal kernel
convention of structure embedding for structure inheritance instead of
linking using a 'void *opaque'. Here we focus on moving the vfio_device to
be a member of every struct vfio_XX_device that is linked by a
vfio_add_group_dev().

In turn this allows 'struct vfio_device *' to be used everwhere, and the
public API out of vfio.c can be cleaned to remove places using 'struct
device *' and 'void *' as surrogates to refer to the device.

While this has the minor trade off of moving 'struct vfio_device' the
clarity of the design is worth it. I can speak directly to this idea, as
I've invested a fair amount of time carefully working backwards what all
the type-erased APIs are supposed to be and it is certainly not trivial or
intuitive.

When we get into mdev land things become even more inscrutable, and while
I now have a pretty clear picture, it was hard to obtain. I think this
agrees with the kernel style ideal of being explicit in typing and not
sacrificing clarity to create opaque structs.

After this series the general rules are:
 - Any vfio_XX_device * can be obtained at no cost from a vfio_device *
   using container_of(), and the reverse is possible by &XXdev->vdev

   This is similar to how 'struct pci_device' and 'struct device' are
   interrelated.

   This allows 'device_data' to be completely removed from the vfio.c API.

 - The drvdata for a struct device points at the vfio_XX_device that
   belongs to the driver that was probed. drvdata is removed from the core
   code, and only used as part of the implementation of the struct
   device_driver.

 - The lifetime of vfio_XX_device and vfio_device are identical, they are
   the same memory.

   This follows the existing model where vfio_del_group_dev() blocks until
   all vfio_device_put()'s are completed. This in turn means the struct
   device_driver remove() blocks, and thus under the driver_lock() a bound
   driver must have a valid drvdata pointing at both vfio device
   structs. A following series exploits this further.

Most vfio_XX_device structs have data that duplicates the 'struct
device *dev' member of vfio_device, a following series removes that
duplication too.

Thanks everyone for the reviews!

v3:
 - Fix typos in commit messages
 - Fix missed name change of vfio_group_create_device() in a comment
 - Remove wrong kfree(vdev->name) in vfio_platform
 - Keep dprc_scan_container() after vfio_add_group_dev()
 - Remove struct mdev_vfio_device
v2: https://lore.kernel.org/r/0-v2-20d933792272+4ff-vfio1_jgg@nvidia.com
 - Split the get/put changes out of "Simlpify the lifetime logic for
   vfio_device"
 - Add a patch to fix probe ordering in fsl-mc and remove FIXME
 - Add a patch to re-org pci probe
 - Add a patch to fix probe odering in pci and remove FIXME
 - Remove the **pf_dev output from get_pf_vdev()
v1: https://lore.kernel.org/r/0-v1-7355d38b9344+17481-vfio1_jgg@nvidia.com

Jason Gunthorpe (14):
  vfio: Remove extra put/gets around vfio_device->group
  vfio: Simplify the lifetime logic for vfio_device
  vfio: Split creation of a vfio_device into init and register ops
  vfio/platform: Use vfio_init/register/unregister_group_dev
  vfio/fsl-mc: Re-order vfio_fsl_mc_probe()
  vfio/fsl-mc: Use vfio_init/register/unregister_group_dev
  vfio/pci: Move VGA and VF initialization to functions
  vfio/pci: Re-order vfio_pci_probe()
  vfio/pci: Use vfio_init/register/unregister_group_dev
  vfio/mdev: Use vfio_init/register/unregister_group_dev
  vfio/mdev: Make to_mdev_device() into a static inline
  vfio: Make vfio_device_ops pass a 'struct vfio_device *' instead of
    'void *'
  vfio/pci: Replace uses of vfio_device_data() with container_of
  vfio: Remove device_data from the vfio bus driver API

 Documentation/driver-api/vfio.rst             |  48 ++--
 drivers/vfio/fsl-mc/vfio_fsl_mc.c             | 127 +++++----
 drivers/vfio/fsl-mc/vfio_fsl_mc_private.h     |   1 +
 drivers/vfio/mdev/mdev_private.h              |   5 +-
 drivers/vfio/mdev/vfio_mdev.c                 |  53 ++--
 drivers/vfio/pci/vfio_pci.c                   | 253 ++++++++++--------
 drivers/vfio/pci/vfio_pci_private.h           |   1 +
 drivers/vfio/platform/vfio_amba.c             |   8 +-
 drivers/vfio/platform/vfio_platform.c         |  20 +-
 drivers/vfio/platform/vfio_platform_common.c  |  56 ++--
 drivers/vfio/platform/vfio_platform_private.h |   5 +-
 drivers/vfio/vfio.c                           | 210 +++++----------
 include/linux/vfio.h                          |  37 ++-
 13 files changed, 417 insertions(+), 407 deletions(-)

Comments

Jason Gunthorpe April 6, 2021, 3:57 p.m. UTC | #1
On Tue, Mar 23, 2021 at 01:14:52PM -0300, Jason Gunthorpe wrote:

> Jason Gunthorpe (14):
>   vfio: Remove extra put/gets around vfio_device->group
>   vfio: Simplify the lifetime logic for vfio_device
>   vfio: Split creation of a vfio_device into init and register ops
>   vfio/platform: Use vfio_init/register/unregister_group_dev
>   vfio/fsl-mc: Re-order vfio_fsl_mc_probe()
>   vfio/fsl-mc: Use vfio_init/register/unregister_group_dev
>   vfio/pci: Move VGA and VF initialization to functions
>   vfio/pci: Re-order vfio_pci_probe()
>   vfio/pci: Use vfio_init/register/unregister_group_dev
>   vfio/mdev: Use vfio_init/register/unregister_group_dev
>   vfio/mdev: Make to_mdev_device() into a static inline
>   vfio: Make vfio_device_ops pass a 'struct vfio_device *' instead of
>     'void *'
>   vfio/pci: Replace uses of vfio_device_data() with container_of
>   vfio: Remove device_data from the vfio bus driver API

Hi Alex,

Can you put this someplace to get zero day coverage? We are at rc6 now

Thanks,
Jason
Alex Williamson April 6, 2021, 7:38 p.m. UTC | #2
On Tue, 23 Mar 2021 13:14:52 -0300
Jason Gunthorpe <jgg@nvidia.com> wrote:
> 
>  Documentation/driver-api/vfio.rst             |  48 ++--
>  drivers/vfio/fsl-mc/vfio_fsl_mc.c             | 127 +++++----
>  drivers/vfio/fsl-mc/vfio_fsl_mc_private.h     |   1 +
>  drivers/vfio/mdev/mdev_private.h              |   5 +-
>  drivers/vfio/mdev/vfio_mdev.c                 |  53 ++--
>  drivers/vfio/pci/vfio_pci.c                   | 253 ++++++++++--------
>  drivers/vfio/pci/vfio_pci_private.h           |   1 +
>  drivers/vfio/platform/vfio_amba.c             |   8 +-
>  drivers/vfio/platform/vfio_platform.c         |  20 +-
>  drivers/vfio/platform/vfio_platform_common.c  |  56 ++--
>  drivers/vfio/platform/vfio_platform_private.h |   5 +-
>  drivers/vfio/vfio.c                           | 210 +++++----------
>  include/linux/vfio.h                          |  37 ++-
>  13 files changed, 417 insertions(+), 407 deletions(-)
 

Applied to vfio next branch for v5.13.  Thanks!

Alex
Jason Gunthorpe April 6, 2021, 7:45 p.m. UTC | #3
On Tue, Apr 06, 2021 at 01:38:15PM -0600, Alex Williamson wrote:
> On Tue, 23 Mar 2021 13:14:52 -0300
> Jason Gunthorpe <jgg@nvidia.com> wrote:
> > 
> >  Documentation/driver-api/vfio.rst             |  48 ++--
> >  drivers/vfio/fsl-mc/vfio_fsl_mc.c             | 127 +++++----
> >  drivers/vfio/fsl-mc/vfio_fsl_mc_private.h     |   1 +
> >  drivers/vfio/mdev/mdev_private.h              |   5 +-
> >  drivers/vfio/mdev/vfio_mdev.c                 |  53 ++--
> >  drivers/vfio/pci/vfio_pci.c                   | 253 ++++++++++--------
> >  drivers/vfio/pci/vfio_pci_private.h           |   1 +
> >  drivers/vfio/platform/vfio_amba.c             |   8 +-
> >  drivers/vfio/platform/vfio_platform.c         |  20 +-
> >  drivers/vfio/platform/vfio_platform_common.c  |  56 ++--
> >  drivers/vfio/platform/vfio_platform_private.h |   5 +-
> >  drivers/vfio/vfio.c                           | 210 +++++----------
> >  include/linux/vfio.h                          |  37 ++-
> >  13 files changed, 417 insertions(+), 407 deletions(-)
>  
> 
> Applied to vfio next branch for v5.13.  Thanks!

Thanks! I just sent v2 of the mdev one, there was not much to revise
there, it should be good if there are no comments in the next days.

I have to polish the 'create fails' workflow on the vfio_mdev.c
removal series then I will post it. Not sure I can make this cycle.

Jason