| 712 | } |
| 713 | |
| 714 | static int |
| 715 | ntb_dequeue_bufs(struct rte_rawdev *dev, |
| 716 | struct rte_rawdev_buf **buffers, |
| 717 | unsigned int count, |
| 718 | rte_rawdev_obj_t context) |
| 719 | { |
| 720 | struct ntb_hw *hw = dev->dev_private; |
| 721 | struct ntb_rx_queue *rxq = hw->rx_queues[(size_t)context]; |
| 722 | struct ntb_rx_entry *sw_ring = rxq->sw_ring; |
| 723 | struct ntb_desc rx_desc[NTB_MAX_DESC_SIZE]; |
| 724 | struct rte_mbuf *first, *rxm_t; |
| 725 | struct rte_mbuf *prev = NULL; |
| 726 | volatile struct ntb_used *rx_item; |
| 727 | uint16_t nb_mbufs = 0; |
| 728 | uint16_t nb_rx = 0; |
| 729 | uint64_t bytes = 0; |
| 730 | uint16_t off, last_avail, used_cnt, used_nb; |
| 731 | int i; |
| 732 | |
| 733 | if (unlikely(dev->started == 0 || hw->peer_dev_up == 0)) { |
| 734 | NTB_LOG(DEBUG, "Link is not up"); |
| 735 | return nb_rx; |
| 736 | } |
| 737 | |
| 738 | used_cnt = *rxq->used_cnt; |
| 739 | |
| 740 | if (rxq->last_used == used_cnt) |
| 741 | return nb_rx; |
| 742 | |
| 743 | last_avail = rxq->last_avail; |
| 744 | used_nb = (used_cnt - rxq->last_used) & (rxq->nb_rx_desc - 1); |
| 745 | count = RTE_MIN(count, used_nb); |
| 746 | for (nb_rx = 0; nb_rx < count; nb_rx++) { |
| 747 | i = 0; |
| 748 | while (true) { |
| 749 | rx_item = rxq->rx_used_ring + rxq->last_used; |
| 750 | rxm_t = sw_ring[rxq->last_used].mbuf; |
| 751 | rxm_t->data_len = rx_item->len; |
| 752 | rxm_t->data_off = RTE_PKTMBUF_HEADROOM; |
| 753 | rxm_t->port = rxq->port_id; |
| 754 | |
| 755 | if (!i) { |
| 756 | rxm_t->nb_segs = 1; |
| 757 | first = rxm_t; |
| 758 | first->pkt_len = 0; |
| 759 | buffers[nb_rx]->buf_addr = rxm_t; |
| 760 | } else { |
| 761 | prev->next = rxm_t; |
| 762 | first->nb_segs++; |
| 763 | } |
| 764 | |
| 765 | prev = rxm_t; |
| 766 | first->pkt_len += prev->data_len; |
| 767 | rxq->last_used = (rxq->last_used + 1) & |
| 768 | (rxq->nb_rx_desc - 1); |
| 769 | |
| 770 | /* alloc new mbuf */ |
| 771 | rxm_t = rte_mbuf_raw_alloc(rxq->mpool); |
nothing calls this directly
no test coverage detected