From patchwork Thu Nov 27 21:23:37 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Doherty, Declan" X-Patchwork-Id: 1679 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 46B182E81; Thu, 27 Nov 2014 22:24:01 +0100 (CET) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id C1D34231C for ; Thu, 27 Nov 2014 22:23:58 +0100 (CET) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga102.fm.intel.com with ESMTP; 27 Nov 2014 13:23:57 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.97,862,1389772800"; d="scan'208";a="422430195" Received: from irvmail001.ir.intel.com ([163.33.26.43]) by FMSMGA003.fm.intel.com with ESMTP; 27 Nov 2014 13:14:02 -0800 Received: from sivswdev02.ir.intel.com (sivswdev02.ir.intel.com [10.237.217.46]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id sARLNtBW029002; Thu, 27 Nov 2014 21:23:55 GMT Received: from sivswdev02.ir.intel.com (localhost [127.0.0.1]) by sivswdev02.ir.intel.com with ESMTP id sARLNtxh026722; Thu, 27 Nov 2014 21:23:55 GMT Received: (from dwdohert@localhost) by sivswdev02.ir.intel.com with id sARLNrX6026718; Thu, 27 Nov 2014 21:23:53 GMT From: Declan Doherty To: dev@dpdk.org Date: Thu, 27 Nov 2014 21:23:37 +0000 Message-Id: <1417123417-26444-1-git-send-email-declan.doherty@intel.com> X-Mailer: git-send-email 1.7.12.2 In-Reply-To: <1415381738-43417-1-git-send-email-jyu@vmware.com> References: <1415381738-43417-1-git-send-email-jyu@vmware.com> Subject: [dpdk-dev] [PATCH v2] 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" v2: rebased to HEAD From: Jia Yu 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 Signed-off-by: Declan Doherty --- 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; };