[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH 06/12] vhost: Use opaque data in SVQDescState
From: |
Eugenio Pérez |
Subject: |
[RFC PATCH 06/12] vhost: Use opaque data in SVQDescState |
Date: |
Sat, 16 Jul 2022 13:34:01 +0200 |
Since we'll allow net/vhost-vdpa to add elements that don't come from
the guest, we need to store opaque data that makes sense to the caller.
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
---
hw/virtio/vhost-shadow-virtqueue.h | 4 ++--
hw/virtio/vhost-shadow-virtqueue.c | 20 +++++++++++---------
2 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/hw/virtio/vhost-shadow-virtqueue.h
b/hw/virtio/vhost-shadow-virtqueue.h
index d04c34a589..03eb7ff670 100644
--- a/hw/virtio/vhost-shadow-virtqueue.h
+++ b/hw/virtio/vhost-shadow-virtqueue.h
@@ -16,7 +16,7 @@
#include "hw/virtio/vhost-iova-tree.h"
typedef struct SVQDescState {
- VirtQueueElement *elem;
+ void *data;
/*
* Number of descriptors exposed to the device. May or may not match
@@ -115,7 +115,7 @@ void vhost_svq_push_elem(VhostShadowVirtqueue *svq,
const VirtQueueElement *elem, uint32_t len);
int vhost_svq_add(VhostShadowVirtqueue *svq, const struct iovec *out_sg,
size_t out_num, const struct iovec *in_sg, size_t in_num,
- VirtQueueElement *elem);
+ void *data);
size_t vhost_svq_poll(VhostShadowVirtqueue *svq);
void vhost_svq_set_svq_kick_fd(VhostShadowVirtqueue *svq, int svq_kick_fd);
diff --git a/hw/virtio/vhost-shadow-virtqueue.c
b/hw/virtio/vhost-shadow-virtqueue.c
index 29633b7a29..88e290d94b 100644
--- a/hw/virtio/vhost-shadow-virtqueue.c
+++ b/hw/virtio/vhost-shadow-virtqueue.c
@@ -237,7 +237,7 @@ static void vhost_svq_kick(VhostShadowVirtqueue *svq)
*/
int vhost_svq_add(VhostShadowVirtqueue *svq, const struct iovec *out_sg,
size_t out_num, const struct iovec *in_sg, size_t in_num,
- VirtQueueElement *elem)
+ void *data)
{
unsigned qemu_head;
unsigned ndescs = in_num + out_num;
@@ -252,7 +252,7 @@ int vhost_svq_add(VhostShadowVirtqueue *svq, const struct
iovec *out_sg,
return -EINVAL;
}
- svq->desc_state[qemu_head].elem = elem;
+ svq->desc_state[qemu_head].data = data;
svq->desc_state[qemu_head].ndescs = ndescs;
vhost_svq_kick(svq);
return 0;
@@ -389,8 +389,7 @@ static uint16_t vhost_svq_last_desc_of_chain(const
VhostShadowVirtqueue *svq,
return i;
}
-static VirtQueueElement *vhost_svq_get_buf(VhostShadowVirtqueue *svq,
- uint32_t *len)
+static void *vhost_svq_get_buf(VhostShadowVirtqueue *svq, uint32_t *len)
{
const vring_used_t *used = svq->vring.used;
vring_used_elem_t used_elem;
@@ -413,7 +412,7 @@ static VirtQueueElement
*vhost_svq_get_buf(VhostShadowVirtqueue *svq,
return NULL;
}
- if (unlikely(!svq->desc_state[used_elem.id].elem)) {
+ if (unlikely(!svq->desc_state[used_elem.id].data)) {
qemu_log_mask(LOG_GUEST_ERROR,
"Device %s says index %u is used, but it was not available",
svq->vdev->name, used_elem.id);
@@ -426,7 +425,7 @@ static VirtQueueElement
*vhost_svq_get_buf(VhostShadowVirtqueue *svq,
svq->free_head = used_elem.id;
*len = used_elem.len;
- return g_steal_pointer(&svq->desc_state[used_elem.id].elem);
+ return g_steal_pointer(&svq->desc_state[used_elem.id].data);
}
/**
@@ -498,8 +497,7 @@ size_t vhost_svq_poll(VhostShadowVirtqueue *svq)
{
do {
uint32_t len;
- VirtQueueElement *elem = vhost_svq_get_buf(svq, &len);
- if (elem) {
+ if (vhost_svq_get_buf(svq, &len)) {
return len;
}
@@ -658,8 +656,12 @@ void vhost_svq_stop(VhostShadowVirtqueue *svq)
vhost_svq_flush(svq, false);
for (unsigned i = 0; i < svq->vring.num; ++i) {
+ /*
+ * We know .data is an element because external callers of
+ * vhost_svq_add use active polling, not SVQ
+ */
g_autofree VirtQueueElement *elem = NULL;
- elem = g_steal_pointer(&svq->desc_state[i].elem);
+ elem = g_steal_pointer(&svq->desc_state[i].data);
if (elem) {
virtqueue_detach_element(svq->vq, elem, 0);
}
--
2.31.1
- Re: [RFC PATCH 01/12] vhost: Get vring base from vq, not svq, (continued)
- [RFC PATCH 02/12] vhost: Move SVQ queue rewind to the destination, Eugenio Pérez, 2022/07/16
- [RFC PATCH 03/12] vdpa: Small rename of error labels, Eugenio Pérez, 2022/07/16
- [RFC PATCH 04/12] vdpa: delay set_vring_ready after DRIVER_OK, Eugenio Pérez, 2022/07/16
- [RFC PATCH 06/12] vhost: Use opaque data in SVQDescState,
Eugenio Pérez <=
- [RFC PATCH 05/12] vhost: stop transfer elem ownership in vhost_handle_guest_kick, Eugenio Pérez, 2022/07/16
- [RFC PATCH 07/12] vhost: Add VhostVDPAStartOp operation, Eugenio Pérez, 2022/07/16
- [RFC PATCH 08/12] vdpa: Add vhost_vdpa_start_control_svq, Eugenio Pérez, 2022/07/16
- [RFC PATCH 09/12] vdpa: Extract vhost_vdpa_net_svq_add from vhost_vdpa_net_handle_ctrl_avail, Eugenio Pérez, 2022/07/16
- [RFC PATCH 10/12] vdpa: Make vhost_vdpa_net_cvq_map_elem accept any out sg, Eugenio Pérez, 2022/07/16