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;
|
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user