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: Xie Yongji <xieyongji@bytedance.com> Message-Id: <20220803045523.23851-6-xieyongji@bytedance.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Acked-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
79a463be9e
commit
ad146355bf
2 changed files with 63 additions and 0 deletions
|
@ -1228,6 +1228,45 @@ static long vduse_dev_ioctl(struct file *file, unsigned int cmd,
|
||||||
umem.size);
|
umem.size);
|
||||||
break;
|
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:
|
default:
|
||||||
ret = -ENOIOCTLCMD;
|
ret = -ENOIOCTLCMD;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -233,6 +233,30 @@ struct vduse_iova_umem {
|
||||||
/* De-register the userspace memory. Caller should set iova and size field. */
|
/* 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)
|
#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 */
|
/* The control messages definition for read(2)/write(2) on /dev/vduse/$NAME */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue