vhost: move descriptor translation to vhost_svq_vring_write_descs

It's done for both in and out descriptors so it's better placed here.

Acked-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
Eugenio Pérez 2022-07-20 08:59:26 +02:00 committed by Jason Wang
parent d48125de38
commit 009c2549bb

View File

@ -122,17 +122,35 @@ static bool vhost_svq_translate_addr(const VhostShadowVirtqueue *svq,
return true; return true;
} }
static void vhost_vring_write_descs(VhostShadowVirtqueue *svq, hwaddr *sg, /**
const struct iovec *iovec, size_t num, * Write descriptors to SVQ vring
bool more_descs, bool write) *
* @svq: The shadow virtqueue
* @sg: Cache for hwaddr
* @iovec: The iovec from the guest
* @num: iovec length
* @more_descs: True if more descriptors come in the chain
* @write: True if they are writeable descriptors
*
* Return true if success, false otherwise and print error.
*/
static bool vhost_svq_vring_write_descs(VhostShadowVirtqueue *svq, hwaddr *sg,
const struct iovec *iovec, size_t num,
bool more_descs, bool write)
{ {
uint16_t i = svq->free_head, last = svq->free_head; uint16_t i = svq->free_head, last = svq->free_head;
unsigned n; unsigned n;
uint16_t flags = write ? cpu_to_le16(VRING_DESC_F_WRITE) : 0; uint16_t flags = write ? cpu_to_le16(VRING_DESC_F_WRITE) : 0;
vring_desc_t *descs = svq->vring.desc; vring_desc_t *descs = svq->vring.desc;
bool ok;
if (num == 0) { if (num == 0) {
return; return true;
}
ok = vhost_svq_translate_addr(svq, sg, iovec, num);
if (unlikely(!ok)) {
return false;
} }
for (n = 0; n < num; n++) { for (n = 0; n < num; n++) {
@ -150,6 +168,7 @@ static void vhost_vring_write_descs(VhostShadowVirtqueue *svq, hwaddr *sg,
} }
svq->free_head = le16_to_cpu(svq->desc_next[last]); svq->free_head = le16_to_cpu(svq->desc_next[last]);
return true;
} }
static bool vhost_svq_add_split(VhostShadowVirtqueue *svq, static bool vhost_svq_add_split(VhostShadowVirtqueue *svq,
@ -169,20 +188,17 @@ static bool vhost_svq_add_split(VhostShadowVirtqueue *svq,
return false; return false;
} }
ok = vhost_svq_translate_addr(svq, sgs, elem->out_sg, elem->out_num); ok = vhost_svq_vring_write_descs(svq, sgs, elem->out_sg, elem->out_num,
if (unlikely(!ok)) { elem->in_num > 0, false);
return false;
}
vhost_vring_write_descs(svq, sgs, elem->out_sg, elem->out_num,
elem->in_num > 0, false);
ok = vhost_svq_translate_addr(svq, sgs, elem->in_sg, elem->in_num);
if (unlikely(!ok)) { if (unlikely(!ok)) {
return false; return false;
} }
vhost_vring_write_descs(svq, sgs, elem->in_sg, elem->in_num, false, true); ok = vhost_svq_vring_write_descs(svq, sgs, elem->in_sg, elem->in_num, false,
true);
if (unlikely(!ok)) {
return false;
}
/* /*
* Put the entry in the available array (but don't update avail->idx until * Put the entry in the available array (but don't update avail->idx until