| 949 | } |
| 950 | |
| 951 | static __rte_always_inline void |
| 952 | vhost_vring_call_split(struct virtio_net *dev, struct vhost_virtqueue *vq) |
| 953 | { |
| 954 | /* Flush used->idx update before we read avail->flags. */ |
| 955 | rte_atomic_thread_fence(rte_memory_order_seq_cst); |
| 956 | |
| 957 | /* Don't kick guest if we don't reach index specified by guest. */ |
| 958 | if (dev->features & (1ULL << VIRTIO_RING_F_EVENT_IDX)) { |
| 959 | uint16_t old = vq->signalled_used; |
| 960 | uint16_t new = vq->last_used_idx; |
| 961 | bool signalled_used_valid = vq->signalled_used_valid; |
| 962 | |
| 963 | vq->signalled_used = new; |
| 964 | vq->signalled_used_valid = true; |
| 965 | |
| 966 | VHOST_LOG_DATA(dev->ifname, DEBUG, |
| 967 | "%s: used_event_idx=%d, old=%d, new=%d\n", |
| 968 | __func__, vhost_used_event(vq), old, new); |
| 969 | |
| 970 | if (vhost_need_event(vhost_used_event(vq), new, old) || |
| 971 | unlikely(!signalled_used_valid)) |
| 972 | vhost_vring_inject_irq(dev, vq); |
| 973 | } else { |
| 974 | /* Kick the guest if necessary. */ |
| 975 | if (!(vq->avail->flags & VRING_AVAIL_F_NO_INTERRUPT)) |
| 976 | vhost_vring_inject_irq(dev, vq); |
| 977 | } |
| 978 | } |
| 979 | |
| 980 | static __rte_always_inline void |
| 981 | vhost_vring_call_packed(struct virtio_net *dev, struct vhost_virtqueue *vq) |
no test coverage detected