Commit 93165757 authored by Jason Gunthorpe's avatar Jason Gunthorpe Committed by Alex Williamson
Browse files

vfio/gvt: Convert to get_region_info_caps



Remove the duplicate code and change info to a pointer.

Reviewed-by: default avatarKevin Tian <kevin.tian@intel.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/17-v2-2a9e24d62f1b+e10a-vfio_get_region_info_op_jgg@nvidia.com


Signed-off-by: default avatarAlex Williamson <alex@shazbot.org>
parent 45f9fa18
Loading
Loading
Loading
Loading
+42 −71
Original line number Diff line number Diff line
@@ -1141,56 +1141,46 @@ static int intel_vgpu_set_irqs(struct intel_vgpu *vgpu, u32 flags,
}

static int intel_vgpu_ioctl_get_region_info(struct vfio_device *vfio_dev,
					    struct vfio_region_info __user *arg)
					    struct vfio_region_info *info,
					    struct vfio_info_cap *caps)
{
	struct vfio_info_cap caps = { .buf = NULL, .size = 0 };
	struct vfio_region_info_cap_sparse_mmap *sparse = NULL;
	struct intel_vgpu *vgpu = vfio_dev_to_vgpu(vfio_dev);
	struct vfio_region_info info;
	unsigned long minsz;
	int nr_areas = 1;
	int cap_type_id;
	unsigned int i;
	int ret;

	minsz = offsetofend(struct vfio_region_info, offset);

	if (copy_from_user(&info, arg, minsz))
		return -EFAULT;

	if (info.argsz < minsz)
		return -EINVAL;

