[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 6/8] vdpa: Move vhost_svq_poll() to the caller of vhost_vdpa_n
From: |
Hawkins Jiawei |
Subject: |
[PATCH v3 6/8] vdpa: Move vhost_svq_poll() to the caller of vhost_vdpa_net_cvq_add() |
Date: |
Wed, 19 Jul 2023 15:53:51 +0800 |
This patch moves vhost_svq_poll() to the caller of
vhost_vdpa_net_cvq_add() and introduces a helper funtion.
By making this change, next patches in this series is
able to refactor vhost_vdpa_net_load_x() only to delay
the polling and checking process until either the SVQ
is full or control commands shadow buffers are full.
Signed-off-by: Hawkins Jiawei <yin31149@gmail.com>
---
net/vhost-vdpa.c | 50 ++++++++++++++++++++++++++++++++++++++----------
1 file changed, 40 insertions(+), 10 deletions(-)
diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c
index fe0ba19724..d06f38403f 100644
--- a/net/vhost-vdpa.c
+++ b/net/vhost-vdpa.c
@@ -609,15 +609,21 @@ static ssize_t vhost_vdpa_net_cvq_add(VhostVDPAState *s,
qemu_log_mask(LOG_GUEST_ERROR, "%s: No space on device queue\n",
__func__);
}
- return r;
}
- /*
- * We can poll here since we've had BQL from the time we sent the
- * descriptor. Also, we need to take the answer before SVQ pulls by itself,
- * when BQL is released
- */
- return vhost_svq_poll(svq, 1);
+ return r;
+}
+
+/*
+ * Convenience wrapper to poll SVQ for multiple control commands.
+ *
+ * Caller should hold the BQL when invoking this function, and should take
+ * the answer before SVQ pulls by itself when BQL is released.
+ */
+static ssize_t vhost_vdpa_net_svq_poll(VhostVDPAState *s, size_t
cmds_in_flight)
+{
+ VhostShadowVirtqueue *svq = g_ptr_array_index(s->vhost_vdpa.shadow_vqs, 0);
+ return vhost_svq_poll(svq, cmds_in_flight);
}
/* Convenience wrapper to get number of available SVQ descriptors */
@@ -645,6 +651,7 @@ static ssize_t vhost_vdpa_net_load_cmd(VhostVDPAState *s,
uint8_t class,
.iov_base = s->status,
.iov_len = sizeof(*s->status),
};
+ ssize_t r;
assert(data_size < vhost_vdpa_net_cvq_cmd_page_len() - sizeof(ctrl));
/* Each CVQ command has one out descriptor and one in descriptor */
@@ -657,7 +664,16 @@ static ssize_t vhost_vdpa_net_load_cmd(VhostVDPAState *s,
uint8_t class,
iov_to_buf(data_sg, data_num, 0,
s->cvq_cmd_out_buffer + sizeof(ctrl), data_size);
- return vhost_vdpa_net_cvq_add(s, &out, 1, &in, 1);
+ r = vhost_vdpa_net_cvq_add(s, &out, 1, &in, 1);
+ if (unlikely(r < 0)) {
+ return r;
+ }
+
+ /*
+ * We can poll here since we've had BQL from the time
+ * we sent the descriptor.
+ */
+ return vhost_vdpa_net_svq_poll(s, 1);
}
static int vhost_vdpa_net_load_mac(VhostVDPAState *s, const VirtIONet *n)
@@ -1152,6 +1168,12 @@ static int
vhost_vdpa_net_excessive_mac_filter_cvq_add(VhostVDPAState *s,
if (unlikely(r < 0)) {
return r;
}
+
+ /*
+ * We can poll here since we've had BQL from the time
+ * we sent the descriptor.
+ */
+ vhost_vdpa_net_svq_poll(s, 1);
if (*s->status != VIRTIO_NET_OK) {
return sizeof(*s->status);
}
@@ -1266,10 +1288,18 @@ static int
vhost_vdpa_net_handle_ctrl_avail(VhostShadowVirtqueue *svq,
goto out;
}
} else {
- dev_written = vhost_vdpa_net_cvq_add(s, &out, 1, &in, 1);
- if (unlikely(dev_written < 0)) {
+ ssize_t r;
+ r = vhost_vdpa_net_cvq_add(s, &out, 1, &in, 1);
+ if (unlikely(r < 0)) {
+ dev_written = r;
goto out;
}
+
+ /*
+ * We can poll here since we've had BQL from the time
+ * we sent the descriptor.
+ */
+ dev_written = vhost_vdpa_net_svq_poll(s, 1);
}
if (unlikely(dev_written < sizeof(status))) {
--
2.25.1
- [PATCH v3 0/8] vdpa: Send all CVQ state load commands in parallel, Hawkins Jiawei, 2023/07/19
- [PATCH v3 1/8] vhost: Add argument to vhost_svq_poll(), Hawkins Jiawei, 2023/07/19
- [PATCH v3 2/8] vdpa: Use iovec for vhost_vdpa_net_cvq_add(), Hawkins Jiawei, 2023/07/19
- [PATCH v3 3/8] vhost: Expose vhost_svq_available_slots(), Hawkins Jiawei, 2023/07/19
- [PATCH v3 4/8] vdpa: Avoid using vhost_vdpa_net_load_*() outside vhost_vdpa_net_load(), Hawkins Jiawei, 2023/07/19
- [PATCH v3 5/8] vdpa: Check device ack in vhost_vdpa_net_load_rx_mode(), Hawkins Jiawei, 2023/07/19
- [PATCH v3 6/8] vdpa: Move vhost_svq_poll() to the caller of vhost_vdpa_net_cvq_add(),
Hawkins Jiawei <=
- [PATCH v3 8/8] vdpa: Send cvq state load commands in parallel, Hawkins Jiawei, 2023/07/19
- [PATCH v3 7/8] vdpa: Add cursors to vhost_vdpa_net_loadx(), Hawkins Jiawei, 2023/07/19
- Re: [PATCH v3 0/8] vdpa: Send all CVQ state load commands in parallel, Michael S. Tsirkin, 2023/07/19
- Re: [PATCH v3 0/8] vdpa: Send all CVQ state load commands in parallel, Hawkins Jiawei, 2023/07/19
- Re: [PATCH v3 0/8] vdpa: Send all CVQ state load commands in parallel, Lei Yang, 2023/07/19
- Re: [PATCH v3 0/8] vdpa: Send all CVQ state load commands in parallel, Hawkins Jiawei, 2023/07/19
- Re: [PATCH v3 0/8] vdpa: Send all CVQ state load commands in parallel, Lei Yang, 2023/07/19
- Re: [PATCH v3 0/8] vdpa: Send all CVQ state load commands in parallel, Lei Yang, 2023/07/20
- Re: [PATCH v3 0/8] vdpa: Send all CVQ state load commands in parallel, Hawkins Jiawei, 2023/07/20
- Re: [PATCH v3 0/8] vdpa: Send all CVQ state load commands in parallel, Michael S. Tsirkin, 2023/07/19