Commit ad146355 authored by Xie Yongji's avatar Xie Yongji Committed by Michael S. Tsirkin
Browse files

vduse: Support querying information of IOVA regions



This introduces a new ioctl: VDUSE_IOTLB_GET_INFO to
support querying some information of IOVA regions.

Now it can be used to query whether the IOVA region
supports userspace memory registration.

Signed-off-by: default avatarXie Yongji <xieyongji@bytedance.com>
Message-Id: <20220803045523.23851-6-xieyongji@bytedance.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Acked-by: default avatarJason Wang <jasowang@redhat.com>
parent 79a463be
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
@@ -1228,6 +1228,45 @@ static long vduse_dev_ioctl(struct file *file, unsigned int cmd,
					   umem.size);
		break;
	}
	case VDUSE_IOTLB_GET_INFO: {
		struct vduse_iova_info info;
		struct vhost_iotlb_map *map;
		struct vduse_iova_domain *domain = dev->domain;

		ret = -EFAULT;
		if (copy_from_user(&info, argp, sizeof(info)))
			break;

		ret = -EINVAL;
		if (info.start > info.last)
			break;

		if (!is_mem_zero((const char *)info.reserved,
				 sizeof(info.reserved)))
			break;

		spin_lock(&domain->iotlb_lock);
		map = vhost_iotlb_itree_first(domain->iotlb,
					      info.start, info.last);
		if (map) {
			info.start = map->start;
			info.last = map->last;
			info.capability = 0;
			if (domain->bounce_map && map->start == 0 &&
			    map->last == domain->bounce_size - 1)
				info.capability |= VDUSE_IOVA_CAP_UMEM;
		}
		spin_unlock(&domain->iotlb_lock);
		if (!map)
			break;

		ret = -EFAULT;
		if (copy_to_user(argp, &info, sizeof(info)))
			break;

		ret = 0;
		break;
	}
	default:
		ret = -ENOIOCTLCMD;
		break;
+24 −0
Original line number Diff line number Diff line
@@ -233,6 +233,30 @@ struct vduse_iova_umem {
/* De-register the userspace memory. Caller should set iova and size field. */
#define VDUSE_IOTLB_DEREG_UMEM	_IOW(VDUSE_BASE, 0x19, struct vduse_iova_umem)

/**
 * struct vduse_iova_info - information of one IOVA region
 * @start: start of the IOVA region
 * @last: last of the IOVA region
 * @capability: capability of the IOVA regsion
 * @reserved: for future use, needs to be initialized to zero
 *
 * Structure used by VDUSE_IOTLB_GET_INFO ioctl to get information of
 * one IOVA region.
 */
struct vduse_iova_info {
	__u64 start;
	__u64 last;
#define VDUSE_IOVA_CAP_UMEM (1 << 0)
	__u64 capability;
	__u64 reserved[3];
};

/*
 * Find the first IOVA region that overlaps with the range [start, last]
 * and return some information on it. Caller should set start and last fields.
 */
#define VDUSE_IOTLB_GET_INFO	_IOWR(VDUSE_BASE, 0x1a, struct vduse_iova_info)

/* The control messages definition for read(2)/write(2) on /dev/vduse/$NAME */

/**