| 380 | } |
| 381 | |
| 382 | static __rte_always_inline void |
| 383 | vhost_flush_dequeue_shadow_packed(struct virtio_net *dev, |
| 384 | struct vhost_virtqueue *vq) |
| 385 | { |
| 386 | struct vring_used_elem_packed *used_elem = &vq->shadow_used_packed[0]; |
| 387 | |
| 388 | vq->desc_packed[vq->shadow_last_used_idx].id = used_elem->id; |
| 389 | /* desc flags is the synchronization point for virtio packed vring */ |
| 390 | rte_atomic_store_explicit( |
| 391 | (unsigned short __rte_atomic *)&vq->desc_packed[vq->shadow_last_used_idx].flags, |
| 392 | used_elem->flags, rte_memory_order_release); |
| 393 | |
| 394 | vhost_log_cache_used_vring(dev, vq, vq->shadow_last_used_idx * |
| 395 | sizeof(struct vring_packed_desc), |
| 396 | sizeof(struct vring_packed_desc)); |
| 397 | vq->shadow_used_idx = 0; |
| 398 | vhost_log_cache_sync(dev, vq); |
| 399 | } |
| 400 | |
| 401 | static __rte_always_inline void |
| 402 | vhost_flush_enqueue_batch_packed(struct virtio_net *dev, |
no test coverage detected