	switch (info.index) {
	switch (info->index) {
	case VFIO_PCI_CONFIG_REGION_INDEX:
		info.offset = VFIO_PCI_INDEX_TO_OFFSET(info.index);
		info.size = vgpu->gvt->device_info.cfg_space_size;
		info.flags = VFIO_REGION_INFO_FLAG_READ |
		info->offset = VFIO_PCI_INDEX_TO_OFFSET(info->index);
		info->size = vgpu->gvt->device_info.cfg_space_size;
		info->flags = VFIO_REGION_INFO_FLAG_READ |
			      VFIO_REGION_INFO_FLAG_WRITE;
		break;
	case VFIO_PCI_BAR0_REGION_INDEX:
		info.offset = VFIO_PCI_INDEX_TO_OFFSET(info.index);
		info.size = vgpu->cfg_space.bar[info.index].size;
		if (!info.size) {
			info.flags = 0;
		info->offset = VFIO_PCI_INDEX_TO_OFFSET(info->index);
		info->size = vgpu->cfg_space.bar[info->index].size;
		if (!info->size) {
			info->flags = 0;
			break;
		}

		info.flags = VFIO_REGION_INFO_FLAG_READ |
		info->flags = VFIO_REGION_INFO_FLAG_READ |
			      VFIO_REGION_INFO_FLAG_WRITE;
		break;
	case VFIO_PCI_BAR1_REGION_INDEX:
		info.offset = VFIO_PCI_INDEX_TO_OFFSET(info.index);
		info.size = 0;
		info.flags = 0;
		info->offset = VFIO_PCI_INDEX_TO_OFFSET(info->index);
		info->size = 0;
		info->flags = 0;
		break;
	case VFIO_PCI_BAR2_REGION_INDEX:
		info.offset = VFIO_PCI_INDEX_TO_OFFSET(info.index);
		info.flags = VFIO_REGION_INFO_FLAG_CAPS |
		info->offset = VFIO_PCI_INDEX_TO_OFFSET(info->index);
		info->flags = VFIO_REGION_INFO_FLAG_CAPS |
			      VFIO_REGION_INFO_FLAG_MMAP |
			      VFIO_REGION_INFO_FLAG_READ |
			      VFIO_REGION_INFO_FLAG_WRITE;
		info.size = gvt_aperture_sz(vgpu->gvt);
		info->size = gvt_aperture_sz(vgpu->gvt);

		sparse = kzalloc(struct_size(sparse, areas, nr_areas),
				 GFP_KERNEL);
@@ -1207,20 +1197,20 @@ static int intel_vgpu_ioctl_get_region_info(struct vfio_device *vfio_dev,
		break;

	case VFIO_PCI_BAR3_REGION_INDEX ... VFIO_PCI_BAR5_REGION_INDEX:
		info.offset = VFIO_PCI_INDEX_TO_OFFSET(info.index);
		info.size = 0;
		info.flags = 0;
		info->offset = VFIO_PCI_INDEX_TO_OFFSET(info->index);
		info->size = 0;
		info->flags = 0;

		gvt_dbg_core("get region info bar:%d\n", info.index);
		gvt_dbg_core("get region info bar:%d\n", info->index);
		break;

	case VFIO_PCI_ROM_REGION_INDEX:
	case VFIO_PCI_VGA_REGION_INDEX:
		info.offset = VFIO_PCI_INDEX_TO_OFFSET(info.index);
		info.size = 0;
		info.flags = 0;
		info->offset = VFIO_PCI_INDEX_TO_OFFSET(info->index);
		info->size = 0;
		info->flags = 0;

		gvt_dbg_core("get region info index:%d\n", info.index);
		gvt_dbg_core("get region info index:%d\n", info->index);
		break;
	default: {
		struct vfio_region_info_cap_type cap_type = {
@@ -1228,32 +1218,32 @@ static int intel_vgpu_ioctl_get_region_info(struct vfio_device *vfio_dev,
			.header.version = 1
		};

		if (info.index >= VFIO_PCI_NUM_REGIONS + vgpu->num_regions)
		if (info->index >= VFIO_PCI_NUM_REGIONS + vgpu->num_regions)
			return -EINVAL;
		info.index = array_index_nospec(
			info.index, VFIO_PCI_NUM_REGIONS + vgpu->num_regions);
		info->index = array_index_nospec(
			info->index, VFIO_PCI_NUM_REGIONS + vgpu->num_regions);

		i = info.index - VFIO_PCI_NUM_REGIONS;
		i = info->index - VFIO_PCI_NUM_REGIONS;

		info.offset = VFIO_PCI_INDEX_TO_OFFSET(info.index);
		info.size = vgpu->region[i].size;
		info.flags = vgpu->region[i].flags;
		info->offset = VFIO_PCI_INDEX_TO_OFFSET(info->index);
		info->size = vgpu->region[i].size;
		info->flags = vgpu->region[i].flags;

		cap_type.type = vgpu->region[i].type;
		cap_type.subtype = vgpu->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;
	}
	}

	if ((info.flags & VFIO_REGION_INFO_FLAG_CAPS) && sparse) {
	if ((info->flags & VFIO_REGION_INFO_FLAG_CAPS) && sparse) {
		switch (cap_type_id) {
		case VFIO_REGION_INFO_CAP_SPARSE_MMAP:
			ret = vfio_info_add_capability(
				&caps, &sparse->header,
				caps, &sparse->header,
				struct_size(sparse, areas, sparse->nr_areas));
			if (ret) {
				kfree(sparse);
@@ -1266,27 +1256,8 @@ static int intel_vgpu_ioctl_get_region_info(struct vfio_device *vfio_dev,
		}
	}

	if (caps.size) {
		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);
	kfree(sparse);
				return -EFAULT;
			}
			info.cap_offset = sizeof(info);
		}

		kfree(caps.buf);
	}

	kfree(sparse);
	return copy_to_user(arg, &info, minsz) ? -EFAULT : 0;
	return 0;
}

static long intel_vgpu_ioctl(struct vfio_device *vfio_dev, unsigned int cmd,
@@ -1473,7 +1444,7 @@ static const struct vfio_device_ops intel_vgpu_dev_ops = {
	.write		= intel_vgpu_write,
	.mmap		= intel_vgpu_mmap,
	.ioctl		= intel_vgpu_ioctl,
	.get_region_info = intel_vgpu_ioctl_get_region_info,
	.get_region_info_caps = intel_vgpu_ioctl_get_region_info,
	.dma_unmap	= intel_vgpu_dma_unmap,
	.bind_iommufd	= vfio_iommufd_emulated_bind,
	.unbind_iommufd = vfio_iommufd_emulated_unbind,