Commit e3b56cdd authored by Jason Wang's avatar Jason Wang Committed by Michael S. Tsirkin

vhost: try avoiding avail index access when getting descriptor

If last avail idx is not equal to cached avail idx, we're sure there's
still available buffers in the virtqueue so there's no need to re-read
avail idx. So let's skip this to avoid unnecessary userspace memory
access and memory barrier. Pktgen test show about 3% improvement on rx
pps.
Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent 51be7a9a
...@@ -1930,25 +1930,32 @@ int vhost_get_vq_desc(struct vhost_virtqueue *vq, ...@@ -1930,25 +1930,32 @@ int vhost_get_vq_desc(struct vhost_virtqueue *vq,
/* Check it isn't doing very strange things with descriptor numbers. */ /* Check it isn't doing very strange things with descriptor numbers. */
last_avail_idx = vq->last_avail_idx; last_avail_idx = vq->last_avail_idx;
if (unlikely(vhost_get_user(vq, avail_idx, &vq->avail->idx))) {
vq_err(vq, "Failed to access avail idx at %p\n",
&vq->avail->idx);
return -EFAULT;
}
vq->avail_idx = vhost16_to_cpu(vq, avail_idx);
if (unlikely((u16)(vq->avail_idx - last_avail_idx) > vq->num)) { if (vq->avail_idx == vq->last_avail_idx) {
vq_err(vq, "Guest moved used index from %u to %u", if (unlikely(vhost_get_user(vq, avail_idx, &vq->avail->idx))) {
last_avail_idx, vq->avail_idx); vq_err(vq, "Failed to access avail idx at %p\n",
return -EFAULT; &vq->avail->idx);
} return -EFAULT;
}
vq->avail_idx = vhost16_to_cpu(vq, avail_idx);
/* If there's nothing new since last we looked, return invalid. */ if (unlikely((u16)(vq->avail_idx - last_avail_idx) > vq->num)) {
if (vq->avail_idx == last_avail_idx) vq_err(vq, "Guest moved used index from %u to %u",
return vq->num; last_avail_idx, vq->avail_idx);
return -EFAULT;
}
/* If there's nothing new since last we looked, return
* invalid.
*/
if (vq->avail_idx == last_avail_idx)
return vq->num;
/* Only get avail ring entries after they have been exposed by guest. */ /* Only get avail ring entries after they have been
smp_rmb(); * exposed by guest.
*/
smp_rmb();
}
/* Grab the next descriptor number they're advertising, and increment /* Grab the next descriptor number they're advertising, and increment
* the index we've seen. */ * the index we've seen. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment