vhost: support PACKED when setting-getting vring_base
[ Upstream commit55d8122f5c
] Use the right structs for PACKED or split vqs when setting and getting the vring base. Fixes:4c8cf31885
("vhost: introduce vDPA-based backend") Signed-off-by: Shannon Nelson <shannon.nelson@amd.com> Message-Id: <20230424225031.18947-3-shannon.nelson@amd.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Acked-by: Jason Wang <jasowang@redhat.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
6c5a69c5dd
commit
b839b65456
|
@ -1633,17 +1633,25 @@ long vhost_vring_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *arg
|
||||||
r = -EFAULT;
|
r = -EFAULT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (s.num > 0xffff) {
|
if (vhost_has_feature(vq, VIRTIO_F_RING_PACKED)) {
|
||||||
r = -EINVAL;
|
vq->last_avail_idx = s.num & 0xffff;
|
||||||
break;
|
vq->last_used_idx = (s.num >> 16) & 0xffff;
|
||||||
|
} else {
|
||||||
|
if (s.num > 0xffff) {
|
||||||
|
r = -EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
vq->last_avail_idx = s.num;
|
||||||
}
|
}
|
||||||
vq->last_avail_idx = s.num;
|
|
||||||
/* Forget the cached index value. */
|
/* Forget the cached index value. */
|
||||||
vq->avail_idx = vq->last_avail_idx;
|
vq->avail_idx = vq->last_avail_idx;
|
||||||
break;
|
break;
|
||||||
case VHOST_GET_VRING_BASE:
|
case VHOST_GET_VRING_BASE:
|
||||||
s.index = idx;
|
s.index = idx;
|
||||||
s.num = vq->last_avail_idx;
|
if (vhost_has_feature(vq, VIRTIO_F_RING_PACKED))
|
||||||
|
s.num = (u32)vq->last_avail_idx | ((u32)vq->last_used_idx << 16);
|
||||||
|
else
|
||||||
|
s.num = vq->last_avail_idx;
|
||||||
if (copy_to_user(argp, &s, sizeof s))
|
if (copy_to_user(argp, &s, sizeof s))
|
||||||
r = -EFAULT;
|
r = -EFAULT;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -85,13 +85,17 @@ struct vhost_virtqueue {
|
||||||
/* The routine to call when the Guest pings us, or timeout. */
|
/* The routine to call when the Guest pings us, or timeout. */
|
||||||
vhost_work_fn_t handle_kick;
|
vhost_work_fn_t handle_kick;
|
||||||
|
|
||||||
/* Last available index we saw. */
|
/* Last available index we saw.
|
||||||
|
* Values are limited to 0x7fff, and the high bit is used as
|
||||||
|
* a wrap counter when using VIRTIO_F_RING_PACKED. */
|
||||||
u16 last_avail_idx;
|
u16 last_avail_idx;
|
||||||
|
|
||||||
/* Caches available index value from user. */
|
/* Caches available index value from user. */
|
||||||
u16 avail_idx;
|
u16 avail_idx;
|
||||||
|
|
||||||
/* Last index we used. */
|
/* Last index we used.
|
||||||
|
* Values are limited to 0x7fff, and the high bit is used as
|
||||||
|
* a wrap counter when using VIRTIO_F_RING_PACKED. */
|
||||||
u16 last_used_idx;
|
u16 last_used_idx;
|
||||||
|
|
||||||
/* Used flags */
|
/* Used flags */
|
||||||
|
|
Loading…
Reference in New Issue