From patchwork Tue Dec 17 04:17:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Somnath Kotur X-Patchwork-Id: 63945 X-Patchwork-Delegate: ajit.khaparde@broadcom.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id DA25BA04F0; Tue, 17 Dec 2019 05:18:38 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 5EDE334EF; Tue, 17 Dec 2019 05:18:34 +0100 (CET) Received: from relay.smtp.broadcom.com (unknown [192.19.232.149]) by dpdk.org (Postfix) with ESMTP id A8D08235 for ; Tue, 17 Dec 2019 05:18:28 +0100 (CET) Received: from dhcp-10-123-153-55.dhcp.broadcom.net (bgccx-dev-host-lnx35.bec.broadcom.net [10.123.153.55]) by relay.smtp.broadcom.com (Postfix) with ESMTP id 4F0251BE6AA; Mon, 16 Dec 2019 20:18:27 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.10.3 relay.smtp.broadcom.com 4F0251BE6AA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1576556308; bh=MCqbCGspqvtzLA9X+Ucj2f06cYIVzJzpjGBHJtaEv9Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=b7oO+64w85YfBCyFtzheaOzQtNPIHe2ih2VQzKNFDCS4lzVfaahrjHbx9S/0cIOKo Q7GK6unjfcrsQ19SM7M+zsaADQDbJSJ0rP4KbaQd3VIsf7+3rnzPwFVzz96w5ERR8e aDd1A1V6VyOxt+iGqmbxIHOa8EIiRUmAGgE/RBik= From: Somnath Kotur To: dev@dpdk.org Cc: ferruh.yigit@intel.com Date: Tue, 17 Dec 2019 09:47:50 +0530 Message-Id: <20191217041755.29232-2-somnath.kotur@broadcom.com> X-Mailer: git-send-email 2.10.1.613.g2cc2e70 In-Reply-To: <20191217041755.29232-1-somnath.kotur@broadcom.com> References: <20191217041755.29232-1-somnath.kotur@broadcom.com> Subject: [dpdk-dev] [PATCH 1/6] net/bnxt: fix link failure during port toggle by increasing link wait time X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Santoshkumar Karanappa Rastapur We need to wait for up to 500ms to receive async event notification after forcing link down. Similarly we need to wait for up to 10s for link to come up after configuring the hardware for link up. Signed-off-by: Santoshkumar Karanappa Rastapur Reviewed-by: Somnath Kotur Signed-off-by: Somnath Kotur --- drivers/net/bnxt/bnxt.h | 10 ++++++---- drivers/net/bnxt/bnxt_cpr.c | 2 +- drivers/net/bnxt/bnxt_ethdev.c | 18 +++++++++++++----- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h index bd8f660..257994d 100644 --- a/drivers/net/bnxt/bnxt.h +++ b/drivers/net/bnxt/bnxt.h @@ -231,9 +231,10 @@ struct bnxt_pf_info { uint8_t evb_mode; }; -/* Max wait time is 10 * 100ms = 1s */ -#define BNXT_LINK_WAIT_CNT 10 -#define BNXT_LINK_WAIT_INTERVAL 100 +/* Max wait time for link up is 10s and link down is 500ms */ +#define BNXT_LINK_UP_WAIT_CNT 200 +#define BNXT_LINK_DOWN_WAIT_CNT 10 +#define BNXT_LINK_WAIT_INTERVAL 50 struct bnxt_link_info { uint32_t phy_flags; uint8_t mac_type; @@ -657,7 +658,8 @@ struct bnxt { }; int bnxt_mtu_set_op(struct rte_eth_dev *eth_dev, uint16_t new_mtu); -int bnxt_link_update_op(struct rte_eth_dev *eth_dev, int wait_to_complete); +int bnxt_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete, + bool exp_link_status); int bnxt_rcv_msg_from_vf(struct bnxt *bp, uint16_t vf_id, void *msg); int is_bnxt_in_error(struct bnxt *bp); uint16_t bnxt_rss_ctxts(const struct bnxt *bp); diff --git a/drivers/net/bnxt/bnxt_cpr.c b/drivers/net/bnxt/bnxt_cpr.c index 2c3129f..bb316b9 100644 --- a/drivers/net/bnxt/bnxt_cpr.c +++ b/drivers/net/bnxt/bnxt_cpr.c @@ -63,7 +63,7 @@ void bnxt_handle_async_event(struct bnxt *bp, case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CHANGE: case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE: /* FALLTHROUGH */ - bnxt_link_update_op(bp->eth_dev, 0); + bnxt_link_update(bp->eth_dev, 0, ETH_LINK_UP); break; case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PF_DRVR_UNLOAD: PMD_DRV_LOG(INFO, "Async event: PF driver unloaded\n"); diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 64f88e9..36905c2 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -859,7 +859,7 @@ static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev) eth_dev->data->scattered_rx = bnxt_scattered_rx(eth_dev); - bnxt_link_update_op(eth_dev, 1); + bnxt_link_update(eth_dev, 1, ETH_LINK_UP); if (rx_offloads & DEV_RX_OFFLOAD_VLAN_FILTER) vlan_mask |= ETH_VLAN_FILTER_MASK; @@ -943,7 +943,7 @@ static void bnxt_dev_stop_op(struct rte_eth_dev *eth_dev) * During reset recovery, there is no need to wait */ if (!is_bnxt_in_error(bp)) - rte_delay_ms(BNXT_LINK_WAIT_INTERVAL * 2); + bnxt_link_update(eth_dev, 1, ETH_LINK_DOWN); /* Clean queue intr-vector mapping */ rte_intr_efd_disable(intr_handle); @@ -1094,12 +1094,14 @@ static int bnxt_mac_addr_add_op(struct rte_eth_dev *eth_dev, return rc; } -int bnxt_link_update_op(struct rte_eth_dev *eth_dev, int wait_to_complete) +int bnxt_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete, + bool exp_link_status) { int rc = 0; struct bnxt *bp = eth_dev->data->dev_private; struct rte_eth_link new; - unsigned int cnt = BNXT_LINK_WAIT_CNT; + int cnt = exp_link_status ? BNXT_LINK_UP_WAIT_CNT : + BNXT_LINK_DOWN_WAIT_CNT; rc = is_bnxt_in_error(bp); if (rc) @@ -1117,7 +1119,7 @@ int bnxt_link_update_op(struct rte_eth_dev *eth_dev, int wait_to_complete) goto out; } - if (!wait_to_complete || new.link_status) + if (!wait_to_complete || new.link_status == exp_link_status) break; rte_delay_ms(BNXT_LINK_WAIT_INTERVAL); @@ -1139,6 +1141,12 @@ int bnxt_link_update_op(struct rte_eth_dev *eth_dev, int wait_to_complete) return rc; } +static int bnxt_link_update_op(struct rte_eth_dev *eth_dev, + int wait_to_complete) +{ + return bnxt_link_update(eth_dev, wait_to_complete, ETH_LINK_UP); +} + static int bnxt_promiscuous_enable_op(struct rte_eth_dev *eth_dev) { struct bnxt *bp = eth_dev->data->dev_private; From patchwork Tue Dec 17 04:17:51 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Somnath Kotur X-Patchwork-Id: 63946 X-Patchwork-Delegate: ajit.khaparde@broadcom.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id B504DA04F0; Tue, 17 Dec 2019 05:18:46 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 0F48C37B0; Tue, 17 Dec 2019 05:18:36 +0100 (CET) Received: from relay.smtp.broadcom.com (unknown [192.19.232.149]) by dpdk.org (Postfix) with ESMTP id 14FCD2BF9 for ; Tue, 17 Dec 2019 05:18:30 +0100 (CET) Received: from dhcp-10-123-153-55.dhcp.broadcom.net (bgccx-dev-host-lnx35.bec.broadcom.net [10.123.153.55]) by relay.smtp.broadcom.com (Postfix) with ESMTP id A96441BE6C1; Mon, 16 Dec 2019 20:18:28 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.10.3 relay.smtp.broadcom.com A96441BE6C1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1576556309; bh=EGqznrm4mDq4MxIA4h9Fo3/5KVc1JBilcBJeFZxTrNc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HPCSveO5gsfmSp1DxmbemFrLD+eXdiegEsX9G5793/sQIVm9ds9W+9yrY7lY9AIs8 FvyJzbnpZVNca6ms1/jgvCRCh6gtOES+0s6NqclRB9dAbKwQ9i9C6JfiwG5ZZQTDn0 1rKLX5cnBnLMdLKfR0kVl7BKnSBtMIi+EV7pOtU8= From: Somnath Kotur To: dev@dpdk.org Cc: ferruh.yigit@intel.com Date: Tue, 17 Dec 2019 09:47:51 +0530 Message-Id: <20191217041755.29232-3-somnath.kotur@broadcom.com> X-Mailer: git-send-email 2.10.1.613.g2cc2e70 In-Reply-To: <20191217041755.29232-1-somnath.kotur@broadcom.com> References: <20191217041755.29232-1-somnath.kotur@broadcom.com> Subject: [dpdk-dev] [PATCH 2/6] net/bnxt: fix to use first valid profile if lossy profile not found X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" In the case when CoS classification is disabled, driver was iterating looking for only lossy profiles as that is what is expected to be used for regular NIC operations. But in certain custom profiles, there were no lossy profiles configured, only lossless profiles instead. To handle such cases, it is better to fallback to using the first valid profile. Fixes: 698aa7e95 ("net/bnxt: add code to determine the Tx COS queue") Signed-off-by: Somnath Kotur Reviewed-by: Ajit Kumar Khaparde --- drivers/net/bnxt/bnxt_hwrm.c | 44 ++++++++++++++++++++++++++++++++++++-------- drivers/net/bnxt/bnxt_hwrm.h | 3 +++ 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c index 64dc78a..694d2d0 100644 --- a/drivers/net/bnxt/bnxt_hwrm.c +++ b/drivers/net/bnxt/bnxt_hwrm.c @@ -1211,6 +1211,35 @@ static int bnxt_hwrm_port_phy_qcfg(struct bnxt *bp, return rc; } +static bool bnxt_find_lossy_profile(struct bnxt *bp) +{ + int i = 0; + + for (i = BNXT_COS_QUEUE_COUNT - 1; i >= 0; i--) { + if (bp->tx_cos_queue[i].profile == + HWRM_QUEUE_SERVICE_PROFILE_LOSSY) { + bp->tx_cosq_id[0] = bp->tx_cos_queue[i].id; + return true; + } + } + return false; +} + +static void bnxt_find_first_valid_profile(struct bnxt *bp) +{ + int i = 0; + + for (i = BNXT_COS_QUEUE_COUNT - 1; i >= 0; i--) { + if (bp->tx_cos_queue[i].profile != + HWRM_QUEUE_SERVICE_PROFILE_UNKNOWN && + bp->tx_cos_queue[i].id != + HWRM_QUEUE_SERVICE_PROFILE_UNKNOWN) { + bp->tx_cosq_id[0] = bp->tx_cos_queue[i].id; + break; + } + } +} + int bnxt_hwrm_queue_qportcfg(struct bnxt *bp) { int rc = 0; @@ -1270,14 +1299,13 @@ int bnxt_hwrm_queue_qportcfg(struct bnxt *bp) bp->tx_cos_queue[i].id; } } else { - for (i = BNXT_COS_QUEUE_COUNT - 1; i >= 0; i--) { - if (bp->tx_cos_queue[i].profile == - HWRM_QUEUE_SERVICE_PROFILE_LOSSY) { - bp->tx_cosq_id[0] = - bp->tx_cos_queue[i].id; - break; - } - } + /* When CoS classification is disabled, for normal NIC + * operations, ideally we should look to use LOSSY. + * If not found, fallback to the first valid profile + */ + if (!bnxt_find_lossy_profile(bp)) + bnxt_find_first_valid_profile(bp); + } } diff --git a/drivers/net/bnxt/bnxt_hwrm.h b/drivers/net/bnxt/bnxt_hwrm.h index abe5de9..d8d1360 100644 --- a/drivers/net/bnxt/bnxt_hwrm.h +++ b/drivers/net/bnxt/bnxt_hwrm.h @@ -35,6 +35,9 @@ #define HWRM_QUEUE_SERVICE_PROFILE_LOSSY \ HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID0_SERVICE_PROFILE_LOSSY +#define HWRM_QUEUE_SERVICE_PROFILE_UNKNOWN \ + HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_ID0_SERVICE_PROFILE_UNKNOWN + #define HWRM_FUNC_RESOURCE_QCAPS_OUTPUT_VF_RESV_STRATEGY_MINIMAL_STATIC \ HWRM_FUNC_RESOURCE_QCAPS_OUTPUT_VF_RESERVATION_STRATEGY_MINIMAL_STATIC #define HWRM_FUNC_RESOURCE_QCAPS_OUTPUT_VF_RESV_STRATEGY_MAXIMAL \ From patchwork Tue Dec 17 04:17:52 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Somnath Kotur X-Patchwork-Id: 63947 X-Patchwork-Delegate: ajit.khaparde@broadcom.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 76738A04F0; Tue, 17 Dec 2019 05:18:57 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id AB0AA1BE9D; Tue, 17 Dec 2019 05:18:37 +0100 (CET) Received: from relay.smtp.broadcom.com (relay.smtp.broadcom.com [192.19.232.149]) by dpdk.org (Postfix) with ESMTP id 574D42C19 for ; Tue, 17 Dec 2019 05:18:31 +0100 (CET) Received: from dhcp-10-123-153-55.dhcp.broadcom.net (bgccx-dev-host-lnx35.bec.broadcom.net [10.123.153.55]) by relay.smtp.broadcom.com (Postfix) with ESMTP id 0FEDD1BE6C5; Mon, 16 Dec 2019 20:18:29 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.10.3 relay.smtp.broadcom.com 0FEDD1BE6C5 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1576556310; bh=V9yr6rfCMMx5ok3S7nxnQrEAePQ+b4ZsA9q/T6TLmkQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Mv1YC4LTNvm/hCsrtbOBSymrHrhKzRaxGIzo/UjtK1sLOl1LYZSulJPjXl4pgp9WL rxhedJ/Dfxiwy5gYAyEX0F5wJzlwqAA0FDCUtsyASWz+koRccZR96iW11o0OJby+d/ jdWPqJ9hVM6OgEe8RpxYCrWQdVvjmvzuvnNXA+XI= From: Somnath Kotur To: dev@dpdk.org Cc: ferruh.yigit@intel.com Date: Tue, 17 Dec 2019 09:47:52 +0530 Message-Id: <20191217041755.29232-4-somnath.kotur@broadcom.com> X-Mailer: git-send-email 2.10.1.613.g2cc2e70 In-Reply-To: <20191217041755.29232-1-somnath.kotur@broadcom.com> References: <20191217041755.29232-1-somnath.kotur@broadcom.com> Subject: [dpdk-dev] [PATCH 3/6] net/bnxt: fix flow flush to sync with flow destroy routine X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Sync flow flush routine with flow destroy so that the operations performed per flow during a flush are the same as that are done for an individual flow destroy by having a common function to call for both. One of the things that was missed in the flow flush routine was the deletion of the L2 filter that would have been created as part of an n-tuple filter. Also, decrement the l2_ref_cnt for a filter in the case of a filter update as it would've bumped up previously in validate_and_parse_flow() Fixes: a0800839 ("net/bnxt: handle flow flush handling") Signed-off-by: Somnath Kotur Reviewed-by: Santoshkumar Karanappa Rastapur --- drivers/net/bnxt/bnxt_flow.c | 132 +++++++++++++++---------------------------- 1 file changed, 46 insertions(+), 86 deletions(-) diff --git a/drivers/net/bnxt/bnxt_flow.c b/drivers/net/bnxt/bnxt_flow.c index 4381cd7..59e55c3 100644 --- a/drivers/net/bnxt/bnxt_flow.c +++ b/drivers/net/bnxt/bnxt_flow.c @@ -1537,10 +1537,13 @@ struct bnxt_vnic_info *find_matching_vnic(struct bnxt *bp, * filter which points to the new destination queue and so we clear * the previous L2 filter. For ntuple filters, we are going to reuse * the old L2 filter and create new NTUPLE filter with this new - * destination queue subsequently during bnxt_flow_create. + * destination queue subsequently during bnxt_flow_create. So we + * decrement the ref cnt of the L2 filter that would've been bumped + * up previously in bnxt_validate_and_parse_flow as the old n-tuple + * filter that was referencing it will be deleted now. */ + bnxt_hwrm_clear_l2_filter(bp, old_filter); if (new_filter->filter_type == HWRM_CFA_L2_FILTER) { - bnxt_hwrm_clear_l2_filter(bp, old_filter); bnxt_hwrm_set_l2_filter(bp, new_filter->dst_id, new_filter); } else { if (new_filter->filter_type == HWRM_CFA_EM_FILTER) @@ -1828,46 +1831,24 @@ static int bnxt_handle_tunnel_redirect_destroy(struct bnxt *bp, } static int -bnxt_flow_destroy(struct rte_eth_dev *dev, - struct rte_flow *flow, - struct rte_flow_error *error) +_bnxt_flow_destroy(struct bnxt *bp, + struct rte_flow *flow, + struct rte_flow_error *error) { - struct bnxt *bp = dev->data->dev_private; struct bnxt_filter_info *filter; struct bnxt_vnic_info *vnic; int ret = 0; - bnxt_acquire_flow_lock(bp); - if (!flow) { - rte_flow_error_set(error, EINVAL, - RTE_FLOW_ERROR_TYPE_HANDLE, NULL, - "Invalid flow: failed to destroy flow."); - bnxt_release_flow_lock(bp); - return -EINVAL; - } - filter = flow->filter; vnic = flow->vnic; - if (!filter) { - rte_flow_error_set(error, EINVAL, - RTE_FLOW_ERROR_TYPE_HANDLE, NULL, - "Invalid flow: failed to destroy flow."); - bnxt_release_flow_lock(bp); - return -EINVAL; - } - if (filter->filter_type == HWRM_CFA_TUNNEL_REDIRECT_FILTER && filter->enables == filter->tunnel_type) { - ret = bnxt_handle_tunnel_redirect_destroy(bp, - filter, - error); - if (!ret) { + ret = bnxt_handle_tunnel_redirect_destroy(bp, filter, error); + if (!ret) goto done; - } else { - bnxt_release_flow_lock(bp); + else return ret; - } } ret = bnxt_match_filter(bp, filter); @@ -1919,7 +1900,36 @@ static int bnxt_handle_tunnel_redirect_destroy(struct bnxt *bp, "Failed to destroy flow."); } + return ret; +} + +static int +bnxt_flow_destroy(struct rte_eth_dev *dev, + struct rte_flow *flow, + struct rte_flow_error *error) +{ + struct bnxt *bp = dev->data->dev_private; + int ret = 0; + + bnxt_acquire_flow_lock(bp); + if (!flow) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_HANDLE, NULL, + "Invalid flow: failed to destroy flow."); + bnxt_release_flow_lock(bp); + return -EINVAL; + } + + if (!flow->filter) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_HANDLE, NULL, + "Invalid flow: failed to destroy flow."); + bnxt_release_flow_lock(bp); + return -EINVAL; + } + ret = _bnxt_flow_destroy(bp, flow, error); bnxt_release_flow_lock(bp); + return ret; } @@ -1927,7 +1937,6 @@ static int bnxt_handle_tunnel_redirect_destroy(struct bnxt *bp, bnxt_flow_flush(struct rte_eth_dev *dev, struct rte_flow_error *error) { struct bnxt *bp = dev->data->dev_private; - struct bnxt_filter_info *filter = NULL; struct bnxt_vnic_info *vnic; struct rte_flow *flow; unsigned int i; @@ -1941,66 +1950,17 @@ static int bnxt_handle_tunnel_redirect_destroy(struct bnxt *bp, while (!STAILQ_EMPTY(&vnic->flow_list)) { flow = STAILQ_FIRST(&vnic->flow_list); - filter = flow->filter; - - if (filter->filter_type == - HWRM_CFA_TUNNEL_REDIRECT_FILTER && - filter->enables == filter->tunnel_type) { - ret = - bnxt_handle_tunnel_redirect_destroy(bp, - filter, - error); - if (!ret) { - goto done; - } else { - bnxt_release_flow_lock(bp); - return ret; - } - } - - if (filter->filter_type == HWRM_CFA_EM_FILTER) - ret = bnxt_hwrm_clear_em_filter(bp, filter); - if (filter->filter_type == HWRM_CFA_NTUPLE_FILTER) - ret = bnxt_hwrm_clear_ntuple_filter(bp, filter); - else if (i) - ret = bnxt_hwrm_clear_l2_filter(bp, filter); - if (ret) { - rte_flow_error_set - (error, - -ret, - RTE_FLOW_ERROR_TYPE_HANDLE, - NULL, - "Failed to flush flow in HW."); - bnxt_release_flow_lock(bp); - return -rte_errno; - } -done: - STAILQ_REMOVE(&vnic->flow_list, flow, - rte_flow, next); - - STAILQ_REMOVE(&vnic->filter, - filter, - bnxt_filter_info, - next); - bnxt_free_filter(bp, filter); - - rte_free(flow); + if (!flow->filter) + continue; - /* If this was the last flow associated with this vnic, - * switch the queue back to RSS pool. - */ - if (STAILQ_EMPTY(&vnic->flow_list)) { - rte_free(vnic->fw_grp_ids); - if (vnic->rx_queue_cnt > 1) - bnxt_hwrm_vnic_ctx_free(bp, vnic); - bnxt_hwrm_vnic_free(bp, vnic); - vnic->rx_queue_cnt = 0; - } + ret = _bnxt_flow_destroy(bp, flow, error); + if (ret) + break; } } - bnxt_release_flow_lock(bp); + return ret; } From patchwork Tue Dec 17 04:17:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Somnath Kotur X-Patchwork-Id: 63948 X-Patchwork-Delegate: ajit.khaparde@broadcom.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 0036FA04F0; Tue, 17 Dec 2019 05:19:03 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 606471BEDE; Tue, 17 Dec 2019 05:18:39 +0100 (CET) Received: from relay.smtp.broadcom.com (relay.smtp.broadcom.com [192.19.232.149]) by dpdk.org (Postfix) with ESMTP id B07862C19 for ; Tue, 17 Dec 2019 05:18:32 +0100 (CET) Received: from dhcp-10-123-153-55.dhcp.broadcom.net (bgccx-dev-host-lnx35.bec.broadcom.net [10.123.153.55]) by relay.smtp.broadcom.com (Postfix) with ESMTP id 6A3011BE6C8; Mon, 16 Dec 2019 20:18:31 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.10.3 relay.smtp.broadcom.com 6A3011BE6C8 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1576556312; bh=Rg4MD8dOyOqxcxP/d/WChBId/z7lLa3tECwR9114VOk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dCZLYIJGnqHsygABBnO9Q7CfzDe7z4W2fnxu6VWY6ibN8QlkEKkx8Ylhldp1FvPSg N0+jA/G92qC99I3bJdVsig1bmYbSs1jZbOudxIkytTjpEr+JdeYMcTmReiZtndq/mP AZXSTBhbfmgLzyfqP7ERkbMozSGqdT6tya9tiooM= From: Somnath Kotur To: dev@dpdk.org Cc: ferruh.yigit@intel.com Date: Tue, 17 Dec 2019 09:47:53 +0530 Message-Id: <20191217041755.29232-5-somnath.kotur@broadcom.com> X-Mailer: git-send-email 2.10.1.613.g2cc2e70 In-Reply-To: <20191217041755.29232-1-somnath.kotur@broadcom.com> References: <20191217041755.29232-1-somnath.kotur@broadcom.com> Subject: [dpdk-dev] [PATCH 4/6] net/bnxt: fix non matching flow hitting filter rule X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Santoshkumar Karanappa Rastapur As part of ntuple filter, we were creating L2 filter with the ntuple redirect queue resulting in any L2 matching flow getting steered to this queue. For ntuple filters, we need to create the L2 filter with default queue. The user specified redirect queue will be set while creating the ntuple filter in hardware. Signed-off-by: Santoshkumar Karanappa Rastapur Reviewed-by: Somnath Kotur Signed-off-by: Somnath Kotur --- drivers/net/bnxt/bnxt_flow.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/net/bnxt/bnxt_flow.c b/drivers/net/bnxt/bnxt_flow.c index 59e55c3..f926f9b 100644 --- a/drivers/net/bnxt/bnxt_flow.c +++ b/drivers/net/bnxt/bnxt_flow.c @@ -1128,7 +1128,16 @@ static int match_vnic_rss_cfg(struct bnxt *bp, PMD_DRV_LOG(DEBUG, "Setting vnic ff_idx %d\n", vnic->ff_pool_idx); filter->dst_id = vnic->fw_vnic_id; - filter1 = bnxt_get_l2_filter(bp, filter, vnic); + + /* For ntuple filter, create the L2 filter with default VNIC. + * The user specified redirect queue will be set while creating + * the ntuple filter in hardware. + */ + vnic0 = BNXT_GET_DEFAULT_VNIC(bp); + if (use_ntuple) + filter1 = bnxt_get_l2_filter(bp, filter, vnic0); + else + filter1 = bnxt_get_l2_filter(bp, filter, vnic); if (filter1 == NULL) { rte_flow_error_set(error, ENOSPC, From patchwork Tue Dec 17 04:17:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Somnath Kotur X-Patchwork-Id: 63949 X-Patchwork-Delegate: ajit.khaparde@broadcom.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 16E6CA04F0; Tue, 17 Dec 2019 05:19:16 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 453151BF75; Tue, 17 Dec 2019 05:18:41 +0100 (CET) Received: from relay.smtp.broadcom.com (unknown [192.19.232.149]) by dpdk.org (Postfix) with ESMTP id 167522C52 for ; Tue, 17 Dec 2019 05:18:34 +0100 (CET) Received: from dhcp-10-123-153-55.dhcp.broadcom.net (bgccx-dev-host-lnx35.bec.broadcom.net [10.123.153.55]) by relay.smtp.broadcom.com (Postfix) with ESMTP id C5DA11BE6CA; Mon, 16 Dec 2019 20:18:32 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.10.3 relay.smtp.broadcom.com C5DA11BE6CA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1576556313; bh=922oDffj0VTmsD5bbKBG3BpkbvTOsTvKTlJ5iHz0g9c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uokjdvBnvhh+LW4arRSdD5CjccSM1qvj2Sc2ft5fm1C7ZSO1XvnOiEcbKs+EDivrc 4Oh3NfzRjcB4FWMO4p2Hffr9Iv6u/KCVS09152fcKdwLuhZaoHc1LT0/GdVAA+Gpst jOsC3be7Cc7nlNVZ7+/Vwpx2/idxhFhYu7VyltRY= From: Somnath Kotur To: dev@dpdk.org Cc: ferruh.yigit@intel.com Date: Tue, 17 Dec 2019 09:47:54 +0530 Message-Id: <20191217041755.29232-6-somnath.kotur@broadcom.com> X-Mailer: git-send-email 2.10.1.613.g2cc2e70 In-Reply-To: <20191217041755.29232-1-somnath.kotur@broadcom.com> References: <20191217041755.29232-1-somnath.kotur@broadcom.com> Subject: [dpdk-dev] [PATCH 5/6] net/bnxt: fix to keep the L2 filter intact so it can be reused X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" The software L2 filter was being released back to the free pool, after it was created in HW and the filter corresponding to an actual 'flow' would have reference to the HW L2 filter. But if this 'flow were to be deleted, then this HW L2 filter also would be gone. Fix this by storing the L2 filter created originally either for an n-tuple flow or otherwise as part of the vnic's filter list. This would require the filter_info struct to have a backptr to the vnic which it came from. Fixes: 0ba82dee ("net/bnxt: fix to check for L2 filters that doesn't have any references") Signed-off-by: Somnath Kotur Reviewed-by: Ajit Kumar Khaparde --- drivers/net/bnxt/bnxt_filter.h | 4 ++++ drivers/net/bnxt/bnxt_flow.c | 20 +++++++++----------- drivers/net/bnxt/bnxt_hwrm.c | 14 +++++++++++++- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/drivers/net/bnxt/bnxt_filter.h b/drivers/net/bnxt/bnxt_filter.h index 8cafa8f..5c96b34 100644 --- a/drivers/net/bnxt/bnxt_filter.h +++ b/drivers/net/bnxt/bnxt_filter.h @@ -80,6 +80,10 @@ struct bnxt_filter_info { uint16_t ethertype; uint32_t priority; uint32_t mark; + /* Backptr to vnic. As of now, used only by an L2 filter + * to remember which vnic it was created on + */ + struct bnxt_vnic_info *vnic; }; struct bnxt_filter_info *bnxt_alloc_filter(struct bnxt *bp); diff --git a/drivers/net/bnxt/bnxt_flow.c b/drivers/net/bnxt/bnxt_flow.c index f926f9b..660760c 100644 --- a/drivers/net/bnxt/bnxt_flow.c +++ b/drivers/net/bnxt/bnxt_flow.c @@ -746,10 +746,9 @@ { struct bnxt_filter_info *mf, *f0; struct bnxt_vnic_info *vnic0; - struct rte_flow *flow; int i; - vnic0 = &bp->vnic_info[0]; + vnic0 = BNXT_GET_DEFAULT_VNIC(bp); f0 = STAILQ_FIRST(&vnic0->filter); /* This flow has same DST MAC as the port/l2 filter. */ @@ -762,8 +761,7 @@ if (vnic->fw_vnic_id == INVALID_VNIC_ID) continue; - STAILQ_FOREACH(flow, &vnic->flow_list, next) { - mf = flow->filter; + STAILQ_FOREACH(mf, &vnic->filter, next) { if (mf->matching_l2_fltr_ptr) continue; @@ -798,6 +796,8 @@ if (filter1 == NULL) return NULL; + memcpy(filter1, nf, sizeof(*filter1)); + filter1->flags = HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_XDP_DISABLE; filter1->flags |= HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_PATH_RX; if (nf->valid_flags & BNXT_FLOW_L2_SRC_VALID_FLAG || @@ -880,11 +880,14 @@ struct bnxt_filter_info * l2_filter = bnxt_find_matching_l2_filter(bp, nf); if (l2_filter) { l2_filter->l2_ref_cnt++; - nf->matching_l2_fltr_ptr = l2_filter; } else { l2_filter = bnxt_create_l2_filter(bp, nf, vnic); - nf->matching_l2_fltr_ptr = NULL; + if (l2_filter) { + STAILQ_INSERT_TAIL(&vnic->filter, l2_filter, next); + l2_filter->vnic = vnic; + } } + nf->matching_l2_fltr_ptr = l2_filter; return l2_filter; } @@ -1437,11 +1440,6 @@ static int match_vnic_rss_cfg(struct bnxt *bp, goto ret; } - if (filter1 && !filter->matching_l2_fltr_ptr) { - bnxt_free_filter(bp, filter1); - filter1->fw_l2_filter_id = -1; - } - done: act = bnxt_flow_non_void_action(++act); while (act->type != RTE_FLOW_ACTION_TYPE_END) diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c index 694d2d0..1b19fba 100644 --- a/drivers/net/bnxt/bnxt_hwrm.c +++ b/drivers/net/bnxt/bnxt_hwrm.c @@ -363,10 +363,11 @@ int bnxt_hwrm_cfa_vlan_antispoof_cfg(struct bnxt *bp, uint16_t fid, } int bnxt_hwrm_clear_l2_filter(struct bnxt *bp, - struct bnxt_filter_info *filter) + struct bnxt_filter_info *filter) { int rc = 0; struct bnxt_filter_info *l2_filter = filter; + struct bnxt_vnic_info *vnic = NULL; struct hwrm_cfa_l2_filter_free_input req = {.req_type = 0 }; struct hwrm_cfa_l2_filter_free_output *resp = bp->hwrm_cmd_resp_addr; @@ -379,6 +380,9 @@ int bnxt_hwrm_clear_l2_filter(struct bnxt *bp, PMD_DRV_LOG(DEBUG, "filter: %p l2_filter: %p ref_cnt: %d\n", filter, l2_filter, l2_filter->l2_ref_cnt); + if (l2_filter->l2_ref_cnt == 0) + return 0; + if (l2_filter->l2_ref_cnt > 0) l2_filter->l2_ref_cnt--; @@ -395,6 +399,14 @@ int bnxt_hwrm_clear_l2_filter(struct bnxt *bp, HWRM_UNLOCK(); filter->fw_l2_filter_id = UINT64_MAX; + if (l2_filter->l2_ref_cnt == 0) { + vnic = l2_filter->vnic; + if (vnic) { + STAILQ_REMOVE(&vnic->filter, l2_filter, + bnxt_filter_info, next); + bnxt_free_filter(bp, l2_filter); + } + } return 0; } From patchwork Tue Dec 17 04:17:55 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Somnath Kotur X-Patchwork-Id: 63950 X-Patchwork-Delegate: ajit.khaparde@broadcom.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 89F4EA04F0; Tue, 17 Dec 2019 05:19:24 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 7A65E1BF7D; Tue, 17 Dec 2019 05:18:42 +0100 (CET) Received: from relay.smtp.broadcom.com (unknown [192.19.232.149]) by dpdk.org (Postfix) with ESMTP id 717A2378E for ; Tue, 17 Dec 2019 05:18:35 +0100 (CET) Received: from dhcp-10-123-153-55.dhcp.broadcom.net (bgccx-dev-host-lnx35.bec.broadcom.net [10.123.153.55]) by relay.smtp.broadcom.com (Postfix) with ESMTP id 2BE4B1BE6D3; Mon, 16 Dec 2019 20:18:33 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.10.3 relay.smtp.broadcom.com 2BE4B1BE6D3 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1576556315; bh=T4fxaGXTZaQ0AoHnodk4QMdkjOwZZ33gBjcc2SmQ+ak=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Se4FIR3Jq4kKx5h2zWjwcvCNlDAirqUbSGGJ0cb3N9Ri0yKIfluHCZKmfPEIqO8zi 0JwfjrCiUd/kfs8wtNnx7b/aU3TXMm8edRYf3SturPU3t4iO01qToEXRJnebr3RvW6 GzpTZbV0+41p4FHLW0WO0bWUGsZQaDZjZ0B2kRsk= From: Somnath Kotur To: dev@dpdk.org Cc: ferruh.yigit@intel.com Date: Tue, 17 Dec 2019 09:47:55 +0530 Message-Id: <20191217041755.29232-7-somnath.kotur@broadcom.com> X-Mailer: git-send-email 2.10.1.613.g2cc2e70 In-Reply-To: <20191217041755.29232-1-somnath.kotur@broadcom.com> References: <20191217041755.29232-1-somnath.kotur@broadcom.com> Subject: [dpdk-dev] [PATCH 6/6] net/bnxt: fix to free l2 filters while clearing vnic flows/filters X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Now that L2 filters can be re-used for an n-tuple filter(s), delete L2 filter as well so the reference count of an L2 filter (if reused) can be decremented appropriately. Fixes: 0ba82dee ("net/bnxt: fix to check for L2 filters that doesn't have any references") Signed-off-by: Somnath Kotur Reviewed-by: Santoshkumar Karanappa Rastapur --- drivers/net/bnxt/bnxt_hwrm.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c index 1b19fba..50272dc 100644 --- a/drivers/net/bnxt/bnxt_hwrm.c +++ b/drivers/net/bnxt/bnxt_hwrm.c @@ -2496,8 +2496,7 @@ int bnxt_clear_hwrm_vnic_filters(struct bnxt *bp, struct bnxt_vnic_info *vnic) rc = bnxt_hwrm_clear_em_filter(bp, filter); else if (filter->filter_type == HWRM_CFA_NTUPLE_FILTER) rc = bnxt_hwrm_clear_ntuple_filter(bp, filter); - else - rc = bnxt_hwrm_clear_l2_filter(bp, filter); + rc = bnxt_hwrm_clear_l2_filter(bp, filter); STAILQ_REMOVE(&vnic->filter, filter, bnxt_filter_info, next); bnxt_free_filter(bp, filter); } @@ -2519,8 +2518,7 @@ int bnxt_clear_hwrm_vnic_filters(struct bnxt *bp, struct bnxt_vnic_info *vnic) rc = bnxt_hwrm_clear_em_filter(bp, filter); else if (filter->filter_type == HWRM_CFA_NTUPLE_FILTER) rc = bnxt_hwrm_clear_ntuple_filter(bp, filter); - else - rc = bnxt_hwrm_clear_l2_filter(bp, filter); + rc = bnxt_hwrm_clear_l2_filter(bp, filter); STAILQ_REMOVE(&vnic->flow_list, flow, rte_flow, next); rte_free(flow);