| 1708 | } |
| 1709 | |
| 1710 | static __rte_always_inline uint32_t |
| 1711 | virtio_dev_rx(struct virtio_net *dev, struct vhost_virtqueue *vq, |
| 1712 | struct rte_mbuf **pkts, uint32_t count) |
| 1713 | { |
| 1714 | uint32_t nb_tx = 0; |
| 1715 | |
| 1716 | VHOST_LOG_DATA(dev->ifname, DEBUG, "%s\n", __func__); |
| 1717 | rte_rwlock_read_lock(&vq->access_lock); |
| 1718 | |
| 1719 | if (unlikely(!vq->enabled)) |
| 1720 | goto out_access_unlock; |
| 1721 | |
| 1722 | vhost_user_iotlb_rd_lock(vq); |
| 1723 | |
| 1724 | if (unlikely(!vq->access_ok)) { |
| 1725 | vhost_user_iotlb_rd_unlock(vq); |
| 1726 | rte_rwlock_read_unlock(&vq->access_lock); |
| 1727 | |
| 1728 | virtio_dev_vring_translate(dev, vq); |
| 1729 | goto out_no_unlock; |
| 1730 | } |
| 1731 | |
| 1732 | count = RTE_MIN((uint32_t)MAX_PKT_BURST, count); |
| 1733 | if (count == 0) |
| 1734 | goto out; |
| 1735 | |
| 1736 | if (vq_is_packed(dev)) |
| 1737 | nb_tx = virtio_dev_rx_packed(dev, vq, pkts, count); |
| 1738 | else |
| 1739 | nb_tx = virtio_dev_rx_split(dev, vq, pkts, count); |
| 1740 | |
| 1741 | vhost_queue_stats_update(dev, vq, pkts, nb_tx); |
| 1742 | |
| 1743 | out: |
| 1744 | vhost_user_iotlb_rd_unlock(vq); |
| 1745 | |
| 1746 | out_access_unlock: |
| 1747 | rte_rwlock_read_unlock(&vq->access_lock); |
| 1748 | |
| 1749 | out_no_unlock: |
| 1750 | return nb_tx; |
| 1751 | } |
| 1752 | |
| 1753 | uint16_t |
| 1754 | rte_vhost_enqueue_burst(int vid, uint16_t queue_id, |
no test coverage detected