Skip to content

Commit

Permalink
vduse: Support querying information of IOVA regions
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
YongjiXie authored and mstsirkin committed Aug 11, 2022
1 parent 79a463b commit ad14635
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 0 deletions.
39 changes: 39 additions & 0 deletions drivers/vdpa/vdpa_user/vduse_dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
24 changes: 24 additions & 0 deletions include/uapi/linux/vduse.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

/**
Expand Down

0 comments on commit ad14635

Please sign in to comment.