Skip to content

Commit b4ab225

Browse files
lulu-github-namemstsirkin
authored andcommitted
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 <[email protected]> Message-Id: <[email protected]> Reviewed-by: Michael S. Tsirkin <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]> Acked-by: Jason Wang <[email protected]>
1 parent 35f20bb commit b4ab225

File tree

2 files changed

+23
-9
lines changed

2 files changed

+23
-9
lines changed

hw/virtio/vhost.c

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -773,15 +773,25 @@ static int vhost_virtqueue_set_addr(struct vhost_dev *dev,
773773
struct vhost_virtqueue *vq,
774774
unsigned idx, bool enable_log)
775775
{
776-
struct vhost_vring_addr addr = {
777-
.index = idx,
778-
.desc_user_addr = (uint64_t)(unsigned long)vq->desc,
779-
.avail_user_addr = (uint64_t)(unsigned long)vq->avail,
780-
.used_user_addr = (uint64_t)(unsigned long)vq->used,
781-
.log_guest_addr = vq->used_phys,
782-
.flags = enable_log ? (1 << VHOST_VRING_F_LOG) : 0,
783-
};
784-
int r = dev->vhost_ops->vhost_set_vring_addr(dev, &addr);
776+
struct vhost_vring_addr addr;
777+
int r;
778+
memset(&addr, 0, sizeof(struct vhost_vring_addr));
779+
780+
if (dev->vhost_ops->vhost_vq_get_addr) {
781+
r = dev->vhost_ops->vhost_vq_get_addr(dev, &addr, vq);
782+
if (r < 0) {
783+
VHOST_OPS_DEBUG("vhost_vq_get_addr failed");
784+
return -errno;
785+
}
786+
} else {
787+
addr.desc_user_addr = (uint64_t)(unsigned long)vq->desc;
788+
addr.avail_user_addr = (uint64_t)(unsigned long)vq->avail;
789+
addr.used_user_addr = (uint64_t)(unsigned long)vq->used;
790+
}
791+
addr.index = idx;
792+
addr.log_guest_addr = vq->used_phys;
793+
addr.flags = enable_log ? (1 << VHOST_VRING_F_LOG) : 0;
794+
r = dev->vhost_ops->vhost_set_vring_addr(dev, &addr);
785795
if (r < 0) {
786796
VHOST_OPS_DEBUG("vhost_set_vring_addr failed");
787797
return -errno;

include/hw/virtio/vhost-backend.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,9 @@ typedef int (*vhost_dev_start_op)(struct vhost_dev *dev, bool started);
118118
typedef int (*vhost_vq_get_addr_op)(struct vhost_dev *dev,
119119
struct vhost_vring_addr *addr,
120120
struct vhost_virtqueue *vq);
121+
122+
typedef int (*vhost_get_device_id_op)(struct vhost_dev *dev, uint32_t *dev_id);
123+
121124
typedef struct VhostOps {
122125
VhostBackendType backend_type;
123126
vhost_backend_init vhost_backend_init;
@@ -160,6 +163,7 @@ typedef struct VhostOps {
160163
vhost_set_inflight_fd_op vhost_set_inflight_fd;
161164
vhost_dev_start_op vhost_dev_start;
162165
vhost_vq_get_addr_op vhost_vq_get_addr;
166+
vhost_get_device_id_op vhost_get_device_id;
163167
} VhostOps;
164168

165169
extern const VhostOps user_ops;

0 commit comments

Comments
 (0)