X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fark%2Fark_ethdev_rx.c;h=d255f0177b4cd2432ca22e0f3eccccb15c28c43c;hb=b37ed6def36798342172f298516c5fc6d0d8e070;hp=5751585dbaa96d3e2b4316bb6acd5160ea3518a1;hpb=be410a86159874d5f809f95cbf056db26be42c12;p=dpdk.git diff --git a/drivers/net/ark/ark_ethdev_rx.c b/drivers/net/ark/ark_ethdev_rx.c index 5751585dba..d255f0177b 100644 --- a/drivers/net/ark/ark_ethdev_rx.c +++ b/drivers/net/ark/ark_ethdev_rx.c @@ -25,9 +25,6 @@ static uint32_t eth_ark_rx_jumbo(struct ark_rx_queue *queue, struct rte_mbuf *mbuf0, uint32_t cons_index); static inline int eth_ark_rx_seed_mbufs(struct ark_rx_queue *queue); -static int eth_ark_rx_seed_recovery(struct ark_rx_queue *queue, - uint32_t *pnb, - struct rte_mbuf **mbufs); /* ************************************************************************* */ struct ark_rx_queue { @@ -41,6 +38,9 @@ struct ark_rx_queue { struct ark_udm_t *udm; struct ark_mpu_t *mpu; + rx_user_meta_hook_fn rx_user_meta_hook; + void *ext_user_data; + uint32_t queue_size; uint32_t queue_mask; @@ -53,16 +53,14 @@ struct ark_rx_queue { /* The queue Index is used within the dpdk device structures */ uint16_t queue_index; - uint32_t pad1; + uint32_t unused; - /* separate cache line */ - /* second cache line - fields only used in slow path */ - MARKER cacheline1 __rte_cache_min_aligned; + /* next cache line - fields written by device */ + RTE_MARKER cacheline1 __rte_cache_min_aligned; volatile uint32_t prod_index; /* step 2 filled by FPGA */ } __rte_cache_aligned; - /* ************************************************************************* */ static int eth_ark_rx_hw_setup(struct rte_eth_dev *dev, @@ -81,7 +79,7 @@ eth_ark_rx_hw_setup(struct rte_eth_dev *dev, /* Verify HW */ if (ark_mpu_verify(queue->mpu, sizeof(rte_iova_t))) { - PMD_DRV_LOG(ERR, "Illegal configuration rx queue\n"); + ARK_PMD_LOG(ERR, "Illegal configuration rx queue\n"); return -1; } @@ -104,8 +102,10 @@ static inline void eth_ark_rx_update_cons_index(struct ark_rx_queue *queue, uint32_t cons_index) { queue->cons_index = cons_index; - eth_ark_rx_seed_mbufs(queue); - ark_mpu_set_producer(queue->mpu, queue->seed_index); + if ((cons_index + queue->queue_size - queue->seed_index) >= 64U) { + eth_ark_rx_seed_mbufs(queue); + ark_mpu_set_producer(queue->mpu, queue->seed_index); + } } /* ************************************************************************* */ @@ -118,15 +118,13 @@ eth_ark_dev_rx_queue_setup(struct rte_eth_dev *dev, struct rte_mempool *mb_pool) { static int warning1; /* = 0 */ - struct ark_adapter *ark = (struct ark_adapter *)dev->data->dev_private; + struct ark_adapter *ark = dev->data->dev_private; struct ark_rx_queue *queue; uint32_t i; int status; - /* Future works: divide the Q's evenly with multi-ports */ - int port = dev->data->port_id; - int qidx = port + queue_idx; + int qidx = queue_idx; /* We may already be setup, free memory prior to re-allocation */ if (dev->data->rx_queues[queue_idx] != NULL) { @@ -136,19 +134,19 @@ eth_ark_dev_rx_queue_setup(struct rte_eth_dev *dev, if (rx_conf != NULL && warning1 == 0) { warning1 = 1; - PMD_DRV_LOG(INFO, + ARK_PMD_LOG(NOTICE, "Arkville ignores rte_eth_rxconf argument.\n"); } if (RTE_PKTMBUF_HEADROOM < ARK_RX_META_SIZE) { - PMD_DRV_LOG(ERR, + ARK_PMD_LOG(ERR, "Error: DPDK Arkville requires head room > %d bytes (%s)\n", ARK_RX_META_SIZE, __func__); return -1; /* ERROR CODE */ } if (!rte_is_power_of_2(nb_desc)) { - PMD_DRV_LOG(ERR, + ARK_PMD_LOG(ERR, "DPDK Arkville configuration queue size must be power of two %u (%s)\n", nb_desc, __func__); return -1; /* ERROR CODE */ @@ -160,7 +158,7 @@ eth_ark_dev_rx_queue_setup(struct rte_eth_dev *dev, 64, socket_id); if (queue == 0) { - PMD_DRV_LOG(ERR, "Failed to allocate memory in %s\n", __func__); + ARK_PMD_LOG(ERR, "Failed to allocate memory in %s\n", __func__); return -ENOMEM; } @@ -170,6 +168,8 @@ eth_ark_dev_rx_queue_setup(struct rte_eth_dev *dev, queue->queue_index = queue_idx; queue->queue_size = nb_desc; queue->queue_mask = nb_desc - 1; + queue->rx_user_meta_hook = ark->user_ext.rx_user_meta_hook; + queue->ext_user_data = ark->user_data[dev->data->port_id]; queue->reserve_q = rte_zmalloc_socket("Ark_rx_queue mbuf", @@ -183,7 +183,7 @@ eth_ark_dev_rx_queue_setup(struct rte_eth_dev *dev, socket_id); if (queue->reserve_q == 0 || queue->paddress_q == 0) { - PMD_DRV_LOG(ERR, + ARK_PMD_LOG(ERR, "Failed to allocate queue memory in %s\n", __func__); rte_free(queue->reserve_q); @@ -200,7 +200,7 @@ eth_ark_dev_rx_queue_setup(struct rte_eth_dev *dev, status = eth_ark_rx_seed_mbufs(queue); if (queue->seed_index != nb_desc) { - PMD_DRV_LOG(ERR, "ARK: Failed to allocate %u mbufs for RX queue %d\n", + ARK_PMD_LOG(ERR, "Failed to allocate %u mbufs for RX queue %d\n", nb_desc, qidx); status = -1; } @@ -211,7 +211,7 @@ eth_ark_dev_rx_queue_setup(struct rte_eth_dev *dev, if (unlikely(status != 0)) { struct rte_mbuf **mbuf; - PMD_DRV_LOG(ERR, "Failed to initialize RX queue %d %s\n", + ARK_PMD_LOG(ERR, "Failed to initialize RX queue %d %s\n", qidx, __func__); /* Free the mbufs allocated */ @@ -246,8 +246,11 @@ eth_ark_recv_pkts(void *rx_queue, struct ark_rx_queue *queue; register uint32_t cons_index, prod_index; uint16_t nb; + uint16_t i; struct rte_mbuf *mbuf; + struct rte_mbuf **pmbuf; struct ark_rx_meta *meta; + rx_user_meta_hook_fn rx_user_meta_hook; queue = (struct ark_rx_queue *)rx_queue; if (unlikely(queue == 0)) @@ -256,6 +259,8 @@ eth_ark_recv_pkts(void *rx_queue, return 0; prod_index = queue->prod_index; cons_index = queue->cons_index; + if (prod_index == cons_index) + return 0; nb = 0; while (prod_index != cons_index) { @@ -267,16 +272,13 @@ eth_ark_recv_pkts(void *rx_queue, /* META DATA embedded in headroom */ meta = RTE_PTR_ADD(mbuf->buf_addr, ARK_RX_META_OFFSET); - mbuf->port = meta->port; mbuf->pkt_len = meta->pkt_len; mbuf->data_len = meta->pkt_len; - mbuf->timestamp = meta->timestamp; - mbuf->udata64 = meta->user_data; - if (ARK_RX_DEBUG) { /* debug sanity checks */ + if (ARK_DEBUG_CORE) { /* debug sanity checks */ if ((meta->pkt_len > (1024 * 16)) || (meta->pkt_len == 0)) { - PMD_RX_LOG(DEBUG, "RX: Bad Meta Q: %u" + ARK_PMD_LOG(DEBUG, "RX: Bad Meta Q: %u" " cons: %" PRIU32 " prod: %" PRIU32 " seed_index %" PRIU32 @@ -287,7 +289,7 @@ eth_ark_recv_pkts(void *rx_queue, queue->seed_index); - PMD_RX_LOG(DEBUG, " : UDM" + ARK_PMD_LOG(DEBUG, " : UDM" " prod: %" PRIU32 " len: %u\n", queue->udm->rt_cfg.prod_idx, @@ -300,8 +302,6 @@ eth_ark_recv_pkts(void *rx_queue, mbuf->pkt_len = 63; meta->pkt_len = 63; } - /* seqn is only set under debug */ - mbuf->seqn = cons_index; } if (unlikely(meta->pkt_len > ARK_RX_MAX_NOCHAIN)) @@ -316,9 +316,14 @@ eth_ark_recv_pkts(void *rx_queue, break; } - if (unlikely(nb != 0)) - /* report next free to FPGA */ - eth_ark_rx_update_cons_index(queue, cons_index); + rx_user_meta_hook = queue->rx_user_meta_hook; + for (pmbuf = rx_pkts, i = 0; rx_user_meta_hook && i < nb; i++) { + mbuf = *pmbuf++; + meta = RTE_PTR_ADD(mbuf->buf_addr, ARK_RX_META_OFFSET); + rx_user_meta_hook(mbuf, meta->user_meta, queue->ext_user_data); + } + + eth_ark_rx_update_cons_index(queue, cons_index); return nb; } @@ -347,8 +352,7 @@ eth_ark_rx_jumbo(struct ark_rx_queue *queue, /* HW guarantees that the data does not exceed prod_index! */ while (remaining != 0) { data_len = RTE_MIN(remaining, - RTE_MBUF_DEFAULT_DATAROOM + - RTE_PKTMBUF_HEADROOM); + RTE_MBUF_DEFAULT_DATAROOM); remaining -= data_len; segments += 1; @@ -357,9 +361,6 @@ eth_ark_rx_jumbo(struct ark_rx_queue *queue, mbuf_prev->next = mbuf; mbuf_prev = mbuf; mbuf->data_len = data_len; - mbuf->data_off = 0; - if (ARK_RX_DEBUG) - mbuf->seqn = cons_index; /* for debug only */ cons_index += 1; } @@ -455,14 +456,16 @@ eth_ark_rx_seed_mbufs(struct ark_rx_queue *queue) int status = rte_pktmbuf_alloc_bulk(queue->mb_pool, mbufs, nb); if (unlikely(status != 0)) { - /* Try to recover from lack of mbufs in pool */ - status = eth_ark_rx_seed_recovery(queue, &nb, mbufs); - if (unlikely(status != 0)) { - return -1; - } + ARK_PMD_LOG(NOTICE, + "Could not allocate %u mbufs from pool" + " for RX queue %u;" + " %u free buffers remaining in queue\n", + nb, queue->queue_index, + queue->seed_index - queue->cons_index); + return -1; } - if (ARK_RX_DEBUG) { /* DEBUG */ + if (ARK_DEBUG_CORE) { /* DEBUG */ while (count != nb) { struct rte_mbuf *mbuf_init = queue->reserve_q[seed_m + count]; @@ -508,29 +511,6 @@ eth_ark_rx_seed_mbufs(struct ark_rx_queue *queue) return 0; } -int -eth_ark_rx_seed_recovery(struct ark_rx_queue *queue, - uint32_t *pnb, - struct rte_mbuf **mbufs) -{ - int status = -1; - - /* Ignore small allocation failures */ - if (*pnb <= 64) - return -1; - - *pnb = 64U; - status = rte_pktmbuf_alloc_bulk(queue->mb_pool, mbufs, *pnb); - if (status != 0) { - PMD_DRV_LOG(ERR, - "ARK: Could not allocate %u mbufs from pool for RX queue %u;" - " %u free buffers remaining in queue\n", - *pnb, queue->queue_index, - queue->seed_index - queue->cons_index); - } - return status; -} - void eth_ark_rx_dump_queue(struct rte_eth_dev *dev, uint16_t queue_id, const char *msg) @@ -608,14 +588,14 @@ eth_rx_queue_stats_reset(void *vqueue) void eth_ark_udm_force_close(struct rte_eth_dev *dev) { - struct ark_adapter *ark = (struct ark_adapter *)dev->data->dev_private; + struct ark_adapter *ark = dev->data->dev_private; struct ark_rx_queue *queue; uint32_t index; uint16_t i; if (!ark_udm_is_flushed(ark->udm.v)) { /* restart the MPUs */ - PMD_DRV_LOG(ERR, "ARK: %s UDM not flushed\n", __func__); + ARK_PMD_LOG(NOTICE, "UDM not flushed -- forcing flush\n"); for (i = 0; i < dev->data->nb_rx_queues; i++) { queue = (struct ark_rx_queue *)dev->data->rx_queues[i]; if (queue == 0) @@ -629,7 +609,7 @@ eth_ark_udm_force_close(struct rte_eth_dev *dev) /* Wait to allow data to pass */ usleep(100); - PMD_DEBUG_LOG(DEBUG, "UDM forced flush attempt, stopped = %d\n", + ARK_PMD_LOG(DEBUG, "UDM forced flush attempt, stopped = %d\n", ark_udm_is_flushed(ark->udm.v)); } ark_udm_reset(ark->udm.v); @@ -640,8 +620,8 @@ ark_ethdev_rx_dump(const char *name, struct ark_rx_queue *queue) { if (queue == NULL) return; - PMD_DEBUG_LOG(DEBUG, "RX QUEUE %d -- %s", queue->phys_qid, name); - PMD_DEBUG_LOG(DEBUG, ARK_SU32 ARK_SU32 ARK_SU32 ARK_SU32 "\n", + ARK_PMD_LOG(DEBUG, "RX QUEUE %d -- %s", queue->phys_qid, name); + ARK_PMD_LOG(DEBUG, ARK_SU32 ARK_SU32 ARK_SU32 ARK_SU32 "\n", "queue_size", queue->queue_size, "seed_index", queue->seed_index, "prod_index", queue->prod_index, @@ -665,15 +645,15 @@ dump_mbuf_data(struct rte_mbuf *mbuf, uint16_t lo, uint16_t hi) { uint16_t i, j; - PMD_DRV_LOG(INFO, " MBUF: %p len %d, off: %d, seq: %" PRIU32 "\n", mbuf, - mbuf->pkt_len, mbuf->data_off, mbuf->seqn); + ARK_PMD_LOG(DEBUG, " MBUF: %p len %d, off: %d\n", + mbuf, mbuf->pkt_len, mbuf->data_off); for (i = lo; i < hi; i += 16) { uint8_t *dp = RTE_PTR_ADD(mbuf->buf_addr, i); - PMD_DRV_LOG(INFO, " %6d: ", i); + ARK_PMD_LOG(DEBUG, " %6d: ", i); for (j = 0; j < 16; j++) - PMD_DRV_LOG(INFO, " %02x", dp[j]); + ARK_PMD_LOG(DEBUG, " %02x", dp[j]); - PMD_DRV_LOG(INFO, "\n"); + ARK_PMD_LOG(DEBUG, "\n"); } }