virtio.c (e9600c6ca9e9ecc123105e1e3660314fe821a4cb) virtio.c (ef546f1275f6563e8934dd5e338d29d9f9909ca6)
1/*
2 * Virtio Support
3 *
4 * Copyright IBM, Corp. 2007
5 *
6 * Authors:
7 * Anthony Liguori <aliguori@us.ibm.com>
8 *

--- 203 unchanged lines hidden (view full) ---

212 }
213 pa = vq->vring.used + offsetof(VRingUsed, ring[vq->vring.num]);
214 virtio_stw_phys(vq->vdev, pa, val);
215}
216
217void virtio_queue_set_notification(VirtQueue *vq, int enable)
218{
219 vq->notification = enable;
1/*
2 * Virtio Support
3 *
4 * Copyright IBM, Corp. 2007
5 *
6 * Authors:
7 * Anthony Liguori <aliguori@us.ibm.com>
8 *

--- 203 unchanged lines hidden (view full) ---

212 }
213 pa = vq->vring.used + offsetof(VRingUsed, ring[vq->vring.num]);
214 virtio_stw_phys(vq->vdev, pa, val);
215}
216
217void virtio_queue_set_notification(VirtQueue *vq, int enable)
218{
219 vq->notification = enable;
220 if (vq->vdev->guest_features & (1 << VIRTIO_RING_F_EVENT_IDX)) {
220 if (virtio_has_feature(vq->vdev, VIRTIO_RING_F_EVENT_IDX)) {
221 vring_set_avail_event(vq, vring_avail_idx(vq));
222 } else if (enable) {
223 vring_used_flags_unset_bit(vq, VRING_USED_F_NO_NOTIFY);
224 } else {
225 vring_used_flags_set_bit(vq, VRING_USED_F_NO_NOTIFY);
226 }
227 if (enable) {
228 /* Expose avail event/used flags before caller checks the avail idx. */

--- 234 unchanged lines hidden (view full) ---

463 return 0;
464
465 /* When we start there are none of either input nor output. */
466 elem->out_num = elem->in_num = 0;
467
468 max = vq->vring.num;
469
470 i = head = virtqueue_get_head(vq, vq->last_avail_idx++);
221 vring_set_avail_event(vq, vring_avail_idx(vq));
222 } else if (enable) {
223 vring_used_flags_unset_bit(vq, VRING_USED_F_NO_NOTIFY);
224 } else {
225 vring_used_flags_set_bit(vq, VRING_USED_F_NO_NOTIFY);
226 }
227 if (enable) {
228 /* Expose avail event/used flags before caller checks the avail idx. */

--- 234 unchanged lines hidden (view full) ---

463 return 0;
464
465 /* When we start there are none of either input nor output. */
466 elem->out_num = elem->in_num = 0;
467
468 max = vq->vring.num;
469
470 i = head = virtqueue_get_head(vq, vq->last_avail_idx++);
471 if (vdev->guest_features & (1 << VIRTIO_RING_F_EVENT_IDX)) {
471 if (virtio_has_feature(vdev, VIRTIO_RING_F_EVENT_IDX)) {
472 vring_set_avail_event(vq, vq->last_avail_idx);
473 }
474
475 if (vring_desc_flags(vdev, desc_pa, i) & VRING_DESC_F_INDIRECT) {
476 if (vring_desc_len(vdev, desc_pa, i) % sizeof(VRingDesc)) {
477 error_report("Invalid size for indirect buffer table");
478 exit(1);
479 }

--- 341 unchanged lines hidden (view full) ---

821
822static bool vring_notify(VirtIODevice *vdev, VirtQueue *vq)
823{
824 uint16_t old, new;
825 bool v;
826 /* We need to expose used array entries before checking used event. */
827 smp_mb();
828 /* Always notify when queue is empty (when feature acknowledge) */
472 vring_set_avail_event(vq, vq->last_avail_idx);
473 }
474
475 if (vring_desc_flags(vdev, desc_pa, i) & VRING_DESC_F_INDIRECT) {
476 if (vring_desc_len(vdev, desc_pa, i) % sizeof(VRingDesc)) {
477 error_report("Invalid size for indirect buffer table");
478 exit(1);
479 }

--- 341 unchanged lines hidden (view full) ---

821
822static bool vring_notify(VirtIODevice *vdev, VirtQueue *vq)
823{
824 uint16_t old, new;
825 bool v;
826 /* We need to expose used array entries before checking used event. */
827 smp_mb();
828 /* Always notify when queue is empty (when feature acknowledge) */
829 if (((vdev->guest_features & (1 << VIRTIO_F_NOTIFY_ON_EMPTY)) &&
830 !vq->inuse && vring_avail_idx(vq) == vq->last_avail_idx)) {
829 if (virtio_has_feature(vdev, VIRTIO_F_NOTIFY_ON_EMPTY) &&
830 !vq->inuse && vring_avail_idx(vq) == vq->last_avail_idx) {
831 return true;
832 }
833
831 return true;
832 }
833
834 if (!(vdev->guest_features & (1 << VIRTIO_RING_F_EVENT_IDX))) {
834 if (!virtio_has_feature(vdev, VIRTIO_RING_F_EVENT_IDX)) {
835 return !(vring_avail_flags(vq) & VRING_AVAIL_F_NO_INTERRUPT);
836 }
837
838 v = vq->signalled_used_valid;
839 vq->signalled_used_valid = true;
840 old = vq->signalled_used;
841 new = vq->signalled_used = vring_used_idx(vq);
842 return !v || vring_need_event(vring_get_used_event(vq), new, old);

--- 503 unchanged lines hidden ---
835 return !(vring_avail_flags(vq) & VRING_AVAIL_F_NO_INTERRUPT);
836 }
837
838 v = vq->signalled_used_valid;
839 vq->signalled_used_valid = true;
840 old = vq->signalled_used;
841 new = vq->signalled_used = vring_used_idx(vq);
842 return !v || vring_need_event(vring_get_used_event(vq), new, old);

--- 503 unchanged lines hidden ---