MCPcopy Create free account
hub / github.com/F-Stack/f-stack / ntb_dequeue_bufs

Function ntb_dequeue_bufs

dpdk/drivers/raw/ntb/ntb.c:714–820  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

712}
713
714static int
715ntb_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);

Callers

nothing calls this directly

Calls 2

rte_mbuf_raw_allocFunction · 0.85
rte_memcpyFunction · 0.50

Tested by

no test coverage detected