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 --- |