mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 08:02:27 +02:00
vfio/ccw: Convert to get_region_info_caps
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>
This commit is contained in:
parent
93165757c0
commit
973af0c40e
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user