Skip to content

Commit

Permalink
vhost: support ASID in IOTLB API
Browse files Browse the repository at this point in the history
This patches allows userspace to send ASID based IOTLB message to
vhost. This idea is to use the reserved u32 field in the existing V2
IOTLB message. Vhost device should advertise this capability via
VHOST_BACKEND_F_IOTLB_ASID backend feature.

Signed-off-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Gautam Dawar <gdawar@xilinx.com>
Message-Id: <20220330180436.24644-10-gdawar@xilinx.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
  • Loading branch information
Gautam Dawar authored and Michael S. Tsirkin committed May 31, 2022
1 parent 1cb1089 commit 91233ad
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 9 deletions.
5 changes: 4 additions & 1 deletion drivers/vhost/vdpa.c
Original file line number Diff line number Diff line change
Expand Up @@ -870,7 +870,7 @@ static int vhost_vdpa_process_iotlb_update(struct vhost_vdpa *v,
msg->perm);
}

static int vhost_vdpa_process_iotlb_msg(struct vhost_dev *dev,
static int vhost_vdpa_process_iotlb_msg(struct vhost_dev *dev, u32 asid,
struct vhost_iotlb_msg *msg)
{
struct vhost_vdpa *v = container_of(dev, struct vhost_vdpa, vdev);
Expand All @@ -879,6 +879,9 @@ static int vhost_vdpa_process_iotlb_msg(struct vhost_dev *dev,
struct vhost_iotlb *iotlb = v->iotlb;
int r = 0;

if (asid != 0)
return -EINVAL;

mutex_lock(&dev->mutex);

r = vhost_dev_check_owner(dev);
Expand Down
23 changes: 18 additions & 5 deletions drivers/vhost/vhost.c
Original file line number Diff line number Diff line change
Expand Up @@ -468,7 +468,7 @@ void vhost_dev_init(struct vhost_dev *dev,
struct vhost_virtqueue **vqs, int nvqs,
int iov_limit, int weight, int byte_weight,
bool use_worker,
int (*msg_handler)(struct vhost_dev *dev,
int (*msg_handler)(struct vhost_dev *dev, u32 asid,
struct vhost_iotlb_msg *msg))
{
struct vhost_virtqueue *vq;
Expand Down Expand Up @@ -1090,11 +1090,14 @@ static bool umem_access_ok(u64 uaddr, u64 size, int access)
return true;
}

static int vhost_process_iotlb_msg(struct vhost_dev *dev,
static int vhost_process_iotlb_msg(struct vhost_dev *dev, u32 asid,
struct vhost_iotlb_msg *msg)
{
int ret = 0;

if (asid != 0)
return -EINVAL;

mutex_lock(&dev->mutex);
vhost_dev_lock_vqs(dev);
switch (msg->type) {
Expand Down Expand Up @@ -1141,6 +1144,7 @@ ssize_t vhost_chr_write_iter(struct vhost_dev *dev,
struct vhost_iotlb_msg msg;
size_t offset;
int type, ret;
u32 asid = 0;

ret = copy_from_iter(&type, sizeof(type), from);
if (ret != sizeof(type)) {
Expand All @@ -1156,7 +1160,16 @@ ssize_t vhost_chr_write_iter(struct vhost_dev *dev,
offset = offsetof(struct vhost_msg, iotlb) - sizeof(int);
break;
case VHOST_IOTLB_MSG_V2:
offset = sizeof(__u32);
if (vhost_backend_has_feature(dev->vqs[0],
VHOST_BACKEND_F_IOTLB_ASID)) {
ret = copy_from_iter(&asid, sizeof(asid), from);
if (ret != sizeof(asid)) {
ret = -EINVAL;
goto done;
}
offset = sizeof(__u16);
} else
offset = sizeof(__u32);
break;
default:
ret = -EINVAL;
Expand All @@ -1178,9 +1191,9 @@ ssize_t vhost_chr_write_iter(struct vhost_dev *dev,
}

if (dev->msg_handler)
ret = dev->msg_handler(dev, &msg);
ret = dev->msg_handler(dev, asid, &msg);
else
ret = vhost_process_iotlb_msg(dev, &msg);
ret = vhost_process_iotlb_msg(dev, asid, &msg);
if (ret) {
ret = -EFAULT;
goto done;
Expand Down
4 changes: 2 additions & 2 deletions drivers/vhost/vhost.h
Original file line number Diff line number Diff line change
Expand Up @@ -161,15 +161,15 @@ struct vhost_dev {
int byte_weight;
u64 kcov_handle;
bool use_worker;
int (*msg_handler)(struct vhost_dev *dev,
int (*msg_handler)(struct vhost_dev *dev, u32 asid,
struct vhost_iotlb_msg *msg);
};

bool vhost_exceeds_weight(struct vhost_virtqueue *vq, int pkts, int total_len);
void vhost_dev_init(struct vhost_dev *, struct vhost_virtqueue **vqs,
int nvqs, int iov_limit, int weight, int byte_weight,
bool use_worker,
int (*msg_handler)(struct vhost_dev *dev,
int (*msg_handler)(struct vhost_dev *dev, u32 asid,
struct vhost_iotlb_msg *msg));
long vhost_dev_set_owner(struct vhost_dev *dev);
bool vhost_dev_has_owner(struct vhost_dev *dev);
Expand Down
6 changes: 5 additions & 1 deletion include/uapi/linux/vhost_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ struct vhost_msg {

struct vhost_msg_v2 {
__u32 type;
__u32 reserved;
__u32 asid;
union {
struct vhost_iotlb_msg iotlb;
__u8 padding[64];
Expand Down Expand Up @@ -157,5 +157,9 @@ struct vhost_vdpa_iova_range {
#define VHOST_BACKEND_F_IOTLB_MSG_V2 0x1
/* IOTLB can accept batching hints */
#define VHOST_BACKEND_F_IOTLB_BATCH 0x2
/* IOTLB can accept address space identifier through V2 type of IOTLB
* message
*/
#define VHOST_BACKEND_F_IOTLB_ASID 0x3

#endif

0 comments on commit 91233ad

Please sign in to comment.