X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fark%2Fark_ethdev_rx.c;h=2f8d05099c8503456208b59a041f962c01e114b5;hb=63b3907833d87288bbc74f370e22f2929ec34594;hp=987d085e2404145c63b1e415f54160b3210ba6c6;hpb=6c293ffd63b3f61a95d8c492d007160874e7a057;p=dpdk.git diff --git a/drivers/net/ark/ark_ethdev_rx.c b/drivers/net/ark/ark_ethdev_rx.c index 987d085e24..2f8d05099c 100644 --- a/drivers/net/ark/ark_ethdev_rx.c +++ b/drivers/net/ark/ark_ethdev_rx.c @@ -1,34 +1,5 @@ -/*- - * BSD LICENSE - * - * Copyright (c) 2015-2017 Atomic Rules LLC - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2015-2018 Atomic Rules LLC */ #include @@ -54,6 +25,9 @@ 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 { @@ -79,11 +53,11 @@ struct ark_rx_queue { /* The queue Index is used within the dpdk device structures */ uint16_t queue_index; - uint32_t pad1; + uint32_t last_cons; /* separate cache line */ /* second cache line - fields only used in slow path */ - MARKER cacheline1 __rte_cache_min_aligned; + RTE_MARKER cacheline1 __rte_cache_min_aligned; volatile uint32_t prod_index; /* step 2 filled by FPGA */ } __rte_cache_aligned; @@ -107,7 +81,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; } @@ -131,7 +105,10 @@ 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->last_cons) >= 64U)) { + queue->last_cons = cons_index; + ark_mpu_set_producer(queue->mpu, queue->seed_index); + } } /* ************************************************************************* */ @@ -144,15 +121,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) { @@ -162,19 +137,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 */ @@ -186,7 +161,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; } @@ -209,7 +184,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); @@ -225,20 +200,25 @@ eth_ark_dev_rx_queue_setup(struct rte_eth_dev *dev, /* populate mbuf reserve */ status = eth_ark_rx_seed_mbufs(queue); + if (queue->seed_index != nb_desc) { + ARK_PMD_LOG(ERR, "Failed to allocate %u mbufs for RX queue %d\n", + nb_desc, qidx); + status = -1; + } /* MPU Setup */ if (status == 0) status = eth_ark_rx_hw_setup(dev, queue, qidx, queue_idx); if (unlikely(status != 0)) { - struct rte_mbuf *mbuf; + 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 */ - for (i = 0, mbuf = queue->reserve_q[0]; - i < nb_desc; ++i, mbuf++) { - rte_pktmbuf_free(mbuf); + for (i = 0, mbuf = queue->reserve_q; + i < queue->seed_index; ++i, mbuf++) { + rte_pktmbuf_free(*mbuf); } rte_free(queue->reserve_q); rte_free(queue->paddress_q); @@ -294,10 +274,10 @@ eth_ark_recv_pkts(void *rx_queue, 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 @@ -308,7 +288,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, @@ -379,7 +359,7 @@ eth_ark_rx_jumbo(struct ark_rx_queue *queue, mbuf_prev = mbuf; mbuf->data_len = data_len; mbuf->data_off = 0; - if (ARK_RX_DEBUG) + if (ARK_DEBUG_CORE) mbuf->seqn = cons_index; /* for debug only */ cons_index += 1; @@ -475,10 +455,15 @@ eth_ark_rx_seed_mbufs(struct ark_rx_queue *queue) struct rte_mbuf **mbufs = &queue->reserve_q[seed_m]; int status = rte_pktmbuf_alloc_bulk(queue->mb_pool, mbufs, nb); - if (unlikely(status != 0)) - return -1; + 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; + } + } - if (ARK_RX_DEBUG) { /* DEBUG */ + if (ARK_DEBUG_CORE) { /* DEBUG */ while (count != nb) { struct rte_mbuf *mbuf_init = queue->reserve_q[seed_m + count]; @@ -524,6 +509,29 @@ 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) { + ARK_PMD_LOG(NOTICE, + "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) @@ -601,14 +609,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) @@ -622,7 +630,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); @@ -633,8 +641,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, @@ -658,15 +666,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, seq: %" PRIU32 "\n", + mbuf, mbuf->pkt_len, mbuf->data_off, mbuf->seqn); 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"); } }