From patchwork Tue Sep 3 02:18:59 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajit Khaparde X-Patchwork-Id: 58437 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 4EEC51EB4E; Tue, 3 Sep 2019 04:19:38 +0200 (CEST) Received: from rnd-relay.smtp.broadcom.com (rnd-relay.smtp.broadcom.com [192.19.229.170]) by dpdk.org (Postfix) with ESMTP id ED7D11E9CF for ; Tue, 3 Sep 2019 04:19:09 +0200 (CEST) Received: from nis-sj1-27.broadcom.com (nis-sj1-27.lvn.broadcom.net [10.75.144.136]) by rnd-relay.smtp.broadcom.com (Postfix) with ESMTP id BF7A230C200; Mon, 2 Sep 2019 19:19:02 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.10.3 rnd-relay.smtp.broadcom.com BF7A230C200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1567477142; bh=F8pF06fMhOUul4OfZE5CQp0l+FjJ6KnnITzZxwByWDs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AHbZw9fYgi0+ki3V96PAUUJvMTDJJMRfoKswkWtHsVlV0XUTS+v4frE20z0J/0UgM ILp7HcdcvQz1kO4fcpd/HZRuNjpK4fP0r4y1tOaYREDyzcM2k7FlEGche91VcPAd68 vNjAKSmELe21ViGVmu3gRmVK2Ubu+5o4MbKtEJy8= Received: from localhost.localdomain (unknown [10.230.30.225]) by nis-sj1-27.broadcom.com (Postfix) with ESMTP id 259FAAC078E; Mon, 2 Sep 2019 19:19:09 -0700 (PDT) From: Ajit Khaparde To: dev@dpdk.org Cc: ferruh.yigit@intel.com, Rahul Gupta , Venkat Duvvuru , Kalesh Anakkur Purayil Date: Mon, 2 Sep 2019 19:18:59 -0700 Message-Id: <20190903021901.25895-16-ajit.khaparde@broadcom.com> X-Mailer: git-send-email 2.20.1 (Apple Git-117) In-Reply-To: <20190903021901.25895-1-ajit.khaparde@broadcom.com> References: <20190903021901.25895-1-ajit.khaparde@broadcom.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 15/17] net/bnxt: handle cleanup if flow creation fails 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" If flow creation fails because of an HWRM command failure or or some other reason, reset the vnic and rxq info set earlier. Signed-off-by: Ajit Khaparde Reviewed-by: Rahul Gupta Reviewed-by: Venkat Duvvuru Reviewed-by: Kalesh Anakkur Purayil --- drivers/net/bnxt/bnxt_flow.c | 68 ++++++++++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 6 deletions(-) diff --git a/drivers/net/bnxt/bnxt_flow.c b/drivers/net/bnxt/bnxt_flow.c index 9d943cd14..8156b5b4b 100644 --- a/drivers/net/bnxt/bnxt_flow.c +++ b/drivers/net/bnxt/bnxt_flow.c @@ -175,6 +175,14 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp, return -rte_errno; } + if (!item->spec || !item->mask) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, + item, + "spec/mask is NULL"); + return -rte_errno; + } + switch (item->type) { case RTE_FLOW_ITEM_TYPE_ANY: inner = @@ -907,10 +915,10 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev, const struct rte_flow_action *act = bnxt_flow_non_void_action(actions); struct bnxt *bp = dev->data->dev_private; + struct bnxt_vnic_info *vnic = NULL, *vnic0 = NULL; const struct rte_flow_action_queue *act_q; - const struct rte_flow_action_rss *rss; const struct rte_flow_action_vf *act_vf; - struct bnxt_vnic_info *vnic, *vnic0; + const struct rte_flow_action_rss *rss; struct bnxt_filter_info *filter1; struct bnxt_rx_queue *rxq = NULL; int dflt_vnic, vnic_id; @@ -1009,8 +1017,15 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev, PMD_DRV_LOG(DEBUG, "VNIC found\n"); rc = bnxt_vnic_prep(bp, vnic); - if (rc) + if (rc) { + rte_flow_error_set(error, + EINVAL, + RTE_FLOW_ERROR_TYPE_ACTION, + act, + "VNIC prep fail"); + rc = -rte_errno; goto ret; + } PMD_DRV_LOG(DEBUG, "vnic[%d] = %p vnic->fw_grp_ids = %p\n", @@ -1023,7 +1038,12 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev, filter->dst_id = vnic->fw_vnic_id; filter1 = bnxt_get_l2_filter(bp, filter, vnic); if (filter1 == NULL) { - rc = -ENOSPC; + rte_flow_error_set(error, + ENOSPC, + RTE_FLOW_ERROR_TYPE_ACTION, + act, + "Filter not available"); + rc = -rte_errno; goto ret; } @@ -1050,7 +1070,12 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev, vnic0 = &bp->vnic_info[0]; filter1 = bnxt_get_l2_filter(bp, filter, vnic0); if (filter1 == NULL) { - rc = -ENOSPC; + rte_flow_error_set(error, + ENOSPC, + RTE_FLOW_ERROR_TYPE_ACTION, + act, + "New filter not available"); + rc = -rte_errno; goto ret; } @@ -1113,6 +1138,11 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev, vnic0 = &bp->vnic_info[0]; filter1 = bnxt_get_l2_filter(bp, filter, vnic0); if (filter1 == NULL) { + rte_flow_error_set(error, + ENOSPC, + RTE_FLOW_ERROR_TYPE_ACTION, + act, + "New filter not available"); rc = -ENOSPC; goto ret; } @@ -1209,8 +1239,15 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev, vnic->func_default = 0; //This is not a default VNIC. rc = bnxt_vnic_prep(bp, vnic); - if (rc) + if (rc) { + rte_flow_error_set(error, + EINVAL, + RTE_FLOW_ERROR_TYPE_ACTION, + act, + "VNIC prep fail"); + rc = -rte_errno; goto ret; + } PMD_DRV_LOG(DEBUG, "vnic[%d] = %p vnic->fw_grp_ids = %p\n", @@ -1265,6 +1302,11 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev, filter->dst_id = vnic->fw_vnic_id; filter1 = bnxt_get_l2_filter(bp, filter, vnic); if (filter1 == NULL) { + rte_flow_error_set(error, + ENOSPC, + RTE_FLOW_ERROR_TYPE_ACTION, + act, + "New filter not available"); rc = -ENOSPC; goto ret; } @@ -1297,7 +1339,18 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev, rc = -rte_errno; goto ret; } + + return rc; ret: + + //TODO: Cleanup according to ACTION TYPE. + if (rte_errno) { + if (vnic && STAILQ_EMPTY(&vnic->filter)) + vnic->rx_queue_cnt = 0; + + if (rxq && !vnic->rx_queue_cnt) + rxq->vnic = &bp->vnic_info[0]; + } return rc; } @@ -1344,6 +1397,8 @@ bnxt_flow_validate(struct rte_eth_dev *dev, ret = bnxt_validate_and_parse_flow(dev, pattern, actions, attr, error, filter); + if (ret) + goto exit; vnic = find_matching_vnic(bp, filter); if (vnic) { @@ -1364,6 +1419,7 @@ bnxt_flow_validate(struct rte_eth_dev *dev, else bnxt_hwrm_clear_l2_filter(bp, filter); +exit: /* 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);