| 3670 | } |
| 3671 | |
| 3672 | static __rte_always_inline uint16_t |
| 3673 | async_poll_dequeue_completed(struct virtio_net *dev, struct vhost_virtqueue *vq, |
| 3674 | struct rte_mbuf **pkts, uint16_t count, int16_t dma_id, |
| 3675 | uint16_t vchan_id, bool legacy_ol_flags) |
| 3676 | __rte_shared_locks_required(&vq->access_lock) |
| 3677 | { |
| 3678 | uint16_t start_idx, from, i; |
| 3679 | uint16_t nr_cpl_pkts = 0; |
| 3680 | struct async_inflight_info *pkts_info = vq->async->pkts_info; |
| 3681 | |
| 3682 | vhost_async_dma_check_completed(dev, dma_id, vchan_id, VHOST_DMA_MAX_COPY_COMPLETE); |
| 3683 | |
| 3684 | start_idx = async_get_first_inflight_pkt_idx(vq); |
| 3685 | |
| 3686 | from = start_idx; |
| 3687 | while (vq->async->pkts_cmpl_flag[from] && count--) { |
| 3688 | vq->async->pkts_cmpl_flag[from] = false; |
| 3689 | from = (from + 1) % vq->size; |
| 3690 | nr_cpl_pkts++; |
| 3691 | } |
| 3692 | |
| 3693 | if (nr_cpl_pkts == 0) |
| 3694 | return 0; |
| 3695 | |
| 3696 | for (i = 0; i < nr_cpl_pkts; i++) { |
| 3697 | from = (start_idx + i) % vq->size; |
| 3698 | pkts[i] = pkts_info[from].mbuf; |
| 3699 | |
| 3700 | if (virtio_net_with_host_offload(dev)) |
| 3701 | vhost_dequeue_offload(dev, &pkts_info[from].nethdr, pkts[i], |
| 3702 | legacy_ol_flags); |
| 3703 | } |
| 3704 | |
| 3705 | /* write back completed descs to used ring and update used idx */ |
| 3706 | if (vq_is_packed(dev)) { |
| 3707 | write_back_completed_descs_packed(vq, nr_cpl_pkts); |
| 3708 | vhost_vring_call_packed(dev, vq); |
| 3709 | } else { |
| 3710 | write_back_completed_descs_split(vq, nr_cpl_pkts); |
| 3711 | rte_atomic_fetch_add_explicit((unsigned short __rte_atomic *)&vq->used->idx, |
| 3712 | nr_cpl_pkts, rte_memory_order_release); |
| 3713 | vhost_vring_call_split(dev, vq); |
| 3714 | } |
| 3715 | vq->async->pkts_inflight_n -= nr_cpl_pkts; |
| 3716 | |
| 3717 | return nr_cpl_pkts; |
| 3718 | } |
| 3719 | |
| 3720 | static __rte_always_inline uint16_t |
| 3721 | virtio_dev_tx_async_split(struct virtio_net *dev, struct vhost_virtqueue *vq, |
no test coverage detected