vhost: implement vhost_vq_get_addr method

use vhost_vq_get_addr callback to get the vq address from backend

Signed-off-by: Cindy Lu <lulu@redhat.com>
Message-Id: <20200701145538.22333-10-lulu@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Acked-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
Cindy Lu 2020-07-01 22:55:33 +08:00 committed by Michael S. Tsirkin
parent 35f20bb769
commit b4ab225c34
2 changed files with 23 additions and 9 deletions

View File

@ -773,15 +773,25 @@ static int vhost_virtqueue_set_addr(struct vhost_dev *dev,
struct vhost_virtqueue *vq, struct vhost_virtqueue *vq,
unsigned idx, bool enable_log) unsigned idx, bool enable_log)
{ {
struct vhost_vring_addr addr = { struct vhost_vring_addr addr;
.index = idx, int r;
.desc_user_addr = (uint64_t)(unsigned long)vq->desc, memset(&addr, 0, sizeof(struct vhost_vring_addr));
.avail_user_addr = (uint64_t)(unsigned long)vq->avail,
.used_user_addr = (uint64_t)(unsigned long)vq->used, if (dev->vhost_ops->vhost_vq_get_addr) {
.log_guest_addr = vq->used_phys, r = dev->vhost_ops->vhost_vq_get_addr(dev, &addr, vq);
.flags = enable_log ? (1 << VHOST_VRING_F_LOG) : 0, if (r < 0) {
}; VHOST_OPS_DEBUG("vhost_vq_get_addr failed");
int r = dev->vhost_ops->vhost_set_vring_addr(dev, &addr); return -errno;
}
} else {
addr.desc_user_addr = (uint64_t)(unsigned long)vq->desc;
addr.avail_user_addr = (uint64_t)(unsigned long)vq->avail;
addr.used_user_addr = (uint64_t)(unsigned long)vq->used;
}
addr.index = idx;
addr.log_guest_addr = vq->used_phys;
addr.flags = enable_log ? (1 << VHOST_VRING_F_LOG) : 0;
r = dev->vhost_ops->vhost_set_vring_addr(dev, &addr);
if (r < 0) { if (r < 0) {
VHOST_OPS_DEBUG("vhost_set_vring_addr failed"); VHOST_OPS_DEBUG("vhost_set_vring_addr failed");
return -errno; return -errno;

View File

@ -118,6 +118,9 @@ typedef int (*vhost_dev_start_op)(struct vhost_dev *dev, bool started);
typedef int (*vhost_vq_get_addr_op)(struct vhost_dev *dev, typedef int (*vhost_vq_get_addr_op)(struct vhost_dev *dev,
struct vhost_vring_addr *addr, struct vhost_vring_addr *addr,
struct vhost_virtqueue *vq); struct vhost_virtqueue *vq);
typedef int (*vhost_get_device_id_op)(struct vhost_dev *dev, uint32_t *dev_id);
typedef struct VhostOps { typedef struct VhostOps {
VhostBackendType backend_type; VhostBackendType backend_type;
vhost_backend_init vhost_backend_init; vhost_backend_init vhost_backend_init;
@ -160,6 +163,7 @@ typedef struct VhostOps {
vhost_set_inflight_fd_op vhost_set_inflight_fd; vhost_set_inflight_fd_op vhost_set_inflight_fd;
vhost_dev_start_op vhost_dev_start; vhost_dev_start_op vhost_dev_start;
vhost_vq_get_addr_op vhost_vq_get_addr; vhost_vq_get_addr_op vhost_vq_get_addr;
vhost_get_device_id_op vhost_get_device_id;
} VhostOps; } VhostOps;
extern const VhostOps user_ops; extern const VhostOps user_ops;