| 1377 | } |
| 1378 | |
| 1379 | static __rte_always_inline void |
| 1380 | drain_eth_rx(struct vhost_dev *vdev) |
| 1381 | { |
| 1382 | uint16_t rx_count, enqueue_count; |
| 1383 | struct rte_mbuf *pkts[MAX_PKT_BURST]; |
| 1384 | |
| 1385 | rx_count = rte_eth_rx_burst(ports[0], vdev->vmdq_rx_q, |
| 1386 | pkts, MAX_PKT_BURST); |
| 1387 | |
| 1388 | if (!rx_count) |
| 1389 | return; |
| 1390 | |
| 1391 | enqueue_count = vdev_queue_ops[vdev->vid].enqueue_pkt_burst(vdev, |
| 1392 | VIRTIO_RXQ, pkts, rx_count); |
| 1393 | |
| 1394 | /* Retry if necessary */ |
| 1395 | if (enable_retry && unlikely(enqueue_count < rx_count)) { |
| 1396 | uint32_t retry = 0; |
| 1397 | |
| 1398 | while (enqueue_count < rx_count && retry++ < burst_rx_retry_num) { |
| 1399 | rte_delay_us(burst_rx_delay_time); |
| 1400 | enqueue_count += vdev_queue_ops[vdev->vid].enqueue_pkt_burst(vdev, |
| 1401 | VIRTIO_RXQ, &pkts[enqueue_count], |
| 1402 | rx_count - enqueue_count); |
| 1403 | } |
| 1404 | } |
| 1405 | |
| 1406 | if (enable_stats) { |
| 1407 | __atomic_fetch_add(&vdev->stats.rx_total_atomic, rx_count, |
| 1408 | __ATOMIC_SEQ_CST); |
| 1409 | __atomic_fetch_add(&vdev->stats.rx_atomic, enqueue_count, |
| 1410 | __ATOMIC_SEQ_CST); |
| 1411 | } |
| 1412 | |
| 1413 | if (!dma_bind[vid2socketid[vdev->vid]].dmas[VIRTIO_RXQ].async_enabled) { |
| 1414 | free_pkts(pkts, rx_count); |
| 1415 | } else { |
| 1416 | uint16_t enqueue_fail = rx_count - enqueue_count; |
| 1417 | if (enqueue_fail > 0) |
| 1418 | free_pkts(&pkts[enqueue_count], enqueue_fail); |
| 1419 | } |
| 1420 | } |
| 1421 | |
| 1422 | uint16_t async_dequeue_pkts(struct vhost_dev *dev, uint16_t queue_id, |
| 1423 | struct rte_mempool *mbuf_pool, |
no test coverage detected