From patchwork Wed Oct 2 23:25:49 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajit Khaparde X-Patchwork-Id: 60468 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 3AE451BFB2; Thu, 3 Oct 2019 01:26:23 +0200 (CEST) Received: from rnd-relay.smtp.broadcom.com (unknown [192.19.229.170]) by dpdk.org (Postfix) with ESMTP id 44CC11BF89 for ; Thu, 3 Oct 2019 01:26:10 +0200 (CEST) Received: from mail-irv-17.broadcom.com (mail-irv-17.lvn.broadcom.net [10.75.242.48]) by rnd-relay.smtp.broadcom.com (Postfix) with ESMTP id BADCB30C286; Wed, 2 Oct 2019 16:24:55 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.10.3 rnd-relay.smtp.broadcom.com BADCB30C286 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1570058695; bh=IPnQnZCOksggu0qbkPsXi1mxmf0qxK6249Z1w1+psLo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HNDqWm/F9o6zZiS9TJb8BzA7QD4ch8TiEpZmLh3D6bojmjYWpLv4tSPKP11eaxrGi YkKd9c2RBLk5ZLANagxklGyV5x5PCgGDfUTVv+bzZKxke61VD8X/NLmln6Q3pHV8OV zJB+mAo9U9sAWbQXgDIOjgrQQJllBlRdU9ueiLCc= Received: from localhost.localdomain (unknown [10.230.30.225]) by mail-irv-17.broadcom.com (Postfix) with ESMTP id 0AC4E140069; Wed, 2 Oct 2019 16:26:08 -0700 (PDT) From: Ajit Khaparde To: dev@dpdk.org Cc: ferruh.yigit@intel.com, Rahul Gupta , Venkat Duvvuru Date: Wed, 2 Oct 2019 16:25:49 -0700 Message-Id: <20191002232601.22715-9-ajit.khaparde@broadcom.com> X-Mailer: git-send-email 2.20.1 (Apple Git-117) In-Reply-To: <20191002232601.22715-1-ajit.khaparde@broadcom.com> References: <20191002232601.22715-1-ajit.khaparde@broadcom.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 08/20] net/bnxt: cleanup vnic after flow validate 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" When an application issues flow validate, we free the temporary filter that is created. But the vnic is not freed up. This can potentially interfere with subsequent flow creation. So free the vnic. Reviewed-by: Rahul Gupta Reviewed-by: Venkat Duvvuru Signed-off-by: Ajit Khaparde --- drivers/net/bnxt/bnxt_flow.c | 76 +++++++++++++++++++++--------------- drivers/net/bnxt/bnxt_hwrm.c | 41 ++++++++++++------- drivers/net/bnxt/bnxt_hwrm.h | 3 +- 3 files changed, 73 insertions(+), 47 deletions(-) diff --git a/drivers/net/bnxt/bnxt_flow.c b/drivers/net/bnxt/bnxt_flow.c index d092a76e99..aedbd6d13b 100644 --- a/drivers/net/bnxt/bnxt_flow.c +++ b/drivers/net/bnxt/bnxt_flow.c @@ -1355,6 +1355,25 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev, return rc; } +static +struct bnxt_vnic_info *find_matching_vnic(struct bnxt *bp, + struct bnxt_filter_info *filter) +{ + struct bnxt_vnic_info *vnic = NULL; + unsigned int i; + + for (i = 0; i < bp->max_vnics; i++) { + vnic = &bp->vnic_info[i]; + if (vnic->fw_vnic_id != INVALID_VNIC_ID && + filter->dst_id == vnic->fw_vnic_id) { + PMD_DRV_LOG(DEBUG, "Found matching VNIC Id %d\n", + vnic->ff_pool_idx); + return vnic; + } + } + return NULL; +} + static int bnxt_flow_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr, @@ -1363,6 +1382,7 @@ bnxt_flow_validate(struct rte_eth_dev *dev, struct rte_flow_error *error) { struct bnxt *bp = dev->data->dev_private; + struct bnxt_vnic_info *vnic = NULL; struct bnxt_filter_info *filter; int ret = 0; @@ -1378,6 +1398,26 @@ bnxt_flow_validate(struct rte_eth_dev *dev, ret = bnxt_validate_and_parse_flow(dev, pattern, actions, attr, error, filter); + + vnic = find_matching_vnic(bp, filter); + if (vnic) { + if (STAILQ_EMPTY(&vnic->filter)) { + rte_free(vnic->fw_grp_ids); + bnxt_hwrm_vnic_ctx_free(bp, vnic); + bnxt_hwrm_vnic_free(bp, vnic); + vnic->rx_queue_cnt = 0; + bp->nr_vnics--; + PMD_DRV_LOG(DEBUG, "Free VNIC\n"); + } + } + + if (filter->filter_type == HWRM_CFA_EM_FILTER) + bnxt_hwrm_clear_em_filter(bp, filter); + else if (filter->filter_type == HWRM_CFA_NTUPLE_FILTER) + bnxt_hwrm_clear_ntuple_filter(bp, filter); + else + bnxt_hwrm_clear_l2_filter(bp, filter); + /* No need to hold on to this filter if we are just validating flow */ filter->fw_l2_filter_id = UINT64_MAX; bnxt_free_filter(bp, filter); @@ -1414,7 +1454,7 @@ bnxt_match_filter(struct bnxt *bp, struct bnxt_filter_info *nf) struct rte_flow *flow; int i; - for (i = bp->max_vnics; i >= 0; i--) { + for (i = bp->max_vnics - 1; i >= 0; i--) { struct bnxt_vnic_info *vnic = &bp->vnic_info[i]; if (vnic->fw_vnic_id == INVALID_VNIC_ID) @@ -1484,7 +1524,6 @@ bnxt_flow_create(struct rte_eth_dev *dev, struct bnxt_filter_info *filter; bool update_flow = false; struct rte_flow *flow; - unsigned int i; int ret = 0; uint32_t tun_type; @@ -1585,15 +1624,7 @@ bnxt_flow_create(struct rte_eth_dev *dev, ret = bnxt_hwrm_set_ntuple_filter(bp, filter->dst_id, filter); } - for (i = 0; i < bp->max_vnics; i++) { - vnic = &bp->vnic_info[i]; - if (vnic->fw_vnic_id != INVALID_VNIC_ID && - filter->dst_id == vnic->fw_vnic_id) { - PMD_DRV_LOG(ERR, "Found matching VNIC Id %d\n", - vnic->ff_pool_idx); - break; - } - } + vnic = find_matching_vnic(bp, filter); done: if (!ret || update_flow) { flow->filter = filter; @@ -1734,26 +1765,9 @@ bnxt_flow_destroy(struct rte_eth_dev *dev, */ if (vnic && STAILQ_EMPTY(&vnic->flow_list)) { rte_free(vnic->fw_grp_ids); - if (vnic->rx_queue_cnt > 1) { - if (BNXT_CHIP_THOR(bp)) { - int j; - - for (j = 0; j < vnic->num_lb_ctxts; - j++) { - bnxt_hwrm_vnic_ctx_free(bp, - vnic, - vnic->fw_grp_ids[j]); - vnic->fw_grp_ids[j] = - INVALID_HW_RING_ID; - } - vnic->num_lb_ctxts = 0; - } else { - bnxt_hwrm_vnic_ctx_free(bp, - vnic, - vnic->rss_rule); - vnic->rss_rule = INVALID_HW_RING_ID; - } - } + if (vnic->rx_queue_cnt > 1) + bnxt_hwrm_vnic_ctx_free(bp, vnic); + bnxt_hwrm_vnic_free(bp, vnic); vnic->rx_queue_cnt = 0; bp->nr_vnics--; diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c index 5cb394994e..89697b83ac 100644 --- a/drivers/net/bnxt/bnxt_hwrm.c +++ b/drivers/net/bnxt/bnxt_hwrm.c @@ -1776,8 +1776,9 @@ int bnxt_hwrm_vnic_ctx_alloc(struct bnxt *bp, return rc; } -int bnxt_hwrm_vnic_ctx_free(struct bnxt *bp, - struct bnxt_vnic_info *vnic, uint16_t ctx_idx) +static +int _bnxt_hwrm_vnic_ctx_free(struct bnxt *bp, + struct bnxt_vnic_info *vnic, uint16_t ctx_idx) { int rc = 0; struct hwrm_vnic_rss_cos_lb_ctx_free_input req = {.req_type = 0 }; @@ -1800,6 +1801,28 @@ int bnxt_hwrm_vnic_ctx_free(struct bnxt *bp, return rc; } +int bnxt_hwrm_vnic_ctx_free(struct bnxt *bp, struct bnxt_vnic_info *vnic) +{ + int rc = 0; + + if (BNXT_CHIP_THOR(bp)) { + int j; + + for (j = 0; j < vnic->num_lb_ctxts; j++) { + rc = _bnxt_hwrm_vnic_ctx_free(bp, + vnic, + vnic->fw_grp_ids[j]); + vnic->fw_grp_ids[j] = INVALID_HW_RING_ID; + } + vnic->num_lb_ctxts = 0; + } else { + rc = _bnxt_hwrm_vnic_ctx_free(bp, vnic, vnic->rss_rule); + vnic->rss_rule = INVALID_HW_RING_ID; + } + + return rc; +} + int bnxt_hwrm_vnic_free(struct bnxt *bp, struct bnxt_vnic_info *vnic) { int rc = 0; @@ -2416,7 +2439,7 @@ void bnxt_free_tunnel_ports(struct bnxt *bp) void bnxt_free_all_hwrm_resources(struct bnxt *bp) { - int i, j; + int i; if (bp->vnic_info == NULL) return; @@ -2436,17 +2459,7 @@ void bnxt_free_all_hwrm_resources(struct bnxt *bp) bnxt_clear_hwrm_vnic_filters(bp, vnic); - if (BNXT_CHIP_THOR(bp)) { - for (j = 0; j < vnic->num_lb_ctxts; j++) { - bnxt_hwrm_vnic_ctx_free(bp, vnic, - vnic->fw_grp_ids[j]); - vnic->fw_grp_ids[j] = INVALID_HW_RING_ID; - } - vnic->num_lb_ctxts = 0; - } else { - bnxt_hwrm_vnic_ctx_free(bp, vnic, vnic->rss_rule); - vnic->rss_rule = INVALID_HW_RING_ID; - } + bnxt_hwrm_vnic_ctx_free(bp, vnic); bnxt_hwrm_vnic_tpa_cfg(bp, vnic, false); diff --git a/drivers/net/bnxt/bnxt_hwrm.h b/drivers/net/bnxt/bnxt_hwrm.h index 3a49c493db..07181d4020 100644 --- a/drivers/net/bnxt/bnxt_hwrm.h +++ b/drivers/net/bnxt/bnxt_hwrm.h @@ -112,8 +112,7 @@ int bnxt_hwrm_vnic_qcfg(struct bnxt *bp, struct bnxt_vnic_info *vnic, int16_t fw_vf_id); int bnxt_hwrm_vnic_ctx_alloc(struct bnxt *bp, struct bnxt_vnic_info *vnic, uint16_t ctx_idx); -int bnxt_hwrm_vnic_ctx_free(struct bnxt *bp, struct bnxt_vnic_info *vnic, - uint16_t ctx_idx); +int bnxt_hwrm_vnic_ctx_free(struct bnxt *bp, struct bnxt_vnic_info *vnic); int bnxt_hwrm_vnic_free(struct bnxt *bp, struct bnxt_vnic_info *vnic); int bnxt_hwrm_vnic_rss_cfg(struct bnxt *bp, struct bnxt_vnic_info *vnic);