RE: [PATCH v3 2/2] docs: vfio: Update vfio.rst per latest interfaces

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> From: Alex Williamson <alex.williamson@xxxxxxxxxx>
> Sent: Thursday, February 9, 2023 7:22 AM
> 
> On Sat,  4 Feb 2023 06:42:08 -0800
> Yi Liu <yi.l.liu@xxxxxxxxx> wrote:
> 
> > this imports the latest vfio_device_ops definition to vfio.rst.
> >
> > Signed-off-by: Yi Liu <yi.l.liu@xxxxxxxxx>
> > ---
> >  Documentation/driver-api/vfio.rst | 79 ++++++++++++++++++++++-------
> --
> >  1 file changed, 57 insertions(+), 22 deletions(-)
> >
> > diff --git a/Documentation/driver-api/vfio.rst b/Documentation/driver-
> api/vfio.rst
> > index c663b6f97825..0bfa7261f991 100644
> > --- a/Documentation/driver-api/vfio.rst
> > +++ b/Documentation/driver-api/vfio.rst
> > @@ -249,19 +249,21 @@ 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_register_group_dev() and
> > -vfio_unregister_group_dev() respectively::
> > +Following interfaces are called when devices are bound to and
> > +unbound from the driver::
> >
> > -	void vfio_init_group_dev(struct vfio_device *device,
> > -				struct device *dev,
> > -				const struct vfio_device_ops *ops);
> > -	void vfio_uninit_group_dev(struct vfio_device *device);
> >  	int vfio_register_group_dev(struct vfio_device *device);
> > +	int vfio_register_emulated_iommu_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
> > -and call vfio_uninit_group_dev() after completing the un-registration.
> > +The driver should embed the vfio_device in its own structure and use
> > +vfio_alloc_device() to allocate the structure, and can register
> > +@init/@release callbacks to manage any private state wrapping the
> > +vfio_device::
> > +
> > +	vfio_alloc_device(dev_struct, member, dev, ops);
> > +	void vfio_put_device(struct vfio_device *device);
> > +
> >  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
> > @@ -270,28 +272,61 @@ ready before calling it. The driver provides an
> ops structure for callbacks
> >  similar to a file operations structure::
> >
> >  	struct vfio_device_ops {
> > -		int	(*open)(struct vfio_device *vdev);
> > +		char	*name;
> > +		int	(*init)(struct vfio_device *vdev);
> >  		void	(*release)(struct vfio_device *vdev);
> > +		int	(*bind_iommufd)(struct vfio_device *vdev,
> > +					struct iommufd_ctx *ictx, u32
> *out_device_id);
> > +		void	(*unbind_iommufd)(struct vfio_device *vdev);
> > +		int	(*attach_ioas)(struct vfio_device *vdev, u32 *pt_id);
> > +		int	(*open_device)(struct vfio_device *vdev);
> > +		void	(*close_device)(struct vfio_device *vdev);
> >  		ssize_t	(*read)(struct vfio_device *vdev, char __user *buf,
> >  				size_t count, loff_t *ppos);
> > -		ssize_t	(*write)(struct vfio_device *vdev,
> > -				 const char __user *buf,
> > -				 size_t size, loff_t *ppos);
> > +		ssize_t	(*write)(struct vfio_device *vdev, const char __user
> *buf,
> > +			 size_t count, loff_t *size);
> >  		long	(*ioctl)(struct vfio_device *vdev, unsigned int cmd,
> >  				 unsigned long arg);
> > -		int	(*mmap)(struct vfio_device *vdev,
> > -				struct vm_area_struct *vma);
> > +		int	(*mmap)(struct vfio_device *vdev, struct
> vm_area_struct *vma);
> > +		void	(*request)(struct vfio_device *vdev, unsigned int
> count);
> > +		int	(*match)(struct vfio_device *vdev, char *buf);
> > +		void	(*dma_unmap)(struct vfio_device *vdev, u64 iova,
> u64 length);
> > +		int	(*device_feature)(struct vfio_device *device, u32
> flags,
> > +					  void __user *arg, size_t argsz);
> >  	};
> >
> >  Each function is passed the vdev that was originally registered
> > -in the vfio_register_group_dev() call above.  This allows the bus driver
> > -to obtain its private data using container_of().  The open/release
> > -callbacks are issued when a new file descriptor is created for a
> > -device (via VFIO_GROUP_GET_DEVICE_FD).  The ioctl interface provides
> > -a direct pass through for VFIO_DEVICE_* ioctls.  The read/write/mmap
> > -interfaces implement the device region access defined by the device's
> > -own VFIO_DEVICE_GET_REGION_INFO ioctl.
> > +in the vfio_register_group_dev() or
> vfio_register_emulated_iommu_dev()
> > +call above. This allows the bus driver to obtain its private data using
> > +container_of().
> > +
> > +::
> > +
> > +	- The init/release callbacks are issued when vfio_device is initialized
> > +	  and released.
> > +
> > +	- The open/close_device callbacks are issued when a new file
> descriptor
> > +	  is created for a device (e.g. via VFIO_GROUP_GET_DEVICE_FD).
> 
> Each call to VFIO_GROUP_GET_DEVICE_FD gives a "new" file descriptor,
> does this intend to say something along the lines of:
> 
> 	The open/close device callbacks are issued when the first
> 	instance of a file descriptor for the device is created (eg.
> 	via VFIO_GROUP_GET_DEVICE_FD) for a user session.
> 
> > +
> > +	- The ioctl callback provides a direct pass through for some
> VFIO_DEVICE_*
> > +	  ioctls.
> > +
> > +	- The [un]bind_iommufd callbacks are issued when the device is
> bound to
> > +	  and unbound from iommufd.
> > +
> > +	- The attach_ioas callback is issued when the device is attached to an
> > +	  IOAS managed by the bound iommufd. The attached IOAS is
> automatically
> > +	  detached when the device is unbound from iommufd.
> > +
> > +	- The read/write/mmap callbacks implement the device region
> access defined
> > +	  by the device's own VFIO_DEVICE_GET_REGION_INFO ioctl.
> > +
> > +	- The request callback is issued when device is going to be
> unregistered.
> 
> Perhaps add ", such as when trying to unbind the device from the vfio
> bus driver."
> 
> >
> > +	- The dma_unmap callback is issued when a range of iova's are
> unmapped
> > +	  in the container or IOAS attached by the device. Drivers which care
> > +	  about iova unmap can implement this callback and must tolerate
> receiving
> > +	  unmap notifications before the device is opened.
> 
> Rather than the last sentence, "Drivers which make use of the vfio page
> pinning interface must implement this callback in order to unpin pages
> within the dma_unmap range.  Drivers must tolerate this callback even
> before calls to open_device()."  Thanks,

Updated a v4.

Regards,
Yi Liu




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux