path: root/Documentation/driver-api
diff options
authorJason Gunthorpe <>2021-03-30 09:53:08 -0600
committerAlex Williamson <>2021-04-06 11:55:11 -0600
commit6df62c5b05f4ad6876815ea8b8775905a090224a (patch)
tree5573ffa1f6aa10a74d807b9bb161fc188885af41 /Documentation/driver-api
parent66873b5fa738ca02b5c075ca4a410b13d88e6e9a (diff)
vfio: Make vfio_device_ops pass a 'struct vfio_device *' instead of 'void *'
This is the standard kernel pattern, the ops associated with a struct get the struct pointer in for typesafety. The expected design is to use container_of to cleanly go from the subsystem level type to the driver level type without having any type erasure in a void *. Reviewed-by: Dan Williams <> Reviewed-by: Christoph Hellwig <> Reviewed-by: Cornelia Huck <> Signed-off-by: Jason Gunthorpe <> Message-Id: <> Signed-off-by: Alex Williamson <>
Diffstat (limited to 'Documentation/driver-api')
1 files changed, 10 insertions, 8 deletions
diff --git a/Documentation/driver-api/vfio.rst b/Documentation/driver-api/vfio.rst
index d3a02300913a..3337f337293a 100644
--- a/Documentation/driver-api/vfio.rst
+++ b/Documentation/driver-api/vfio.rst
@@ -269,20 +269,22 @@ ready before calling it. The driver provides an ops structure for callbacks
similar to a file operations structure::
struct vfio_device_ops {
- int (*open)(void *device_data);
- void (*release)(void *device_data);
- ssize_t (*read)(void *device_data, char __user *buf,
+ int (*open)(struct vfio_device *vdev);
+ void (*release)(struct vfio_device *vdev);
+ ssize_t (*read)(struct vfio_device *vdev, char __user *buf,
size_t count, loff_t *ppos);
- ssize_t (*write)(void *device_data, const char __user *buf,
+ ssize_t (*write)(struct vfio_device *vdev,
+ const char __user *buf,
size_t size, loff_t *ppos);
- long (*ioctl)(void *device_data, unsigned int cmd,
+ long (*ioctl)(struct vfio_device *vdev, unsigned int cmd,
unsigned long arg);
- int (*mmap)(void *device_data, struct vm_area_struct *vma);
+ int (*mmap)(struct vfio_device *vdev,
+ struct vm_area_struct *vma);
-Each function is passed the device_data that was originally registered
+Each function is passed the vdev that was originally registered
in the vfio_register_group_dev() call above. This allows the bus driver
-an easy place to store its opaque, private data. The open/release
+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