vhost: toggle device callbacks using used event idx

Actually use the new field of the used ring and tell the device if SVQ
wants to be notified.

The code is not reachable at the moment.

Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
Eugenio Pérez 2022-10-20 17:52:49 +02:00 committed by Jason Wang
parent f0c48e05bd
commit 01f8beacea

View File

@ -369,15 +369,27 @@ static bool vhost_svq_more_used(VhostShadowVirtqueue *svq)
*/ */
static bool vhost_svq_enable_notification(VhostShadowVirtqueue *svq) static bool vhost_svq_enable_notification(VhostShadowVirtqueue *svq)
{ {
svq->vring.avail->flags &= ~cpu_to_le16(VRING_AVAIL_F_NO_INTERRUPT); if (virtio_vdev_has_feature(svq->vdev, VIRTIO_RING_F_EVENT_IDX)) {
/* Make sure the flag is written before the read of used_idx */ uint16_t *used_event = (uint16_t *)&svq->vring.avail->ring[svq->vring.num];
*used_event = svq->shadow_used_idx;
} else {
svq->vring.avail->flags &= ~cpu_to_le16(VRING_AVAIL_F_NO_INTERRUPT);
}
/* Make sure the event is enabled before the read of used_idx */
smp_mb(); smp_mb();
return !vhost_svq_more_used(svq); return !vhost_svq_more_used(svq);
} }
static void vhost_svq_disable_notification(VhostShadowVirtqueue *svq) static void vhost_svq_disable_notification(VhostShadowVirtqueue *svq)
{ {
svq->vring.avail->flags |= cpu_to_le16(VRING_AVAIL_F_NO_INTERRUPT); /*
* No need to disable notification in the event idx case, since used event
* index is already an index too far away.
*/
if (!virtio_vdev_has_feature(svq->vdev, VIRTIO_RING_F_EVENT_IDX)) {
svq->vring.avail->flags |= cpu_to_le16(VRING_AVAIL_F_NO_INTERRUPT);
}
} }
static uint16_t vhost_svq_last_desc_of_chain(const VhostShadowVirtqueue *svq, static uint16_t vhost_svq_last_desc_of_chain(const VhostShadowVirtqueue *svq,