From patchwork Sun Jun 13 00:05:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ajit Khaparde X-Patchwork-Id: 94099 X-Patchwork-Delegate: ajit.khaparde@broadcom.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 74A73A0C41; Sun, 13 Jun 2021 02:07:34 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 67DE241125; Sun, 13 Jun 2021 02:07:06 +0200 (CEST) Received: from mail-pj1-f43.google.com (mail-pj1-f43.google.com [209.85.216.43]) by mails.dpdk.org (Postfix) with ESMTP id 84E5341103 for ; Sun, 13 Jun 2021 02:07:03 +0200 (CEST) Received: by mail-pj1-f43.google.com with SMTP id mp5-20020a17090b1905b029016dd057935fso7923564pjb.5 for ; Sat, 12 Jun 2021 17:07:03 -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; bh=LdfXEouBjJ5vZbH1wE02ORHyDAvqVRvBPRlfUiYeel8=; b=JscdKz7E1QQ2IZjZQKMadGHPz2L4r5VlqkGtNmGK7Lh+qZ70Ki8RPSjTtF5l4qyn/m oHJaaAlNyJI97oi8wrG6DnYk3f8zYxfMpwF0o0uoZuyszLU4m3jwew6d6Uktp4ZJ9isI dh/lOtzewwOax+GHagtpVpSR0bMpm+WqELP6I= 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; bh=LdfXEouBjJ5vZbH1wE02ORHyDAvqVRvBPRlfUiYeel8=; b=YrxvPIIyZD2JB0hFUpscDUyc6EZNKZEo83aR/+mlYLQvgZ3RpKSjEiECGr7SvGMKCb u2TNWq1CpaBR2BkAfrrG1eGKcOGb3y+maTDWevATdPYWk8qT1QbuNMDSMWf41NmeZkj+ AXfXc52WVIs1XxSoat+XAQzvSvC9SFe6O1E7LLRZI5djpJ3D9ib0CjzucOUuZo2pwP3y 6pTMXDmzI1t9keQNj4tLp9C9fDeawSLqxlnK8i7Pp6FhqIpmCbm1OWfFIqZkib6wwrsz 4VC0/MskQVzY99rcBxwEwNoq0WOOVsiMseGLCgWfSC0JkD3A7nhMopcJ9cdWAYpr1fb3 JMTA== X-Gm-Message-State: AOAM53141DbwM338ao3kEmp2VXCD2De9Zs75j8uG03JYPNEQu8cV6Mpn DTlJNABqbjrwzmYzXnMwcS/XhigICe5Be/eGBGqb1b9KoFDgKBD84CqwtHN9yHjGVb3wDtIEObd lkaqFNRV7R6bX+/7rDSpWxaU7+UDX+Bx8+NajASpnI0k3JRsL9ZaBPBFMiTjMkyA= X-Google-Smtp-Source: ABdhPJxlee8vQBDD7cRPQ3A5Srdfpx3IjhRCzUEVflMfze1YxVvu/PQ5n0kACQ9HxPrIZ32v0XC+6g== X-Received: by 2002:a17:902:265:b029:fa:9420:d2fd with SMTP id 92-20020a1709020265b02900fa9420d2fdmr10260024plc.39.1623542822222; Sat, 12 Jun 2021 17:07:02 -0700 (PDT) Received: from localhost.localdomain ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id gg22sm12774609pjb.17.2021.06.12.17.07.00 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sat, 12 Jun 2021 17:07:01 -0700 (PDT) From: Ajit Khaparde To: dev@dpdk.org Cc: Jay Ding , Randy Schacher , Venkat Duvvuru , Peter Spreadborough Date: Sat, 12 Jun 2021 17:05:58 -0700 Message-Id: <20210613000652.28191-5-ajit.khaparde@broadcom.com> X-Mailer: git-send-email 2.21.1 (Apple Git-122.3) In-Reply-To: <20210613000652.28191-1-ajit.khaparde@broadcom.com> References: <20210530085929.29695-1-venkatkumar.duvvuru@broadcom.com> <20210613000652.28191-1-ajit.khaparde@broadcom.com> MIME-Version: 1.0 X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: [dpdk-dev] [PATCH v2 04/58] net/bnxt: check resource reservation in TRUFLOW X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 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: Jay Ding - Allow tf_open to continue if no resource is allocated for some table type. - Close the session if binding fails for any table. - Close the session if no resource is allocated for all tables. Signed-off-by: Jay Ding Signed-off-by: Randy Schacher Signed-off-by: Venkat Duvvuru Reviewed-by: Peter Spreadborough Acked-by: Ajit Khaparde --- drivers/net/bnxt/tf_core/tf_device.c | 284 +++++++++++++++++++------- drivers/net/bnxt/tf_core/tf_session.c | 2 +- 2 files changed, 207 insertions(+), 79 deletions(-) diff --git a/drivers/net/bnxt/tf_core/tf_device.c b/drivers/net/bnxt/tf_core/tf_device.c index 5116601a69..d4c93439ec 100644 --- a/drivers/net/bnxt/tf_core/tf_device.c +++ b/drivers/net/bnxt/tf_core/tf_device.c @@ -15,6 +15,44 @@ struct tf; static int tf_dev_unbind_p4(struct tf *tfp); static int tf_dev_unbind_p58(struct tf *tfp); +/** + * Resource Reservation Check function + * + * [in] tfp + * Pointer to TF handle + * + * [in] cfg + * Pointer to rm element config + * + * [in] reservations + * Pointer to resource reservation array + * + * Returns + * - (n) number of tables that have non-zero reservation count. + */ +static int +tf_dev_reservation_check(struct tf *tfp __rte_unused, + uint16_t count, + struct tf_rm_element_cfg *cfg, + uint16_t *reservations) +{ + uint16_t cnt = 0; + uint16_t *rm_num; + int i, j; + + for (i = 0; i < TF_DIR_MAX; i++) { + rm_num = (uint16_t *)reservations + i * count; + for (j = 0; j < count; j++) { + if ((cfg[j].cfg_type == TF_RM_ELEM_CFG_HCAPI || + cfg[j].cfg_type == TF_RM_ELEM_CFG_HCAPI_BA) && + rm_num[j] > 0) + cnt++; + } + } + + return cnt; +} + /** * Device specific bind function, WH+ * @@ -42,6 +80,8 @@ tf_dev_bind_p4(struct tf *tfp, { int rc; int frc; + int rsv_cnt; + bool no_rsv_flag = true; struct tf_ident_cfg_parms ident_cfg; struct tf_tbl_cfg_parms tbl_cfg; struct tf_tcam_cfg_parms tcam_cfg; @@ -54,69 +94,117 @@ tf_dev_bind_p4(struct tf *tfp, /* Initialize the modules */ - ident_cfg.num_elements = TF_IDENT_TYPE_MAX; - ident_cfg.cfg = tf_ident_p4; - ident_cfg.shadow_copy = shadow_copy; - ident_cfg.resources = resources; - rc = tf_ident_bind(tfp, &ident_cfg); - if (rc) { - TFP_DRV_LOG(ERR, - "Identifier initialization failure\n"); - goto fail; + rsv_cnt = tf_dev_reservation_check(tfp, + TF_IDENT_TYPE_MAX, + tf_ident_p4, + (uint16_t *)resources->ident_cnt); + if (rsv_cnt) { + ident_cfg.num_elements = TF_IDENT_TYPE_MAX; + ident_cfg.cfg = tf_ident_p4; + ident_cfg.shadow_copy = shadow_copy; + ident_cfg.resources = resources; + rc = tf_ident_bind(tfp, &ident_cfg); + if (rc) { + TFP_DRV_LOG(ERR, + "Identifier initialization failure\n"); + goto fail; + } + + no_rsv_flag = false; } - tbl_cfg.num_elements = TF_TBL_TYPE_MAX; - tbl_cfg.cfg = tf_tbl_p4; - tbl_cfg.shadow_copy = shadow_copy; - tbl_cfg.resources = resources; - rc = tf_tbl_bind(tfp, &tbl_cfg); - if (rc) { - TFP_DRV_LOG(ERR, - "Table initialization failure\n"); - goto fail; + rsv_cnt = tf_dev_reservation_check(tfp, + TF_TBL_TYPE_MAX, + tf_tbl_p4, + (uint16_t *)resources->tbl_cnt); + if (rsv_cnt) { + tbl_cfg.num_elements = TF_TBL_TYPE_MAX; + tbl_cfg.cfg = tf_tbl_p4; + tbl_cfg.shadow_copy = shadow_copy; + tbl_cfg.resources = resources; + rc = tf_tbl_bind(tfp, &tbl_cfg); + if (rc) { + TFP_DRV_LOG(ERR, + "Table initialization failure\n"); + goto fail; + } + + no_rsv_flag = false; } - tcam_cfg.num_elements = TF_TCAM_TBL_TYPE_MAX; - tcam_cfg.cfg = tf_tcam_p4; - tcam_cfg.shadow_copy = shadow_copy; - tcam_cfg.resources = resources; - rc = tf_tcam_bind(tfp, &tcam_cfg); - if (rc) { - TFP_DRV_LOG(ERR, - "TCAM initialization failure\n"); - goto fail; + rsv_cnt = tf_dev_reservation_check(tfp, + TF_TCAM_TBL_TYPE_MAX, + tf_tcam_p4, + (uint16_t *)resources->tcam_cnt); + if (rsv_cnt) { + tcam_cfg.num_elements = TF_TCAM_TBL_TYPE_MAX; + tcam_cfg.cfg = tf_tcam_p4; + tcam_cfg.shadow_copy = shadow_copy; + tcam_cfg.resources = resources; + rc = tf_tcam_bind(tfp, &tcam_cfg); + if (rc) { + TFP_DRV_LOG(ERR, + "TCAM initialization failure\n"); + goto fail; + } + no_rsv_flag = false; } /* * EEM */ - em_cfg.num_elements = TF_EM_TBL_TYPE_MAX; if (dev_handle->type == TF_DEVICE_TYPE_WH) em_cfg.cfg = tf_em_ext_p4; else em_cfg.cfg = tf_em_ext_p45; - em_cfg.resources = resources; - em_cfg.mem_type = TF_EEM_MEM_TYPE_HOST; - rc = tf_em_ext_common_bind(tfp, &em_cfg); - if (rc) { - TFP_DRV_LOG(ERR, - "EEM initialization failure\n"); - goto fail; + + rsv_cnt = tf_dev_reservation_check(tfp, + TF_EM_TBL_TYPE_MAX, + em_cfg.cfg, + (uint16_t *)resources->em_cnt); + if (rsv_cnt) { + em_cfg.num_elements = TF_EM_TBL_TYPE_MAX; + em_cfg.resources = resources; + em_cfg.mem_type = TF_EEM_MEM_TYPE_HOST; + rc = tf_em_ext_common_bind(tfp, &em_cfg); + if (rc) { + TFP_DRV_LOG(ERR, + "EEM initialization failure\n"); + goto fail; + } + no_rsv_flag = false; } /* * EM */ - em_cfg.num_elements = TF_EM_TBL_TYPE_MAX; - em_cfg.cfg = tf_em_int_p4; - em_cfg.resources = resources; - em_cfg.mem_type = 0; /* Not used by EM */ + rsv_cnt = tf_dev_reservation_check(tfp, + TF_EM_TBL_TYPE_MAX, + tf_em_int_p4, + (uint16_t *)resources->em_cnt); + if (rsv_cnt) { + em_cfg.num_elements = TF_EM_TBL_TYPE_MAX; + em_cfg.cfg = tf_em_int_p4; + em_cfg.resources = resources; + em_cfg.mem_type = 0; /* Not used by EM */ + + rc = tf_em_int_bind(tfp, &em_cfg); + if (rc) { + TFP_DRV_LOG(ERR, + "EM initialization failure\n"); + goto fail; + } + no_rsv_flag = false; + } - rc = tf_em_int_bind(tfp, &em_cfg); - if (rc) { + /* + * There is no rm reserved for any tables + * + */ + if (no_rsv_flag) { TFP_DRV_LOG(ERR, - "EM initialization failure\n"); - goto fail; + "No rm reserved for any tables\n"); + return -ENOMEM; } /* @@ -263,6 +351,8 @@ tf_dev_bind_p58(struct tf *tfp, { int rc; int frc; + int rsv_cnt; + bool no_rsv_flag = true; struct tf_ident_cfg_parms ident_cfg; struct tf_tbl_cfg_parms tbl_cfg; struct tf_tcam_cfg_parms tcam_cfg; @@ -275,52 +365,90 @@ tf_dev_bind_p58(struct tf *tfp, /* Initialize the modules */ - ident_cfg.num_elements = TF_IDENT_TYPE_MAX; - ident_cfg.cfg = tf_ident_p58; - ident_cfg.shadow_copy = shadow_copy; - ident_cfg.resources = resources; - rc = tf_ident_bind(tfp, &ident_cfg); - if (rc) { - TFP_DRV_LOG(ERR, - "Identifier initialization failure\n"); - goto fail; + rsv_cnt = tf_dev_reservation_check(tfp, + TF_IDENT_TYPE_MAX, + tf_ident_p58, + (uint16_t *)resources->ident_cnt); + if (rsv_cnt) { + ident_cfg.num_elements = TF_IDENT_TYPE_MAX; + ident_cfg.cfg = tf_ident_p58; + ident_cfg.shadow_copy = shadow_copy; + ident_cfg.resources = resources; + rc = tf_ident_bind(tfp, &ident_cfg); + if (rc) { + TFP_DRV_LOG(ERR, + "Identifier initialization failure\n"); + goto fail; + } + no_rsv_flag = false; } - tbl_cfg.num_elements = TF_TBL_TYPE_MAX; - tbl_cfg.cfg = tf_tbl_p58; - tbl_cfg.shadow_copy = shadow_copy; - tbl_cfg.resources = resources; - rc = tf_tbl_bind(tfp, &tbl_cfg); - if (rc) { - TFP_DRV_LOG(ERR, - "Table initialization failure\n"); - goto fail; + rsv_cnt = tf_dev_reservation_check(tfp, + TF_TBL_TYPE_MAX, + tf_tbl_p58, + (uint16_t *)resources->tbl_cnt); + if (rsv_cnt) { + tbl_cfg.num_elements = TF_TBL_TYPE_MAX; + tbl_cfg.cfg = tf_tbl_p58; + tbl_cfg.shadow_copy = shadow_copy; + tbl_cfg.resources = resources; + rc = tf_tbl_bind(tfp, &tbl_cfg); + if (rc) { + TFP_DRV_LOG(ERR, + "Table initialization failure\n"); + goto fail; + } + no_rsv_flag = false; } - tcam_cfg.num_elements = TF_TCAM_TBL_TYPE_MAX; - tcam_cfg.cfg = tf_tcam_p58; - tcam_cfg.shadow_copy = shadow_copy; - tcam_cfg.resources = resources; - rc = tf_tcam_bind(tfp, &tcam_cfg); - if (rc) { - TFP_DRV_LOG(ERR, - "TCAM initialization failure\n"); - goto fail; + rsv_cnt = tf_dev_reservation_check(tfp, + TF_TCAM_TBL_TYPE_MAX, + tf_tcam_p58, + (uint16_t *)resources->tcam_cnt); + if (rsv_cnt) { + tcam_cfg.num_elements = TF_TCAM_TBL_TYPE_MAX; + tcam_cfg.cfg = tf_tcam_p58; + tcam_cfg.shadow_copy = shadow_copy; + tcam_cfg.resources = resources; + rc = tf_tcam_bind(tfp, &tcam_cfg); + if (rc) { + TFP_DRV_LOG(ERR, + "TCAM initialization failure\n"); + goto fail; + } + no_rsv_flag = false; } /* * EM */ - em_cfg.num_elements = TF_EM_TBL_TYPE_MAX; - em_cfg.cfg = tf_em_int_p58; - em_cfg.resources = resources; - em_cfg.mem_type = 0; /* Not used by EM */ + rsv_cnt = tf_dev_reservation_check(tfp, + TF_EM_TBL_TYPE_MAX, + tf_em_int_p58, + (uint16_t *)resources->em_cnt); + if (rsv_cnt) { + em_cfg.num_elements = TF_EM_TBL_TYPE_MAX; + em_cfg.cfg = tf_em_int_p58; + em_cfg.resources = resources; + em_cfg.mem_type = 0; /* Not used by EM */ + + rc = tf_em_int_bind(tfp, &em_cfg); + if (rc) { + TFP_DRV_LOG(ERR, + "EM initialization failure\n"); + goto fail; + } + no_rsv_flag = false; + } - rc = tf_em_int_bind(tfp, &em_cfg); - if (rc) { + /* + * There is no rm reserved for any tables + * + */ + if (no_rsv_flag) { TFP_DRV_LOG(ERR, - "EM initialization failure\n"); - goto fail; + "No rm reserved for any tables\n"); + return -ENOMEM; } /* diff --git a/drivers/net/bnxt/tf_core/tf_session.c b/drivers/net/bnxt/tf_core/tf_session.c index b3fa7e13ff..d2b24f5e20 100644 --- a/drivers/net/bnxt/tf_core/tf_session.c +++ b/drivers/net/bnxt/tf_core/tf_session.c @@ -180,7 +180,7 @@ tf_session_create(struct tf *tfp, &session->dev); /* Logging handled by dev_bind */ if (rc) - return rc; + goto cleanup; if (session->dev.ops->tf_dev_get_mailbox == NULL) { /* Log error */