]> git.droids-corp.org - dpdk.git/commitdiff
net/bonding: fix possible unbalanced packet receiving
authorRongQing Li <lirongqing@baidu.com>
Tue, 22 Sep 2020 10:29:31 +0000 (18:29 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 16 Oct 2020 17:18:47 +0000 (19:18 +0200)
Current Rx round robin policy for the slaves has two issue:

1. active_slave in bond_dev_private is shared by multiple PMDS which
   maybe cause some slave Rx hungry, for example, there is two PMD and
   two slave port, both PMDs start to receive, and see that active_slave
   is 0, and receive from slave 0, after complete, they increase
   active_slave by one, totally active_slave are increased by two, next
   time, they will start to receive from slave 0 again, at last, slave 1
   maybe drop packets during to not be polled by PMD

2. active_slave is shared and written by multiple PMD in RX path for
   every time RX, this is a kind of cache false share, low performance.

So move active_slave from bond_dev_private to bond_rx_queue make it as
per queue variable

Fixes: ae2a04864a9a ("net/bonding: reduce slave starvation on Rx poll")
Cc: stable@dpdk.org
Signed-off-by: RongQing Li <lirongqing@baidu.com>
Signed-off-by: Dongsheng Rong <rongdongsheng@baidu.com>
Reviewed-by: Wei Hu (Xavier) <xavier.huwei@huawei.com>
drivers/net/bonding/eth_bond_private.h
drivers/net/bonding/rte_eth_bond_api.c
drivers/net/bonding/rte_eth_bond_pmd.c

index 0a0034705d998a5fbe25f038cdb94657593603a7..62e3a9dbf39e8807b37c21211ef16a21105d90d2 100644 (file)
@@ -50,6 +50,8 @@ extern const struct rte_flow_ops bond_flow_ops;
 /** Port Queue Mapping Structure */
 struct bond_rx_queue {
        uint16_t queue_id;
+       /**< Next active_slave to poll */
+       uint16_t active_slave;
        /**< Queue Id */
        struct bond_dev_private *dev_private;
        /**< Reference to eth_dev private structure */
@@ -132,7 +134,6 @@ struct bond_dev_private {
        uint16_t nb_rx_queues;                  /**< Total number of rx queues */
        uint16_t nb_tx_queues;                  /**< Total number of tx queues*/
 
-       uint16_t active_slave;          /**< Next active_slave to poll */
        uint16_t active_slave_count;            /**< Number of active slaves */
        uint16_t active_slaves[RTE_MAX_ETHPORTS];    /**< Active slave list */
 
index 97c667e007b90deeae940310fc703438a51e873c..a4007fe07c208e27515f32b3b969f79e6afab6c0 100644 (file)
@@ -129,12 +129,6 @@ deactivate_slave(struct rte_eth_dev *eth_dev, uint16_t port_id)
        RTE_ASSERT(active_count < RTE_DIM(internals->active_slaves));
        internals->active_slave_count = active_count;
 
-       /* Resetting active_slave when reaches to max
-        * no of slaves in active list
-        */
-       if (internals->active_slave >= active_count)
-               internals->active_slave = 0;
-
        if (eth_dev->data->dev_started) {
                if (internals->mode == BONDING_MODE_8023AD) {
                        bond_mode_8023ad_start(eth_dev);
index 1f761c7c9efb24d73ba37a1bf0cae7f79dc6dcd4..05ac25fcada5a6e4d20221e4eff19e8c26a522b6 100644 (file)
@@ -69,7 +69,7 @@ bond_ethdev_rx_burst(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
        struct bond_rx_queue *bd_rx_q = (struct bond_rx_queue *)queue;
        internals = bd_rx_q->dev_private;
        slave_count = internals->active_slave_count;
-       active_slave = internals->active_slave;
+       active_slave = bd_rx_q->active_slave;
 
        for (i = 0; i < slave_count && nb_pkts; i++) {
                uint16_t num_rx_slave;
@@ -86,8 +86,8 @@ bond_ethdev_rx_burst(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)
                        active_slave = 0;
        }
 
-       if (++internals->active_slave >= slave_count)
-               internals->active_slave = 0;
+       if (++bd_rx_q->active_slave >= slave_count)
+               bd_rx_q->active_slave = 0;
        return num_rx_total;
 }
 
@@ -303,9 +303,9 @@ rx_burst_8023ad(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts,
        memcpy(slaves, internals->active_slaves,
                        sizeof(internals->active_slaves[0]) * slave_count);
 
-       idx = internals->active_slave;
+       idx = bd_rx_q->active_slave;
        if (idx >= slave_count) {
-               internals->active_slave = 0;
+               bd_rx_q->active_slave = 0;
                idx = 0;
        }
        for (i = 0; i < slave_count && num_rx_total < nb_pkts; i++) {
@@ -367,8 +367,8 @@ rx_burst_8023ad(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts,
                        idx = 0;
        }
 
-       if (++internals->active_slave >= slave_count)
-               internals->active_slave = 0;
+       if (++bd_rx_q->active_slave >= slave_count)
+               bd_rx_q->active_slave = 0;
 
        return num_rx_total;
 }