Since the qos_sched app does batch dequeues from the QoS block, there is little point in trying to batch further in the app - just send out the full burst of packets that were received from the QoS block. With modern CPUs and write-combining doorbells, the cost of doing smaller TX's is reduced anyway for the worst case.
Signed-off-by: Bruce Richardson <bruce.richard...@intel.com> --- examples/qos_sched/app_thread.c | 94 ++++----------------------------- examples/qos_sched/main.c | 12 ----- examples/qos_sched/main.h | 6 --- 3 files changed, 9 insertions(+), 103 deletions(-) diff --git a/examples/qos_sched/app_thread.c b/examples/qos_sched/app_thread.c index dbc878b553..1ea732aa91 100644 --- a/examples/qos_sched/app_thread.c +++ b/examples/qos_sched/app_thread.c @@ -104,82 +104,21 @@ app_rx_thread(struct thread_conf **confs) } } - - -/* Send the packet to an output interface - * For performance reason function returns number of packets dropped, not sent, - * so 0 means that all packets were sent successfully - */ - -static inline void -app_send_burst(struct thread_conf *qconf) -{ - struct rte_mbuf **mbufs; - uint32_t n, ret; - - mbufs = (struct rte_mbuf **)qconf->m_table; - n = qconf->n_mbufs; - - do { - ret = rte_eth_tx_burst(qconf->tx_port, qconf->tx_queue, mbufs, (uint16_t)n); - /* we cannot drop the packets, so re-send */ - /* update number of packets to be sent */ - n -= ret; - mbufs = (struct rte_mbuf **)&mbufs[ret]; - } while (n); -} - - -/* Send the packet to an output interface */ -static void -app_send_packets(struct thread_conf *qconf, struct rte_mbuf **mbufs, uint32_t nb_pkt) -{ - uint32_t i, len; - - len = qconf->n_mbufs; - for(i = 0; i < nb_pkt; i++) { - qconf->m_table[len] = mbufs[i]; - len++; - /* enough pkts to be sent */ - if (unlikely(len == burst_conf.tx_burst)) { - qconf->n_mbufs = len; - app_send_burst(qconf); - len = 0; - } - } - - qconf->n_mbufs = len; -} - void app_tx_thread(struct thread_conf **confs) { struct rte_mbuf *mbufs[burst_conf.qos_dequeue]; struct thread_conf *conf; int conf_idx = 0; - int retval; - const uint64_t drain_tsc = (rte_get_tsc_hz() + US_PER_S - 1) / US_PER_S * BURST_TX_DRAIN_US; + int nb_pkts; while ((conf = confs[conf_idx])) { - retval = rte_ring_sc_dequeue_bulk(conf->tx_ring, (void **)mbufs, + nb_pkts = rte_ring_sc_dequeue_burst(conf->tx_ring, (void **)mbufs, burst_conf.qos_dequeue, NULL); - if (likely(retval != 0)) { - app_send_packets(conf, mbufs, burst_conf.qos_dequeue); - - conf->counter = 0; /* reset empty read loop counter */ - } - - conf->counter++; - - /* drain ring and TX queues */ - if (unlikely(conf->counter > drain_tsc)) { - /* now check is there any packets left to be transmitted */ - if (conf->n_mbufs != 0) { - app_send_burst(conf); - - conf->n_mbufs = 0; - } - conf->counter = 0; + if (likely(nb_pkts != 0)) { + uint16_t nb_tx = rte_eth_tx_burst(conf->tx_port, 0, mbufs, nb_pkts); + if (nb_pkts != nb_tx) + rte_pktmbuf_free_bulk(&mbufs[nb_pkts], nb_pkts - nb_tx); } conf_idx++; @@ -230,7 +169,6 @@ app_mixed_thread(struct thread_conf **confs) struct rte_mbuf *mbufs[burst_conf.ring_burst]; struct thread_conf *conf; int conf_idx = 0; - const uint64_t drain_tsc = (rte_get_tsc_hz() + US_PER_S - 1) / US_PER_S * BURST_TX_DRAIN_US; while ((conf = confs[conf_idx])) { uint32_t nb_pkt; @@ -250,23 +188,9 @@ app_mixed_thread(struct thread_conf **confs) nb_pkt = rte_sched_port_dequeue(conf->sched_port, mbufs, burst_conf.qos_dequeue); if (likely(nb_pkt > 0)) { - app_send_packets(conf, mbufs, nb_pkt); - - conf->counter = 0; /* reset empty read loop counter */ - } - - conf->counter++; - - /* drain ring and TX queues */ - if (unlikely(conf->counter > drain_tsc)) { - - /* now check is there any packets left to be transmitted */ - if (conf->n_mbufs != 0) { - app_send_burst(conf); - - conf->n_mbufs = 0; - } - conf->counter = 0; + uint16_t nb_tx = rte_eth_tx_burst(conf->tx_port, 0, mbufs, nb_pkt); + if (nb_tx != nb_pkt) + rte_pktmbuf_free_bulk(&mbufs[nb_tx], nb_pkt - nb_tx); } conf_idx++; diff --git a/examples/qos_sched/main.c b/examples/qos_sched/main.c index dc6a17a646..b3c2c9ef23 100644 --- a/examples/qos_sched/main.c +++ b/examples/qos_sched/main.c @@ -105,12 +105,6 @@ app_main_loop(__rte_unused void *dummy) } else if (mode == (APP_TX_MODE | APP_WT_MODE)) { for (i = 0; i < wt_idx; i++) { - wt_confs[i]->m_table = rte_malloc("table_wt", sizeof(struct rte_mbuf *) - * burst_conf.tx_burst, RTE_CACHE_LINE_SIZE); - - if (wt_confs[i]->m_table == NULL) - rte_panic("flow %u unable to allocate memory buffer\n", i); - RTE_LOG(INFO, APP, "flow %u lcoreid %u sched+write port %u\n", i, lcore_id, wt_confs[i]->tx_port); @@ -120,12 +114,6 @@ app_main_loop(__rte_unused void *dummy) } else if (mode == APP_TX_MODE) { for (i = 0; i < tx_idx; i++) { - tx_confs[i]->m_table = rte_malloc("table_tx", sizeof(struct rte_mbuf *) - * burst_conf.tx_burst, RTE_CACHE_LINE_SIZE); - - if (tx_confs[i]->m_table == NULL) - rte_panic("flow %u unable to allocate memory buffer\n", i); - RTE_LOG(INFO, APP, "flow%u lcoreid%u write port%u\n", i, lcore_id, tx_confs[i]->tx_port); } diff --git a/examples/qos_sched/main.h b/examples/qos_sched/main.h index 76a68f585f..b9c301483a 100644 --- a/examples/qos_sched/main.h +++ b/examples/qos_sched/main.h @@ -37,8 +37,6 @@ extern "C" { #define TX_HTHRESH 0 /**< Default values of TX host threshold reg. */ #define TX_WTHRESH 0 /**< Default values of TX write-back threshold reg. */ -#define BURST_TX_DRAIN_US 100 - #ifndef APP_MAX_LCORE #if (RTE_MAX_LCORE > 64) #define APP_MAX_LCORE 64 @@ -75,10 +73,6 @@ struct thread_stat struct thread_conf { - uint32_t counter; - uint32_t n_mbufs; - struct rte_mbuf **m_table; - uint16_t rx_port; uint16_t tx_port; uint16_t rx_queue; -- 2.37.2