Message ID | 20230203083345.711443-3-yi.l.liu@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Update VFIO doc | expand |
Hi Yi, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on awilliam-vfio/for-linus] [also build test WARNING on linus/master v6.2-rc6 next-20230203] [cannot apply to awilliam-vfio/next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Yi-Liu/vfio-Update-the-kdoc-for-vfio_device_ops/20230203-163612 base: https://github.com/awilliam/linux-vfio.git for-linus patch link: https://lore.kernel.org/r/20230203083345.711443-3-yi.l.liu%40intel.com patch subject: [PATCH v2 2/2] docs: vfio: Update vfio.rst per latest interfaces reproduce: # https://github.com/intel-lab-lkp/linux/commit/8db2c0d3414387502a6c743d6fa383cec960e3ba git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Yi-Liu/vfio-Update-the-kdoc-for-vfio_device_ops/20230203-163612 git checkout 8db2c0d3414387502a6c743d6fa383cec960e3ba make menuconfig # enable CONFIG_COMPILE_TEST, CONFIG_WARN_MISSING_DOCUMENTS, CONFIG_WARN_ABI_ERRORS make htmldocs If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> Documentation/driver-api/vfio.rst:264: WARNING: Inline emphasis start-string without end-string. >> Documentation/driver-api/vfio.rst:296: WARNING: Literal block ends without a blank line; unexpected unindent. >> Documentation/driver-api/vfio.rst:305: WARNING: Unexpected indentation. >> Documentation/driver-api/vfio.rst:306: WARNING: Block quote ends without a blank line; unexpected unindent. vim +264 Documentation/driver-api/vfio.rst 263 > 264 vfio_alloc_device(dev_struct, member, dev, ops); 265 void vfio_put_device(struct vfio_device *device); 266 267 vfio_register_group_dev() indicates to the core to begin tracking the 268 iommu_group of the specified dev and register the dev as owned by a VFIO bus 269 driver. Once vfio_register_group_dev() returns it is possible for userspace to 270 start accessing the driver, thus the driver should ensure it is completely 271 ready before calling it. The driver provides an ops structure for callbacks 272 similar to a file operations structure:: 273 274 struct vfio_device_ops { 275 char *name; 276 int (*init)(struct vfio_device *vdev); 277 void (*release)(struct vfio_device *vdev); 278 int (*bind_iommufd)(struct vfio_device *vdev, 279 struct iommufd_ctx *ictx, u32 *out_device_id); 280 void (*unbind_iommufd)(struct vfio_device *vdev); 281 int (*attach_ioas)(struct vfio_device *vdev, u32 *pt_id); 282 int (*open_device)(struct vfio_device *vdev); 283 void (*close_device)(struct vfio_device *vdev); 284 ssize_t (*read)(struct vfio_device *vdev, char __user *buf, 285 size_t count, loff_t *ppos); 286 ssize_t (*write)(struct vfio_device *vdev, const char __user *buf, 287 size_t count, loff_t *size); 288 long (*ioctl)(struct vfio_device *vdev, unsigned int cmd, 289 unsigned long arg); 290 int (*mmap)(struct vfio_device *vdev, struct vm_area_struct *vma); 291 void (*request)(struct vfio_device *vdev, unsigned int count); 292 int (*match)(struct vfio_device *vdev, char *buf); 293 void (*dma_unmap)(struct vfio_device *vdev, u64 iova, u64 length); 294 int (*device_feature)(struct vfio_device *device, u32 flags, 295 void __user *arg, size_t argsz); > 296 }; 297 298 Each function is passed the vdev that was originally registered 299 in the vfio_register_group_dev() or vfio_register_emulated_iommu_dev() 300 call above. This allows the bus driver to obtain its private data using 301 container_of(). 302 - The init/release callbacks are issued when vfio_device is initialized 303 - and released. 304 - The open/close_device callbacks are issued when a new file descriptor is > 305 created for a device (via VFIO_GROUP_GET_DEVICE_FD). > 306 - The ioctl interface provides a direct pass through for VFIO_DEVICE_* ioctls. 307 - The [un]bind_iommufd callbacks are issued when the device is bound to 308 - and unbound from iommufd. 309 - The attach_ioas callback is issued when the device is attached to an IOAS 310 managed by the bound iommufd. The attached IOAS is automatically detached 311 when the device is unbound from the iommufd. 312 - The read/write/mmap interfaces implement the device region access defined by 313 the device's own VFIO_DEVICE_GET_REGION_INFO ioctl. 314 - The request callback is issued when device is going to be unregistered. 315 - The dma_unmap callback is issued when a range of iova's are unmapped in 316 the container or IOAS attached by the device. Drivers which care about 317 DMA unmap can implement this callback and must tolerate receiving unmap 318 notifications before the device is opened. 319
> From: lkp <lkp@intel.com> > Sent: Saturday, February 4, 2023 4:56 PM > > Hi Yi, > > Thank you for the patch! Perhaps something to improve: > > [auto build test WARNING on awilliam-vfio/for-linus] > [also build test WARNING on linus/master v6.2-rc6 next-20230203] > [cannot apply to awilliam-vfio/next] > [If your patch is applied to the wrong git tree, kindly drop us a note. > And when submitting patch, we suggest to use '--base' as documented in > https://git-scm.com/docs/git-format-patch#_base_tree_information] > > url: https://github.com/intel-lab-lkp/linux/commits/Yi-Liu/vfio-Update- > the-kdoc-for-vfio_device_ops/20230203-163612 > base: https://github.com/awilliam/linux-vfio.git for-linus > patch link: https://lore.kernel.org/r/20230203083345.711443-3- > yi.l.liu%40intel.com > patch subject: [PATCH v2 2/2] docs: vfio: Update vfio.rst per latest > interfaces > reproduce: > # https://github.com/intel-lab- > lkp/linux/commit/8db2c0d3414387502a6c743d6fa383cec960e3ba > git remote add linux-review https://github.com/intel-lab-lkp/linux > git fetch --no-tags linux-review Yi-Liu/vfio-Update-the-kdoc-for- > vfio_device_ops/20230203-163612 > git checkout 8db2c0d3414387502a6c743d6fa383cec960e3ba > make menuconfig > # enable CONFIG_COMPILE_TEST, > CONFIG_WARN_MISSING_DOCUMENTS, CONFIG_WARN_ABI_ERRORS > make htmldocs > > If you fix the issue, kindly add following tag where applicable > | Reported-by: kernel test robot <lkp@intel.com> > > All warnings (new ones prefixed by >>): > > >> Documentation/driver-api/vfio.rst:264: WARNING: Inline emphasis start- > string without end-string. > >> Documentation/driver-api/vfio.rst:296: WARNING: Literal block ends > without a blank line; unexpected unindent. > >> Documentation/driver-api/vfio.rst:305: WARNING: Unexpected > indentation. > >> Documentation/driver-api/vfio.rst:306: WARNING: Block quote ends > without a blank line; unexpected unindent. > Hi Alex, An updated version to address comments in this mail. From 6d9c6f9b3d10da2923b28d8cfbf5fdd39e5fd8aa Mon Sep 17 00:00:00 2001 From: Yi Liu <yi.l.liu@intel.com> Date: Tue, 31 Jan 2023 06:16:50 -0800 Subject: [PATCH] docs: vfio: Update vfio.rst per latest interfaces this imports the latest vfio_device_ops definition to vfio.rst. Signed-off-by: Yi Liu <yi.l.liu@intel.com> --- 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). + + - 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. + - 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. PPC64 sPAPR implementation note -------------------------------
On Sat, 4 Feb 2023 13:09:25 +0000 "Liu, Yi L" <yi.l.liu@intel.com> wrote: > > From: lkp <lkp@intel.com> > > Sent: Saturday, February 4, 2023 4:56 PM > > > > Hi Yi, > > > > Thank you for the patch! Perhaps something to improve: > > > > [auto build test WARNING on awilliam-vfio/for-linus] > > [also build test WARNING on linus/master v6.2-rc6 next-20230203] > > [cannot apply to awilliam-vfio/next] > > [If your patch is applied to the wrong git tree, kindly drop us a note. > > And when submitting patch, we suggest to use '--base' as documented in > > https://git-scm.com/docs/git-format-patch#_base_tree_information] > > > > url: https://github.com/intel-lab-lkp/linux/commits/Yi-Liu/vfio-Update- > > the-kdoc-for-vfio_device_ops/20230203-163612 > > base: https://github.com/awilliam/linux-vfio.git for-linus > > patch link: https://lore.kernel.org/r/20230203083345.711443-3- > > yi.l.liu%40intel.com > > patch subject: [PATCH v2 2/2] docs: vfio: Update vfio.rst per latest > > interfaces > > reproduce: > > # https://github.com/intel-lab- > > lkp/linux/commit/8db2c0d3414387502a6c743d6fa383cec960e3ba > > git remote add linux-review https://github.com/intel-lab-lkp/linux > > git fetch --no-tags linux-review Yi-Liu/vfio-Update-the-kdoc-for- > > vfio_device_ops/20230203-163612 > > git checkout 8db2c0d3414387502a6c743d6fa383cec960e3ba > > make menuconfig > > # enable CONFIG_COMPILE_TEST, > > CONFIG_WARN_MISSING_DOCUMENTS, CONFIG_WARN_ABI_ERRORS > > make htmldocs > > > > If you fix the issue, kindly add following tag where applicable > > | Reported-by: kernel test robot <lkp@intel.com> > > > > All warnings (new ones prefixed by >>): > > > > >> Documentation/driver-api/vfio.rst:264: WARNING: Inline emphasis start- > > string without end-string. > > >> Documentation/driver-api/vfio.rst:296: WARNING: Literal block ends > > without a blank line; unexpected unindent. > > >> Documentation/driver-api/vfio.rst:305: WARNING: Unexpected > > indentation. > > >> Documentation/driver-api/vfio.rst:306: WARNING: Block quote ends > > without a blank line; unexpected unindent. > > > > Hi Alex, > > An updated version to address comments in this mail. Please send a v3 series. Thanks, Alex > From 6d9c6f9b3d10da2923b28d8cfbf5fdd39e5fd8aa Mon Sep 17 00:00:00 2001 > From: Yi Liu <yi.l.liu@intel.com> > Date: Tue, 31 Jan 2023 06:16:50 -0800 > Subject: [PATCH] docs: vfio: Update vfio.rst per latest interfaces > > this imports the latest vfio_device_ops definition to vfio.rst. > > Signed-off-by: Yi Liu <yi.l.liu@intel.com> > --- > 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). > + > + - 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. > > + - 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. > > PPC64 sPAPR implementation note > -------------------------------
> From: Alex Williamson <alex.williamson@redhat.com> > Sent: Saturday, February 4, 2023 10:27 PM > > On Sat, 4 Feb 2023 13:09:25 +0000 > "Liu, Yi L" <yi.l.liu@intel.com> wrote: > > > > From: lkp <lkp@intel.com> > > > Sent: Saturday, February 4, 2023 4:56 PM > > > > > > Hi Yi, > > > > > > Thank you for the patch! Perhaps something to improve: > > > > > > [auto build test WARNING on awilliam-vfio/for-linus] > > > [also build test WARNING on linus/master v6.2-rc6 next-20230203] > > > [cannot apply to awilliam-vfio/next] > > > [If your patch is applied to the wrong git tree, kindly drop us a note. > > > And when submitting patch, we suggest to use '--base' as documented > in > > > https://git-scm.com/docs/git-format-patch#_base_tree_information] > > > > > > url: https://github.com/intel-lab-lkp/linux/commits/Yi-Liu/vfio- > Update- > > > the-kdoc-for-vfio_device_ops/20230203-163612 > > > base: https://github.com/awilliam/linux-vfio.git for-linus > > > patch link: https://lore.kernel.org/r/20230203083345.711443-3- > > > yi.l.liu%40intel.com > > > patch subject: [PATCH v2 2/2] docs: vfio: Update vfio.rst per latest > > > interfaces > > > reproduce: > > > # https://github.com/intel-lab- > > > lkp/linux/commit/8db2c0d3414387502a6c743d6fa383cec960e3ba > > > git remote add linux-review https://github.com/intel-lab-lkp/linux > > > git fetch --no-tags linux-review Yi-Liu/vfio-Update-the-kdoc-for- > > > vfio_device_ops/20230203-163612 > > > git checkout 8db2c0d3414387502a6c743d6fa383cec960e3ba > > > make menuconfig > > > # enable CONFIG_COMPILE_TEST, > > > CONFIG_WARN_MISSING_DOCUMENTS, CONFIG_WARN_ABI_ERRORS > > > make htmldocs > > > > > > If you fix the issue, kindly add following tag where applicable > > > | Reported-by: kernel test robot <lkp@intel.com> > > > > > > All warnings (new ones prefixed by >>): > > > > > > >> Documentation/driver-api/vfio.rst:264: WARNING: Inline emphasis > start- > > > string without end-string. > > > >> Documentation/driver-api/vfio.rst:296: WARNING: Literal block ends > > > without a blank line; unexpected unindent. > > > >> Documentation/driver-api/vfio.rst:305: WARNING: Unexpected > > > indentation. > > > >> Documentation/driver-api/vfio.rst:306: WARNING: Block quote ends > > > without a blank line; unexpected unindent. > > > > > > > Hi Alex, > > > > An updated version to address comments in this mail. > > Please send a v3 series. Thanks, done.
diff --git a/Documentation/driver-api/vfio.rst b/Documentation/driver-api/vfio.rst index c663b6f97825..f38ab4ae1244 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. +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,50 @@ 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 (via VFIO_GROUP_GET_DEVICE_FD). +- The ioctl interface provides a direct pass through for 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 the iommufd. +- The read/write/mmap interfaces 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. +- 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 + DMA unmap can implement this callback and must tolerate receiving unmap + notifications before the device is opened. PPC64 sPAPR implementation note -------------------------------
this imports the latest vfio_device_ops definition to vfio.rst. Signed-off-by: Yi Liu <yi.l.liu@intel.com> --- Documentation/driver-api/vfio.rst | 70 +++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 23 deletions(-)