From patchwork Tue Jul 28 06:34:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajit Khaparde X-Patchwork-Id: 74913 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 E43E8A0521; Tue, 28 Jul 2020 08:37:50 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id B6C551C1B8; Tue, 28 Jul 2020 08:35:44 +0200 (CEST) Received: from mail-wr1-f97.google.com (mail-wr1-f97.google.com [209.85.221.97]) by dpdk.org (Postfix) with ESMTP id D57CB1C128 for ; Tue, 28 Jul 2020 08:35:19 +0200 (CEST) Received: by mail-wr1-f97.google.com with SMTP id r4so14122626wrx.9 for ; Mon, 27 Jul 2020 23:35:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=IZP1dslok6xwiK3reYB9FMKij4Y4XZBoWw3CE7LKtEw=; b=Htjyf24e2tMnTgxkmhpYQHGMSF1smEBHNpYq1WWyc5SBVXMBv8wsuNZ+XAa0Dtgb7Z xmAxooQjVBc4OgmILgpgBA18pvyfSAUbUkwr7opeiI81q7IWLd0mDtMfCjditwfFoNmo MnNByeh+zf3IshvQaD5Rh0mFcXGlQjX5waC3A= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=IZP1dslok6xwiK3reYB9FMKij4Y4XZBoWw3CE7LKtEw=; b=hqkzCJDaDBy9oebnSNwBHxWAYXedDXat6WzFgj00cGkcQeMAo8eZP6jts/gROrjyq/ vnQVC/r19IY218snN1Nq0nrcggCybpyfI4yEdS+Qi5NpqbxYY3d/4urramrg2Fhvv+1L mJEtguap7fBn2zXvywhw/nZJbfjN/DZn1x3HShbKsUmZD4Yn7NQsWON3407jIYmHay2i TehZcIMAEi/x8YSGBcE3Qm4kALfjTSBNocY/FilJL/2tQdP2d8VLDPZuIavejise5KlB gE7z9KRoO1ta4oSVZdvCet4WrnHCh+NOYUTBvyWZZSwJvZpQGbcN5p6PAIaiZPJRuiWM fUbg== X-Gm-Message-State: AOAM533rEYKADY6gleJttnpu4Or4X6Fw3SSJF7VvuUC1wi5VOicDARWx NfRsYC+KaeqY86YjEAj/3Frt9lOOma+htHBacoZgSLYBT17aKZm749mbLuNEaJ9hdGS78WzzZd4 GV4Z/LNIISyQjPUYBJbyDlHtsYqeA8cNTN3XOJrVSHkgkllXKaKYgZRcjGknv4EcPfjy4mahWuR 8sfg== X-Google-Smtp-Source: ABdhPJxVsG8H0tadSL9efKa9/ROjy+CBFbCFj939Ll5vVheAizSGbBE+Z1sGPWHa0d6nfIrxLuoxLB54Cvor X-Received: by 2002:adf:a351:: with SMTP id d17mr23083683wrb.111.1595918119398; Mon, 27 Jul 2020 23:35:19 -0700 (PDT) Received: from localhost.localdomain ([192.19.223.252]) by smtp-relay.gmail.com with ESMTPS id r16sm30828wmh.29.2020.07.27.23.35.17 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 27 Jul 2020 23:35:19 -0700 (PDT) X-Relaying-Domain: broadcom.com From: Ajit Khaparde To: dev@dpdk.org Cc: ferruh.yigit@intel.com, Venkat Duvvuru , Somnath Kotur , Kishore Padmanabha Date: Mon, 27 Jul 2020 23:34:31 -0700 Message-Id: <20200728063439.23114-15-ajit.khaparde@broadcom.com> X-Mailer: git-send-email 2.21.1 (Apple Git-122.3) In-Reply-To: <20200728063439.23114-1-ajit.khaparde@broadcom.com> References: <20200728063439.23114-1-ajit.khaparde@broadcom.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v4 14/22] net/bnxt: fix port default rule create and destroy 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: Venkat Duvvuru Currently, the flow_ids of port_to_app/app_to_port & tx_cfa_action for the first port are getting over-written by the second port because these fields are stored in the ulp context which is common across the ports. This patch fixes the problem by having per port structure to store these fields. Fixes: 9f702636d7ba ("net/bnxt: add port default rules for ingress and egress") Signed-off-by: Venkat Duvvuru Reviewed-by: Somnath Kotur Reviewed-by: Kishore Padmanabha --- drivers/net/bnxt/bnxt.h | 5 +- drivers/net/bnxt/bnxt_ethdev.c | 81 +---------------- drivers/net/bnxt/bnxt_txq.h | 1 - drivers/net/bnxt/bnxt_txr.c | 6 +- drivers/net/bnxt/tf_ulp/bnxt_ulp.c | 12 ++- drivers/net/bnxt/tf_ulp/bnxt_ulp.h | 14 ++- drivers/net/bnxt/tf_ulp/ulp_def_rules.c | 116 ++++++++++++++++++++++++ drivers/net/bnxt/tf_ulp/ulp_flow_db.c | 2 +- drivers/net/bnxt/tf_ulp/ulp_flow_db.h | 2 +- 9 files changed, 151 insertions(+), 88 deletions(-) diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h index 50f93ff5b..41e7ae5bd 100644 --- a/drivers/net/bnxt/bnxt.h +++ b/drivers/net/bnxt/bnxt.h @@ -784,6 +784,7 @@ struct bnxt { struct bnxt_flow_stat_info *flow_stat; uint8_t flow_xstat; uint16_t max_num_kflows; + uint16_t tx_cfa_action; }; #define BNXT_FC_TIMER 1 /* Timer freq in Sec Flow Counters */ @@ -797,7 +798,7 @@ struct bnxt_vf_representor { uint16_t fw_fid; uint16_t dflt_vnic_id; uint16_t svif; - uint32_t vfr_tx_cfa_action; + uint16_t vfr_tx_cfa_action; uint16_t rx_cfa_code; uint32_t rep2vf_flow_id; uint32_t vf2rep_flow_id; @@ -872,6 +873,8 @@ extern int bnxt_logtype_driver; extern const struct rte_flow_ops bnxt_ulp_rte_flow_ops; int32_t bnxt_ulp_init(struct bnxt *bp); void bnxt_ulp_deinit(struct bnxt *bp); +int32_t bnxt_ulp_create_df_rules(struct bnxt *bp); +void bnxt_ulp_destroy_df_rules(struct bnxt *bp, bool global); uint16_t bnxt_get_vnic_id(uint16_t port, enum bnxt_ulp_intf_type type); uint16_t bnxt_get_svif(uint16_t port_id, bool func_svif, diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 0829493ea..dfc4b4190 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -1168,73 +1168,6 @@ static int bnxt_handle_if_change_status(struct bnxt *bp) return rc; } -static int32_t -bnxt_create_port_app_df_rule(struct bnxt *bp, uint8_t flow_type, - uint32_t *flow_id) -{ - uint16_t port_id = bp->eth_dev->data->port_id; - struct ulp_tlv_param param_list[] = { - { - .type = BNXT_ULP_DF_PARAM_TYPE_DEV_PORT_ID, - .length = 2, - .value = {(port_id >> 8) & 0xff, port_id & 0xff} - }, - { - .type = BNXT_ULP_DF_PARAM_TYPE_LAST, - .length = 0, - .value = {0} - } - }; - - return ulp_default_flow_create(bp->eth_dev, param_list, flow_type, - flow_id); -} - -static int32_t -bnxt_create_df_rules(struct bnxt *bp) -{ - struct bnxt_ulp_data *cfg_data; - int rc; - - cfg_data = bp->ulp_ctx->cfg_data; - rc = bnxt_create_port_app_df_rule(bp, BNXT_ULP_DF_TPL_PORT_TO_VS, - &cfg_data->port_to_app_flow_id); - if (rc) { - PMD_DRV_LOG(ERR, - "Failed to create port to app default rule\n"); - return rc; - } - - BNXT_TF_DBG(DEBUG, "***** created port to app default rule ******\n"); - rc = bnxt_create_port_app_df_rule(bp, BNXT_ULP_DF_TPL_VS_TO_PORT, - &cfg_data->app_to_port_flow_id); - if (!rc) { - rc = ulp_default_flow_db_cfa_action_get(bp->ulp_ctx, - cfg_data->app_to_port_flow_id, - &cfg_data->tx_cfa_action); - if (rc) - goto err; - - BNXT_TF_DBG(DEBUG, - "***** created app to port default rule *****\n"); - return 0; - } - -err: - BNXT_TF_DBG(DEBUG, "Failed to create app to port default rule\n"); - return rc; -} - -static void -bnxt_destroy_df_rules(struct bnxt *bp) -{ - struct bnxt_ulp_data *cfg_data; - - cfg_data = bp->ulp_ctx->cfg_data; - ulp_default_flow_destroy(bp->eth_dev, cfg_data->port_to_app_flow_id); - ulp_default_flow_destroy(bp->eth_dev, cfg_data->app_to_port_flow_id); -} - static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev) { struct bnxt *bp = eth_dev->data->dev_private; @@ -1296,8 +1229,7 @@ static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev) bnxt_schedule_fw_health_check(bp); pthread_mutex_unlock(&bp->def_cp_lock); - if (BNXT_TRUFLOW_EN(bp)) - bnxt_ulp_init(bp); + bnxt_ulp_init(bp); return 0; @@ -1358,6 +1290,9 @@ static void bnxt_dev_stop_op(struct rte_eth_dev *eth_dev) /* disable uio/vfio intr/eventfd mapping */ rte_intr_disable(intr_handle); + bnxt_ulp_destroy_df_rules(bp, false); + bnxt_ulp_deinit(bp); + bnxt_cancel_fw_health_check(bp); bnxt_dev_set_link_down_op(eth_dev); @@ -1403,11 +1338,6 @@ static void bnxt_dev_close_op(struct rte_eth_dev *eth_dev) rte_eal_alarm_cancel(bnxt_dev_recover, (void *)bp); bnxt_cancel_fc_thread(bp); - if (BNXT_TRUFLOW_EN(bp)) { - bnxt_destroy_df_rules(bp); - bnxt_ulp_deinit(bp); - } - if (eth_dev->data->dev_started) bnxt_dev_stop_op(eth_dev); @@ -1656,8 +1586,7 @@ static int bnxt_promiscuous_disable_op(struct rte_eth_dev *eth_dev) if (rc != 0) vnic->flags = old_flags; - if (BNXT_TRUFLOW_EN(bp)) - bnxt_create_df_rules(bp); + bnxt_ulp_create_df_rules(bp); return rc; } diff --git a/drivers/net/bnxt/bnxt_txq.h b/drivers/net/bnxt/bnxt_txq.h index a1ab3f39a..83a98536d 100644 --- a/drivers/net/bnxt/bnxt_txq.h +++ b/drivers/net/bnxt/bnxt_txq.h @@ -29,7 +29,6 @@ struct bnxt_tx_queue { struct bnxt *bp; int index; int tx_wake_thresh; - uint32_t tx_cfa_action; uint32_t vfr_tx_cfa_action; struct bnxt_tx_ring_info *tx_ring; diff --git a/drivers/net/bnxt/bnxt_txr.c b/drivers/net/bnxt/bnxt_txr.c index c741c7188..1113aca44 100644 --- a/drivers/net/bnxt/bnxt_txr.c +++ b/drivers/net/bnxt/bnxt_txr.c @@ -133,8 +133,7 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt, PKT_TX_TUNNEL_GENEVE | PKT_TX_IEEE1588_TMST | PKT_TX_QINQ_PKT) || (BNXT_TRUFLOW_EN(txq->bp) && - (txq->bp->ulp_ctx->cfg_data->tx_cfa_action || - txq->vfr_tx_cfa_action))) + (txq->bp->tx_cfa_action || txq->vfr_tx_cfa_action))) long_bd = true; nr_bds = long_bd + tx_pkt->nb_segs; @@ -192,8 +191,7 @@ static uint16_t bnxt_start_xmit(struct rte_mbuf *tx_pkt, if (txq->vfr_tx_cfa_action) cfa_action = txq->vfr_tx_cfa_action; else - cfa_action = - txq->bp->ulp_ctx->cfg_data->tx_cfa_action; + cfa_action = txq->bp->tx_cfa_action; } /* HW can accelerate only outer vlan in QinQ mode */ diff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c index 7c65a4b1b..2febd5814 100644 --- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c +++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c @@ -9,9 +9,9 @@ #include #include +#include "bnxt.h" #include "bnxt_ulp.h" #include "bnxt_tf_common.h" -#include "bnxt.h" #include "tf_core.h" #include "tf_ext_flow_handle.h" @@ -381,6 +381,7 @@ ulp_ctx_init(struct bnxt *bp, (void)ulp_ctx_deinit(bp, session); return rc; } + bnxt_ulp_cntxt_tfp_set(bp->ulp_ctx, session->g_tfp); return rc; } @@ -654,6 +655,9 @@ bnxt_ulp_init(struct bnxt *bp) bool init; int rc; + if (!BNXT_TRUFLOW_EN(bp)) + return 0; + if (bp->ulp_ctx) { BNXT_TF_DBG(DEBUG, "ulp ctx already allocated\n"); return -EINVAL; @@ -822,6 +826,9 @@ bnxt_ulp_deinit(struct bnxt *bp) struct rte_pci_device *pci_dev; struct rte_pci_addr *pci_addr; + if (!BNXT_TRUFLOW_EN(bp)) + return; + /* Get the session first */ pci_dev = RTE_DEV_TO_PCI(bp->eth_dev->device); pci_addr = &pci_dev->addr; @@ -833,6 +840,9 @@ bnxt_ulp_deinit(struct bnxt *bp) if (!session) return; + /* clean up default flows */ + bnxt_ulp_destroy_df_rules(bp, true); + /* clean up regular flows */ ulp_flow_db_flush_flows(bp->ulp_ctx, BNXT_ULP_REGULAR_FLOW_TABLE); diff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.h b/drivers/net/bnxt/tf_ulp/bnxt_ulp.h index 7c95ead55..d53245215 100644 --- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.h +++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.h @@ -22,6 +22,12 @@ #define BNXT_ULP_VF_REP_ENABLED 0x1 #define ULP_VF_REP_IS_ENABLED(flag) ((flag) & BNXT_ULP_VF_REP_ENABLED) +struct bnxt_ulp_df_rule_info { + uint32_t port_to_app_flow_id; + uint32_t app_to_port_flow_id; + uint8_t valid; +}; + struct bnxt_ulp_data { uint32_t tbl_scope_id; struct bnxt_ulp_mark_tbl *mark_tbl; @@ -32,9 +38,7 @@ struct bnxt_ulp_data { struct bnxt_ulp_port_db *port_db; struct bnxt_ulp_fc_info *fc_info; uint32_t ulp_flags; - uint32_t port_to_app_flow_id; - uint32_t app_to_port_flow_id; - uint32_t tx_cfa_action; + struct bnxt_ulp_df_rule_info df_rule_info[RTE_MAX_ETHPORTS]; }; struct bnxt_ulp_context { @@ -175,4 +179,8 @@ int32_t bnxt_ulp_cntxt_ptr2_ulp_flags_get(struct bnxt_ulp_context *ulp_ctx, uint32_t *flags); +int32_t +bnxt_ulp_get_df_rule_info(uint8_t port_id, struct bnxt_ulp_context *ulp_ctx, + struct bnxt_ulp_df_rule_info *info); + #endif /* _BNXT_ULP_H_ */ diff --git a/drivers/net/bnxt/tf_ulp/ulp_def_rules.c b/drivers/net/bnxt/tf_ulp/ulp_def_rules.c index ddc6da8a8..9fb1a028f 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_def_rules.c +++ b/drivers/net/bnxt/tf_ulp/ulp_def_rules.c @@ -392,3 +392,119 @@ ulp_default_flow_destroy(struct rte_eth_dev *eth_dev, uint32_t flow_id) return rc; } + +void +bnxt_ulp_destroy_df_rules(struct bnxt *bp, bool global) +{ + struct bnxt_ulp_df_rule_info *info; + uint8_t port_id; + + if (!BNXT_TRUFLOW_EN(bp) || + BNXT_ETH_DEV_IS_REPRESENTOR(bp->eth_dev)) + return; + + if (!bp->ulp_ctx || !bp->ulp_ctx->cfg_data) + return; + + /* Delete default rules per port */ + if (!global) { + port_id = bp->eth_dev->data->port_id; + info = &bp->ulp_ctx->cfg_data->df_rule_info[port_id]; + if (!info->valid) + return; + + ulp_default_flow_destroy(bp->eth_dev, + info->port_to_app_flow_id); + ulp_default_flow_destroy(bp->eth_dev, + info->app_to_port_flow_id); + info->valid = false; + return; + } + + /* Delete default rules for all ports */ + for (port_id = 0; port_id < RTE_MAX_ETHPORTS; port_id++) { + info = &bp->ulp_ctx->cfg_data->df_rule_info[port_id]; + if (!info->valid) + continue; + + ulp_default_flow_destroy(bp->eth_dev, + info->port_to_app_flow_id); + ulp_default_flow_destroy(bp->eth_dev, + info->app_to_port_flow_id); + info->valid = false; + } +} + +static int32_t +bnxt_create_port_app_df_rule(struct bnxt *bp, uint8_t flow_type, + uint32_t *flow_id) +{ + uint16_t port_id = bp->eth_dev->data->port_id; + struct ulp_tlv_param param_list[] = { + { + .type = BNXT_ULP_DF_PARAM_TYPE_DEV_PORT_ID, + .length = 2, + .value = {(port_id >> 8) & 0xff, port_id & 0xff} + }, + { + .type = BNXT_ULP_DF_PARAM_TYPE_LAST, + .length = 0, + .value = {0} + } + }; + + return ulp_default_flow_create(bp->eth_dev, param_list, flow_type, + flow_id); +} + +int32_t +bnxt_ulp_create_df_rules(struct bnxt *bp) +{ + struct bnxt_ulp_df_rule_info *info; + uint8_t port_id; + int rc; + + if (!BNXT_TRUFLOW_EN(bp) || + BNXT_ETH_DEV_IS_REPRESENTOR(bp->eth_dev)) + return 0; + + port_id = bp->eth_dev->data->port_id; + info = &bp->ulp_ctx->cfg_data->df_rule_info[port_id]; + BNXT_TF_DBG(INFO, "*** creating port to app default rule ***\n"); + rc = bnxt_create_port_app_df_rule(bp, BNXT_ULP_DF_TPL_PORT_TO_VS, + &info->port_to_app_flow_id); + if (rc) { + PMD_DRV_LOG(ERR, + "Failed to create port to app default rule\n"); + return rc; + } + BNXT_TF_DBG(INFO, "*** created port to app default rule ***\n"); + + bp->tx_cfa_action = 0; + BNXT_TF_DBG(INFO, "*** creating app to port default rule ***\n"); + rc = bnxt_create_port_app_df_rule(bp, BNXT_ULP_DF_TPL_VS_TO_PORT, + &info->app_to_port_flow_id); + if (rc) { + PMD_DRV_LOG(ERR, + "Failed to create app to port default rule\n"); + goto port_to_app_free; + } + + rc = ulp_default_flow_db_cfa_action_get(bp->ulp_ctx, + info->app_to_port_flow_id, + &bp->tx_cfa_action); + if (rc) + goto app_to_port_free; + + info->valid = true; + BNXT_TF_DBG(INFO, "*** created app to port default rule ***\n"); + return 0; + +app_to_port_free: + ulp_default_flow_destroy(bp->eth_dev, info->app_to_port_flow_id); +port_to_app_free: + ulp_default_flow_destroy(bp->eth_dev, info->port_to_app_flow_id); + info->valid = false; + + return rc; +} diff --git a/drivers/net/bnxt/tf_ulp/ulp_flow_db.c b/drivers/net/bnxt/tf_ulp/ulp_flow_db.c index a3cfe54bf..714451740 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_flow_db.c +++ b/drivers/net/bnxt/tf_ulp/ulp_flow_db.c @@ -962,7 +962,7 @@ ulp_flow_db_resource_hndl_get(struct bnxt_ulp_context *ulp_ctx, int32_t ulp_default_flow_db_cfa_action_get(struct bnxt_ulp_context *ulp_ctx, uint32_t flow_id, - uint32_t *cfa_action) + uint16_t *cfa_action) { uint8_t sub_type = BNXT_ULP_RESOURCE_SUB_TYPE_INDEX_TYPE_VFR_CFA_ACTION; uint64_t hndl; diff --git a/drivers/net/bnxt/tf_ulp/ulp_flow_db.h b/drivers/net/bnxt/tf_ulp/ulp_flow_db.h index 1fc06012f..117e250d6 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_flow_db.h +++ b/drivers/net/bnxt/tf_ulp/ulp_flow_db.h @@ -234,7 +234,7 @@ ulp_flow_db_validate_flow_func(struct bnxt_ulp_context *ulp_ctx, int32_t ulp_default_flow_db_cfa_action_get(struct bnxt_ulp_context *ulp_ctx, uint32_t flow_id, - uint32_t *cfa_action); + uint16_t *cfa_action); #ifdef RTE_LIBRTE_BNXT_TRUFLOW_DEBUG /*