vdpa: Move vhost_svq_poll() to the caller of vhost_vdpa_net_cvq_add()
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> Message-Id: <196cadb55175a75275660c6634a538289f027ae3.1697165821.git.yin31149@gmail.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
24e59cfe0c
commit
a864a3219d
@ -631,15 +631,21 @@ static ssize_t vhost_vdpa_net_cvq_add(VhostVDPAState *s,
|
|||||||
qemu_log_mask(LOG_GUEST_ERROR, "%s: No space on device queue\n",
|
qemu_log_mask(LOG_GUEST_ERROR, "%s: No space on device queue\n",
|
||||||
__func__);
|
__func__);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We can poll here since we've had BQL from the time we sent the
|
* Convenience wrapper to poll SVQ for multiple control commands.
|
||||||
* descriptor. Also, we need to take the answer before SVQ pulls by itself,
|
*
|
||||||
* when BQL is released
|
* Caller should hold the BQL when invoking this function, and should take
|
||||||
|
* the answer before SVQ pulls by itself when BQL is released.
|
||||||
*/
|
*/
|
||||||
return vhost_svq_poll(svq, 1);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t vhost_vdpa_net_load_cmd(VhostVDPAState *s, uint8_t class,
|
static ssize_t vhost_vdpa_net_load_cmd(VhostVDPAState *s, uint8_t class,
|
||||||
@ -660,6 +666,7 @@ static ssize_t vhost_vdpa_net_load_cmd(VhostVDPAState *s, uint8_t class,
|
|||||||
.iov_base = s->status,
|
.iov_base = s->status,
|
||||||
.iov_len = sizeof(*s->status),
|
.iov_len = sizeof(*s->status),
|
||||||
};
|
};
|
||||||
|
ssize_t r;
|
||||||
|
|
||||||
assert(data_size < vhost_vdpa_net_cvq_cmd_page_len() - sizeof(ctrl));
|
assert(data_size < vhost_vdpa_net_cvq_cmd_page_len() - sizeof(ctrl));
|
||||||
|
|
||||||
@ -670,7 +677,16 @@ static ssize_t vhost_vdpa_net_load_cmd(VhostVDPAState *s, uint8_t class,
|
|||||||
iov_to_buf(data_sg, data_num, 0,
|
iov_to_buf(data_sg, data_num, 0,
|
||||||
s->cvq_cmd_out_buffer + sizeof(ctrl), data_size);
|
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)
|
static int vhost_vdpa_net_load_mac(VhostVDPAState *s, const VirtIONet *n)
|
||||||
@ -1165,6 +1181,15 @@ static int vhost_vdpa_net_excessive_mac_filter_cvq_add(VhostVDPAState *s,
|
|||||||
if (unlikely(r < 0)) {
|
if (unlikely(r < 0)) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We can poll here since we've had BQL from the time
|
||||||
|
* we sent the descriptor.
|
||||||
|
*/
|
||||||
|
r = vhost_vdpa_net_svq_poll(s, 1);
|
||||||
|
if (unlikely(r < sizeof(*s->status))) {
|
||||||
|
return r;
|
||||||
|
}
|
||||||
if (*s->status != VIRTIO_NET_OK) {
|
if (*s->status != VIRTIO_NET_OK) {
|
||||||
return sizeof(*s->status);
|
return sizeof(*s->status);
|
||||||
}
|
}
|
||||||
@ -1284,10 +1309,18 @@ static int vhost_vdpa_net_handle_ctrl_avail(VhostShadowVirtqueue *svq,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dev_written = vhost_vdpa_net_cvq_add(s, &out, 1, &vdpa_in, 1);
|
ssize_t r;
|
||||||
if (unlikely(dev_written < 0)) {
|
r = vhost_vdpa_net_cvq_add(s, &out, 1, &vdpa_in, 1);
|
||||||
|
if (unlikely(r < 0)) {
|
||||||
|
dev_written = r;
|
||||||
goto out;
|
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))) {
|
if (unlikely(dev_written < sizeof(status))) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user