[dpdk-dev] [PATCH v2] bond: set {rx|tx}_offload_capa flags

Doherty, Declan declan.doherty at intel.com
Thu Nov 27 22:28:37 CET 2014


Self nack, need to rebase again as mode 4 and 5 patches have been applied.

> -----Original Message-----
> From: Doherty, Declan
> Sent: Thursday, November 27, 2014 9:24 PM
> To: dev at dpdk.org
> Cc: jyu at vmware.com; thomas.monjalon at 6wind.com; Doherty, Declan
> Subject: [PATCH v2] bond: set {rx|tx}_offload_capa flags
> 
> v2:
> rebased to HEAD
> 
> From: Jia Yu <jyu at vmware.com>
> 
> Before the fix, bond device's offload capabilities are unset. This fix
> takes the minimum common set of slave devices' capabilities as bond
> device's capabilities. For simplicity, we ensure all slave devices
> to have a capability before bond device can claim this capability,
> even if some slave devices are unused (i.e. linked down, standby).
> 
> Signed-off-by: Jia Yu <jyu at vmware.com>
> Signed-off-by: Declan Doherty <declan.doherty at intel.com>
> ---
>  lib/librte_pmd_bond/rte_eth_bond_api.c     | 18 +++++++++++++++++-
>  lib/librte_pmd_bond/rte_eth_bond_pmd.c     |  5 +++++
>  lib/librte_pmd_bond/rte_eth_bond_private.h |  3 +++
>  3 files changed, 25 insertions(+), 1 deletion(-)
> 
> diff --git a/lib/librte_pmd_bond/rte_eth_bond_api.c
> b/lib/librte_pmd_bond/rte_eth_bond_api.c
> index f146bda..5125b57 100644
> --- a/lib/librte_pmd_bond/rte_eth_bond_api.c
> +++ b/lib/librte_pmd_bond/rte_eth_bond_api.c
> @@ -238,6 +238,8 @@ rte_eth_bond_create(const char *name, uint8_t mode,
> uint8_t socket_id)
> 
>  	internals->slave_count = 0;
>  	internals->active_slave_count = 0;
> +	internals->rx_offload_capa = 0;
> +	internals->tx_offload_capa = 0;
> 
>  	memset(internals->active_slaves, 0, sizeof(internals->active_slaves));
>  	memset(internals->slaves, 0, sizeof(internals->slaves));
> @@ -265,6 +267,7 @@ __eth_bond_slave_add_lock_free(uint8_t
> bonded_port_id, uint8_t slave_port_id)
>  	struct bond_dev_private *internals;
>  	struct bond_dev_private *temp_internals;
>  	struct rte_eth_link link_props;
> +	struct rte_eth_dev_info dev_info;
> 
>  	int i, j;
> 
> @@ -296,6 +299,9 @@ __eth_bond_slave_add_lock_free(uint8_t
> bonded_port_id, uint8_t slave_port_id)
>  	/* Add slave details to bonded device */
>  	slave_add(internals, slave_eth_dev);
> 
> +	memset(&dev_info, 0, sizeof(dev_info));
> +	rte_eth_dev_info_get(slave_port_id, &dev_info);
> +
>  	if (internals->slave_count < 1) {
>  		/* if MAC is not user defined then use MAC of first slave add to
>  		 * bonded device */
> @@ -308,6 +314,11 @@ __eth_bond_slave_add_lock_free(uint8_t
> bonded_port_id, uint8_t slave_port_id)
> 
>  		/* Make primary slave */
>  		internals->primary_port = slave_port_id;
> +
> +		/* Take the first dev's offload capabilities */
> +		internals->rx_offload_capa = dev_info.rx_offload_capa;
> +		internals->tx_offload_capa = dev_info.tx_offload_capa;
> +
>  	} else {
>  		/* Check slave link properties are supported if props are set,
>  		 * all slaves must be the same */
> @@ -323,6 +334,8 @@ __eth_bond_slave_add_lock_free(uint8_t
> bonded_port_id, uint8_t slave_port_id)
>  			link_properties_set(bonded_eth_dev,
>  					&(slave_eth_dev->data->dev_link));
>  		}
> +		internals->rx_offload_capa &= dev_info.rx_offload_capa;
> +		internals->tx_offload_capa &= dev_info.tx_offload_capa;
>  	}
> 
>  	internals->slave_count++;
> @@ -455,7 +468,10 @@ __eth_bond_slave_remove_lock_free(uint8_t
> bonded_port_id, uint8_t slave_port_id)
>  			memset(rte_eth_devices[bonded_port_id].data-
> >mac_addrs, 0,
> 
> 	sizeof(*(rte_eth_devices[bonded_port_id].data->mac_addrs)));
>  	}
> -
> +	if (internals->slave_count == 0) {
> +		internals->rx_offload_capa = 0;
> +		internals->tx_offload_capa = 0;
> +	}
>  	return 0;
>  }
> 
> diff --git a/lib/librte_pmd_bond/rte_eth_bond_pmd.c
> b/lib/librte_pmd_bond/rte_eth_bond_pmd.c
> index cf2fbab..0d1a36b 100644
> --- a/lib/librte_pmd_bond/rte_eth_bond_pmd.c
> +++ b/lib/librte_pmd_bond/rte_eth_bond_pmd.c
> @@ -788,6 +788,8 @@ static int bond_ethdev_configure(struct rte_eth_dev
> *dev);
>  static void
>  bond_ethdev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
>  {
> +	struct bond_dev_private *internals = dev->data->dev_private;
> +
>  	dev_info->driver_name = driver_name;
>  	dev_info->max_mac_addrs = 1;
> 
> @@ -798,6 +800,9 @@ bond_ethdev_info(struct rte_eth_dev *dev, struct
> rte_eth_dev_info *dev_info)
> 
>  	dev_info->min_rx_bufsize = 0;
>  	dev_info->pci_dev = dev->pci_dev;
> +
> +	dev_info->rx_offload_capa = internals->rx_offload_capa;
> +	dev_info->tx_offload_capa = internals->tx_offload_capa;
>  }
> 
>  static int
> diff --git a/lib/librte_pmd_bond/rte_eth_bond_private.h
> b/lib/librte_pmd_bond/rte_eth_bond_private.h
> index 6254c84..2096f81 100644
> --- a/lib/librte_pmd_bond/rte_eth_bond_private.h
> +++ b/lib/librte_pmd_bond/rte_eth_bond_private.h
> @@ -144,6 +144,9 @@ struct bond_dev_private {
>  	struct bond_slave_details slaves[RTE_MAX_ETHPORTS];
>  	/**< Arary of bonded slaves details */
> 
> +	uint32_t rx_offload_capa;            /** Rx offload capability */
> +	uint32_t tx_offload_capa;            /** Tx offload capability */
> +
>  	struct rte_kvargs *kvlist;
>  };
> 
> --
> 1.7.12.2



More information about the dev mailing list