]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
vfio/ccw: Convert to get_region_info_caps
authorJason Gunthorpe <jgg@nvidia.com>
Fri, 7 Nov 2025 17:41:34 +0000 (13:41 -0400)
committerAlex Williamson <alex@shazbot.org>
Wed, 12 Nov 2025 22:05:03 +0000 (15:05 -0700)
Remove the duplicate code and flatten the call chain.

Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Eric Farman <farman@linux.ibm.com>
Link: https://lore.kernel.org/r/18-v2-2a9e24d62f1b+e10a-vfio_get_region_info_op_jgg@nvidia.com
Signed-off-by: Alex Williamson <alex@shazbot.org>
drivers/s390/cio/vfio_ccw_ops.c

index 6d46e0bc76df150b021fdcce9c380edd1075355d..a596f6013019cb8ab8d3c599b242807efe10c54d 100644 (file)
@@ -313,10 +313,12 @@ static int vfio_ccw_mdev_get_device_info(struct vfio_ccw_private *private,
        return 0;
 }
 
-static int vfio_ccw_mdev_get_region_info(struct vfio_ccw_private *private,
-                                        struct vfio_region_info *info,
-                                        unsigned long arg)
+static int vfio_ccw_mdev_ioctl_get_region_info(struct vfio_device *vdev,
+                                              struct vfio_region_info *info,
+                                              struct vfio_info_cap *caps)
 {
+       struct vfio_ccw_private *private =
+               container_of(vdev, struct vfio_ccw_private, vdev);
        int i;
 
        switch (info->index) {
@@ -328,7 +330,6 @@ static int vfio_ccw_mdev_get_region_info(struct vfio_ccw_private *private,
                return 0;
        default: /* all other regions are handled via capability chain */
        {
-               struct vfio_info_cap caps = { .buf = NULL, .size = 0 };
                struct vfio_region_info_cap_type cap_type = {
                        .header.id = VFIO_REGION_INFO_CAP_TYPE,
                        .header.version = 1 };
@@ -351,27 +352,10 @@ static int vfio_ccw_mdev_get_region_info(struct vfio_ccw_private *private,
                cap_type.type = private->region[i].type;
                cap_type.subtype = private->region[i].subtype;
 
-               ret = vfio_info_add_capability(&caps, &cap_type.header,
+               ret = vfio_info_add_capability(caps, &cap_type.header,
                                               sizeof(cap_type));
                if (ret)
                        return ret;
-
-               info->flags |= VFIO_REGION_INFO_FLAG_CAPS;
-               if (info->argsz < sizeof(*info) + caps.size) {
-                       info->argsz = sizeof(*info) + caps.size;
-                       info->cap_offset = 0;
-               } else {
-                       vfio_info_cap_shift(&caps, sizeof(*info));
-                       if (copy_to_user((void __user *)arg + sizeof(*info),
-                                        caps.buf, caps.size)) {
-                               kfree(caps.buf);
-                               return -EFAULT;
-                       }
-                       info->cap_offset = sizeof(*info);
-               }
-
-               kfree(caps.buf);
-
        }
        }
        return 0;
@@ -504,31 +488,6 @@ void vfio_ccw_unregister_dev_regions(struct vfio_ccw_private *private)
        private->region = NULL;
 }
 
-static int
-vfio_ccw_mdev_ioctl_get_region_info(struct vfio_device *vdev,
-                                   struct vfio_region_info __user *arg)
-{
-       struct vfio_ccw_private *private =
-               container_of(vdev, struct vfio_ccw_private, vdev);
-       struct vfio_region_info info;
-       unsigned long minsz;
-       int ret;
-
-       minsz = offsetofend(struct vfio_region_info, offset);
-
-       if (copy_from_user(&info, arg, minsz))
-               return -EFAULT;
-
-       if (info.argsz < minsz)
-               return -EINVAL;
-
-       ret = vfio_ccw_mdev_get_region_info(private, &info, arg);
-       if (ret)
-               return ret;
-
-       return copy_to_user(arg, &info, minsz) ? -EFAULT : 0;
-}
-
 static ssize_t vfio_ccw_mdev_ioctl(struct vfio_device *vdev,
                                   unsigned int cmd,
                                   unsigned long arg)
@@ -634,7 +593,7 @@ static const struct vfio_device_ops vfio_ccw_dev_ops = {
        .read = vfio_ccw_mdev_read,
        .write = vfio_ccw_mdev_write,
        .ioctl = vfio_ccw_mdev_ioctl,
-       .get_region_info = vfio_ccw_mdev_ioctl_get_region_info,
+       .get_region_info_caps = vfio_ccw_mdev_ioctl_get_region_info,
        .request = vfio_ccw_mdev_request,
        .dma_unmap = vfio_ccw_dma_unmap,
        .bind_iommufd = vfio_iommufd_emulated_bind,