From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-outbound-1.vmware.com (smtp-outbound-1.vmware.com [208.91.2.12]) by dpdk.org (Postfix) with ESMTP id A4DC7591A for ; Sat, 8 Nov 2014 02:34:36 +0100 (CET) Received: from sc9-mailhost2.vmware.com (sc9-mailhost2.vmware.com [10.113.161.72]) by smtp-outbound-1.vmware.com (Postfix) with ESMTP id 570B7285FE for ; Fri, 7 Nov 2014 17:44:10 -0800 (PST) Received: from prmh-edge-ivybridge-13.eng.vmware.com (prmh-edge-ivybridge-13.eng.vmware.com [10.24.235.96]) by sc9-mailhost2.vmware.com (Postfix) with ESMTP id 527A0B162A; Fri, 7 Nov 2014 17:44:10 -0800 (PST) From: Jia Yu To: dev@dpdk.org Date: Fri, 7 Nov 2014 09:35:38 -0800 Message-Id: <1415381738-43417-1-git-send-email-jyu@vmware.com> X-Mailer: git-send-email 1.9.1 Subject: [dpdk-dev] [PATCH] Bond: set {rx|tx}_offload_capa flags X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 08 Nov 2014 01:34:37 -0000 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 --- lib/librte_pmd_bond/rte_eth_bond_api.c | 16 ++++++++++++++++ lib/librte_pmd_bond/rte_eth_bond_pmd.c | 5 +++++ lib/librte_pmd_bond/rte_eth_bond_private.h | 2 ++ 3 files changed, 23 insertions(+) diff --git a/lib/librte_pmd_bond/rte_eth_bond_api.c b/lib/librte_pmd_bond/rte_eth_bond_api.c index 75f5694..bff1ce1 100644 --- a/lib/librte_pmd_bond/rte_eth_bond_api.c +++ b/lib/librte_pmd_bond/rte_eth_bond_api.c @@ -226,6 +226,8 @@ rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id) internals->link_props_set = 0; 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)); @@ -256,6 +258,7 @@ rte_eth_bond_slave_add(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; @@ -301,6 +304,9 @@ rte_eth_bond_slave_add(uint8_t bonded_port_id, uint8_t slave_port_id) slave_config_store(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 */ @@ -312,6 +318,10 @@ rte_eth_bond_slave_add(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 */ @@ -327,6 +337,8 @@ rte_eth_bond_slave_add(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++; @@ -449,6 +461,10 @@ rte_eth_bond_slave_remove(uint8_t bonded_port_id, uint8_t slave_port_id) 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; err_del: diff --git a/lib/librte_pmd_bond/rte_eth_bond_pmd.c b/lib/librte_pmd_bond/rte_eth_bond_pmd.c index 147028b..4653184 100644 --- a/lib/librte_pmd_bond/rte_eth_bond_pmd.c +++ b/lib/librte_pmd_bond/rte_eth_bond_pmd.c @@ -721,6 +721,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; @@ -731,6 +733,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 1db6e4d..495726d 100644 --- a/lib/librte_pmd_bond/rte_eth_bond_private.h +++ b/lib/librte_pmd_bond/rte_eth_bond_private.h @@ -121,6 +121,8 @@ struct bond_dev_private { uint8_t active_slaves[RTE_MAX_ETHPORTS]; /**< Active slave list */ uint8_t slaves[RTE_MAX_ETHPORTS]; /**< Slave list */ + uint32_t rx_offload_capa; /** Bond device Rx offload capability */ + uint32_t tx_offload_capa; /** Bond device Tx offload capability */ /** Persisted configuration of slaves */ struct slave_conf presisted_slaves_conf[RTE_MAX_ETHPORTS]; -- 1.9.1