[dpdk-dev] [PATCH 4/4] net/bonding: fix configuration of LACP slaves
Kulasek, TomaszX
tomaszx.kulasek at intel.com
Mon Nov 7 17:03:43 CET 2016
> -----Original Message-----
> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Robert Sanford
> Sent: Monday, August 1, 2016 22:43
> To: dev at dpdk.org
> Cc: Doherty, Declan <declan.doherty at intel.com>; De Lara Guarch, Pablo
> <pablo.de.lara.guarch at intel.com>; olivier.matz at 6wind.com
> Subject: [dpdk-dev] [PATCH 4/4] net/bonding: fix configuration of LACP
> slaves
>
> Problem: When adding a slave or starting a bond device, the bond device
> configures slave devices via function slave_configure().
> However, settings configured in the bond device's rte_eth_conf are not
> propagated to the slaves. For example, VLAN and CRC stripping are not
> working as expected.
>
> The problem is that we pass the wrong argument when we invoke
> rte_eth_dev_configure(). We pass the slave's currently configured
> rte_eth_conf (as a source arg!), when we should pass a copy of the
> (master) bond device's rte_eth_conf.
>
> Solution: Make a local copy of the bond device's rte_eth_conf, adjust the
> LSC flag based on the slave, and then pass that rte_eth_conf to
> rte_eth_dev_configure().
>
> Also, remove code that directly pokes RSS data into the slave's
> rte_eth_conf, as that is also contained in the proper rte_eth_conf that we
> will pass to rte_eth_dev_configure().
>
> Signed-off-by: Robert Sanford <rsanford at akamai.com>
> ---
> drivers/net/bonding/rte_eth_bond_pmd.c | 28 +++++++--------------------
> -
> 1 files changed, 7 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c
> b/drivers/net/bonding/rte_eth_bond_pmd.c
> index b20a272..486582f 100644
> --- a/drivers/net/bonding/rte_eth_bond_pmd.c
> +++ b/drivers/net/bonding/rte_eth_bond_pmd.c
> @@ -1302,6 +1302,7 @@ int
> slave_configure(struct rte_eth_dev *bonded_eth_dev,
> struct rte_eth_dev *slave_eth_dev)
> {
> + struct rte_eth_conf slave_eth_conf;
> struct bond_rx_queue *bd_rx_q;
> struct bond_tx_queue *bd_tx_q;
>
> @@ -1313,33 +1314,18 @@ slave_configure(struct rte_eth_dev
> *bonded_eth_dev,
> /* Stop slave */
> rte_eth_dev_stop(slave_eth_dev->data->port_id);
>
> - /* Enable interrupts on slave device if supported */
> - if (slave_eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)
> - slave_eth_dev->data->dev_conf.intr_conf.lsc = 1;
> -
> - /* If RSS is enabled for bonding, try to enable it for slaves */
> - if (bonded_eth_dev->data->dev_conf.rxmode.mq_mode &
> ETH_MQ_RX_RSS_FLAG) {
> - if (bonded_eth_dev->data-
> >dev_conf.rx_adv_conf.rss_conf.rss_key_len
> - != 0) {
> - slave_eth_dev->data-
> >dev_conf.rx_adv_conf.rss_conf.rss_key_len =
> - bonded_eth_dev->data-
> >dev_conf.rx_adv_conf.rss_conf.rss_key_len;
> - slave_eth_dev->data-
> >dev_conf.rx_adv_conf.rss_conf.rss_key =
> - bonded_eth_dev->data-
> >dev_conf.rx_adv_conf.rss_conf.rss_key;
> - } else {
> - slave_eth_dev->data-
> >dev_conf.rx_adv_conf.rss_conf.rss_key = NULL;
> - }
> + /* Build slave rte_eth_conf, starting from bonded's conf */
> + slave_eth_conf = bonded_eth_dev->data->dev_conf;
>
> - slave_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf =
> - bonded_eth_dev->data-
> >dev_conf.rx_adv_conf.rss_conf.rss_hf;
> - slave_eth_dev->data->dev_conf.rxmode.mq_mode =
> - bonded_eth_dev->data->dev_conf.rxmode.mq_mode;
> - }
> + /* Enable interrupts on slave device if supported */
> + slave_eth_conf.intr_conf.lsc =
> + !!(slave_eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC);
>
> /* Configure device */
> errval = rte_eth_dev_configure(slave_eth_dev->data->port_id,
> bonded_eth_dev->data->nb_rx_queues,
> bonded_eth_dev->data->nb_tx_queues,
> - &(slave_eth_dev->data->dev_conf));
> + &slave_eth_conf);
> if (errval != 0) {
> RTE_BOND_LOG(ERR, "Cannot configure slave device: port %u , err
> (%d)",
> slave_eth_dev->data->port_id, errval);
> --
> 1.7.1
Reviewed-by: Tomasz Kulasek <tomaszx.kulasek at intel.com>
More information about the dev
mailing list