Skip to content

Commit

Permalink
net/bonding: fix dedicated queue mode in vector burst
Browse files Browse the repository at this point in the history
[ upstream commit b8cfca2 ]

If the vector burst mode is selected, the dedicated queue mode will not
take effect on some PMDs because these PMDs may have some limitations
in vector burst mode. For example, the limit on burst size. Currently,
both hns3 and intel I40E require four alignments when receiving packets
in vector mode. As a result, they can't accept packets if burst size
below four. However, in dedicated queue mode, the burst size of periodic
packets processing is one.

This patch fixes the above problem by modifying the burst size to 32.
This approach also makes the packet processing of the dedicated queue
mode more reasonable. Currently, if multiple LACP protocol packets are
received in the hardware queue in a cycle, only one LACP packet will be
processed in this cycle, and the left packets will be processed in the
following cycle. After the modification, all the LACP packets will be
processed at one time, which seems more reasonable and closer to the
behavior of the bonding driver when the dedicated queue is not turned on.

Fixes: 112891c ("net/bonding: add dedicated HW queues for LACP control")

Signed-off-by: Chengchang Tang <tangchengchang@huawei.com>
Signed-off-by: Min Hu (Connor) <humin29@huawei.com>
  • Loading branch information
Chengchang Tang authored and cpaelzer committed Nov 30, 2021
1 parent 6dbdbe5 commit cc4a61e
Showing 1 changed file with 23 additions and 9 deletions.
32 changes: 23 additions & 9 deletions drivers/net/bonding/rte_eth_bond_8023ad.c
Expand Up @@ -838,6 +838,27 @@ rx_machine_update(struct bond_dev_private *internals, uint16_t slave_id,
rx_machine(internals, slave_id, NULL);
}

static void
bond_mode_8023ad_dedicated_rxq_process(struct bond_dev_private *internals,
uint16_t slave_id)
{
#define DEDICATED_QUEUE_BURST_SIZE 32
struct rte_mbuf *lacp_pkt[DEDICATED_QUEUE_BURST_SIZE];
uint16_t rx_count = rte_eth_rx_burst(slave_id,
internals->mode4.dedicated_queues.rx_qid,
lacp_pkt, DEDICATED_QUEUE_BURST_SIZE);

if (rx_count) {
uint16_t i;

for (i = 0; i < rx_count; i++)
bond_mode_8023ad_handle_slow_pkt(internals, slave_id,
lacp_pkt[i]);
} else {
rx_machine_update(internals, slave_id, NULL);
}
}

static void
bond_mode_8023ad_periodic_cb(void *arg)
{
Expand Down Expand Up @@ -926,15 +947,8 @@ bond_mode_8023ad_periodic_cb(void *arg)

rx_machine_update(internals, slave_id, lacp_pkt);
} else {
uint16_t rx_count = rte_eth_rx_burst(slave_id,
internals->mode4.dedicated_queues.rx_qid,
&lacp_pkt, 1);

if (rx_count == 1)
bond_mode_8023ad_handle_slow_pkt(internals,
slave_id, lacp_pkt);
else
rx_machine_update(internals, slave_id, NULL);
bond_mode_8023ad_dedicated_rxq_process(internals,
slave_id);
}

periodic_machine(internals, slave_id);
Expand Down

0 comments on commit cc4a61e

Please sign in to comment.