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:
parent
d48125de38
commit
009c2549bb
@ -122,17 +122,35 @@ static bool vhost_svq_translate_addr(const VhostShadowVirtqueue *svq,
|
||||
return true;
|
||||
}
|
||||
|
||||
static void vhost_vring_write_descs(VhostShadowVirtqueue *svq, hwaddr *sg,
|
||||
const struct iovec *iovec, size_t num,
|
||||
bool more_descs, bool write)
|
||||
/**
|
||||
* Write descriptors to SVQ vring
|
||||
*
|
||||
* @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;
|
||||
unsigned n;
|
||||
uint16_t flags = write ? cpu_to_le16(VRING_DESC_F_WRITE) : 0;
|
||||
vring_desc_t *descs = svq->vring.desc;
|
||||
bool ok;
|
||||
|
||||
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++) {
|
||||
@ -150,6 +168,7 @@ static void vhost_vring_write_descs(VhostShadowVirtqueue *svq, hwaddr *sg,
|
||||
}
|
||||
|
||||
svq->free_head = le16_to_cpu(svq->desc_next[last]);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool vhost_svq_add_split(VhostShadowVirtqueue *svq,
|
||||
@ -169,20 +188,17 @@ static bool vhost_svq_add_split(VhostShadowVirtqueue *svq,
|
||||
return false;
|
||||
}
|
||||
|
||||
ok = vhost_svq_translate_addr(svq, sgs, elem->out_sg, elem->out_num);
|
||||
if (unlikely(!ok)) {
|
||||
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);
|
||||
ok = vhost_svq_vring_write_descs(svq, sgs, elem->out_sg, elem->out_num,
|
||||
elem->in_num > 0, false);
|
||||
if (unlikely(!ok)) {
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user