From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 84D12A04B5; Fri, 11 Sep 2020 04:00:16 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 555D01C1D5; Fri, 11 Sep 2020 03:57:44 +0200 (CEST) Received: from mail-pj1-f99.google.com (mail-pj1-f99.google.com [209.85.216.99]) by dpdk.org (Postfix) with ESMTP id A5EFA1C0CF for ; Fri, 11 Sep 2020 03:57:42 +0200 (CEST) Received: by mail-pj1-f99.google.com with SMTP id o16so943222pjr.2 for ; Thu, 10 Sep 2020 18:57:42 -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=cnL0zcDjeGUp+hjKnxF8lHYM2BBiAreSTA3YZ/iUp4I=; b=U6NszTXo117L16FUAq+2kD30XtaoWeyL11FhMJX2DPd4XUvDY9U6z/WK0SWebtQvOh c1gWNoHj+Q27PEXkc83RplVkD5p1DdnU1kVmiv7kTdqhEBzs2pHK46WvLXf9L0bKqJNc 9DAeyjx1YcCCHg4egKKhUoK6qiecG4rE0/weE= 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=cnL0zcDjeGUp+hjKnxF8lHYM2BBiAreSTA3YZ/iUp4I=; b=Zcot+B8Cb7X0C6SAWvwjpsuEFAcsAlo+8cdv+XcS8rUrOR/TpuFCCulDq1boeTal6d /JSs0nB2M0j0Cp2TxHCW5sAF5mz9fqNcD1zXg5v6Dlej0ZDDHItIOnhrFesADXBWLv37 +G9OOWiQVokhZFmxEnKh66av7Jn2cQhGWPlMj3ov9jyxAwBhEP+A8Opj+dgwnqL7a7ft Jwd9j2oc5/su85zIZSCeMBkmrpzWuMZVrj1+Wu2He6Bi85Yg94sXRvEGJFTOr7Bfk8BE I8n4LGqkLTxWDyD2QImZX9u5LFY6eNto/V0+PFrSYW03yVpdCjZCvgBi8NSHhk8Jr9+N AT6w== X-Gm-Message-State: AOAM530jMNNJKKs30swWwrUflvoSBCxc10htQBdkzzTZEKlZiorgq6/Q uK5ojiki0EsB+Ha9js1czsBz/fuFteHc2KpavChtFsi4dSLp4W3T1b3nkVg9UIVttVx/9VaekmZ d9cdgcwclmfN1noskNY7jEKAdDZ/bDbz4bKb3WpLFLx8ncZ9E0O3N9oVYg3l081Cj7w4cqfGxVD dBZA== X-Google-Smtp-Source: ABdhPJwr71WsCx0NSunBypL0xTGMr8NHXWqrhGRM/6pJgZbgGVDrUmX9UpiRWMwDSUvadTx3FvyiD8DmwPXe X-Received: by 2002:a17:90a:2e03:: with SMTP id q3mr42424pjd.61.1599789461705; Thu, 10 Sep 2020 18:57:41 -0700 (PDT) Received: from localhost.localdomain ([192.19.223.252]) by smtp-relay.gmail.com with ESMTPS id cl6sm80986pjb.15.2020.09.10.18.57.39 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Sep 2020 18:57:41 -0700 (PDT) X-Relaying-Domain: broadcom.com From: Ajit Khaparde To: dev@dpdk.org Cc: Kishore Padmanabha , Mike Baucom , Shahaji Bhosle Date: Thu, 10 Sep 2020 18:56:01 -0700 Message-Id: <20200911015603.88359-24-ajit.khaparde@broadcom.com> X-Mailer: git-send-email 2.21.1 (Apple Git-122.3) In-Reply-To: <20200911015603.88359-1-ajit.khaparde@broadcom.com> References: <20200911015603.88359-1-ajit.khaparde@broadcom.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH 23/25] net/bnxt: add support for locks in flow database 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: Kishore Padmanabha Added support for mutex protection for the flow database to prevent simultaneous access to flow database and protect flow creation and deletion. Signed-off-by: Kishore Padmanabha Reviewed-by: Mike Baucom Reviewed-by: Shahaji Bhosle --- drivers/net/bnxt/tf_ulp/bnxt_ulp.c | 33 +++++++++++++++++++++++++++ drivers/net/bnxt/tf_ulp/bnxt_ulp.h | 7 ++++++ drivers/net/bnxt/tf_ulp/ulp_flow_db.c | 13 ++++++++++- drivers/net/bnxt/tf_ulp/ulp_mapper.c | 20 +++++++++++++++- 4 files changed, 71 insertions(+), 2 deletions(-) diff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c index 364853a6e..e8927f629 100644 --- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c +++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c @@ -727,6 +727,9 @@ bnxt_ulp_deinit(struct bnxt *bp, TF_TUNNEL_ENCAP_NAT, BNXT_ULP_NAT_OUTER_MOST_FLAGS, 0); + /* free the flow db lock */ + pthread_mutex_destroy(&bp->ulp_ctx->cfg_data->flow_db_lock); + /* Delete the ulp context and tf session and free the ulp context */ ulp_ctx_deinit(bp, session); BNXT_TF_DBG(DEBUG, "ulp ctx has been deinitialized\n"); @@ -750,6 +753,12 @@ bnxt_ulp_init(struct bnxt *bp, goto jump_to_error; } + rc = pthread_mutex_init(&bp->ulp_ctx->cfg_data->flow_db_lock, NULL); + if (rc) { + BNXT_TF_DBG(ERR, "Unable to initialize flow db lock\n"); + goto jump_to_error; + } + /* Initialize ulp dparms with values devargs passed */ rc = ulp_dparms_init(bp, bp->ulp_ctx); if (rc) { @@ -1235,3 +1244,27 @@ bnxt_ulp_cntxt_ptr2_ulp_vfr_info_get(struct bnxt_ulp_context *ulp_ctx, return &ulp_ctx->cfg_data->vfr_rule_info[port_id]; } + +/* Function to acquire the flow database lock from the ulp context. */ +int32_t +bnxt_ulp_cntxt_acquire_fdb_lock(struct bnxt_ulp_context *ulp_ctx) +{ + if (!ulp_ctx || !ulp_ctx->cfg_data) + return -1; + + if (pthread_mutex_lock(&ulp_ctx->cfg_data->flow_db_lock)) { + BNXT_TF_DBG(ERR, "unable to acquire fdb lock\n"); + return -1; + } + return 0; +} + +/* Function to release the flow database lock from the ulp context. */ +void +bnxt_ulp_cntxt_release_fdb_lock(struct bnxt_ulp_context *ulp_ctx) +{ + if (!ulp_ctx || !ulp_ctx->cfg_data) + return; + + pthread_mutex_unlock(&ulp_ctx->cfg_data->flow_db_lock); +} diff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.h b/drivers/net/bnxt/tf_ulp/bnxt_ulp.h index ed978734a..36405ae1e 100644 --- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.h +++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.h @@ -47,6 +47,7 @@ struct bnxt_ulp_data { uint32_t dev_id; /* Hardware device id */ uint32_t ref_cnt; struct bnxt_ulp_flow_db *flow_db; + pthread_mutex_t flow_db_lock; void *mapper_data; struct bnxt_ulp_port_db *port_db; struct bnxt_ulp_fc_info *fc_info; @@ -196,4 +197,10 @@ struct bnxt_ulp_vfr_rule_info* bnxt_ulp_cntxt_ptr2_ulp_vfr_info_get(struct bnxt_ulp_context *ulp_ctx, uint32_t port_id); +int32_t +bnxt_ulp_cntxt_acquire_fdb_lock(struct bnxt_ulp_context *ulp_ctx); + +void +bnxt_ulp_cntxt_release_fdb_lock(struct bnxt_ulp_context *ulp_ctx); + #endif /* _BNXT_ULP_H_ */ diff --git a/drivers/net/bnxt/tf_ulp/ulp_flow_db.c b/drivers/net/bnxt/tf_ulp/ulp_flow_db.c index cbdf5df68..9a2d3758d 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_flow_db.c +++ b/drivers/net/bnxt/tf_ulp/ulp_flow_db.c @@ -793,10 +793,17 @@ int32_t ulp_flow_db_flush_flows(struct bnxt_ulp_context *ulp_ctx, BNXT_TF_DBG(ERR, "Flow database not found\n"); return -EINVAL; } + if (bnxt_ulp_cntxt_acquire_fdb_lock(ulp_ctx)) { + BNXT_TF_DBG(ERR, "Flow db lock acquire failed\n"); + return -EINVAL; + } + flow_tbl = &flow_db->flow_tbl[idx]; while (!ulp_flow_db_next_entry_get(flow_tbl, &fid)) ulp_mapper_resources_free(ulp_ctx, fid, idx); + bnxt_ulp_cntxt_release_fdb_lock(ulp_ctx); + return 0; } @@ -826,13 +833,17 @@ ulp_flow_db_function_flow_flush(struct bnxt_ulp_context *ulp_ctx, BNXT_TF_DBG(ERR, "Flow database not found\n"); return -EINVAL; } + if (bnxt_ulp_cntxt_acquire_fdb_lock(ulp_ctx)) { + BNXT_TF_DBG(ERR, "Flow db lock acquire failed\n"); + return -EINVAL; + } flow_tbl = &flow_db->flow_tbl[BNXT_ULP_REGULAR_FLOW_TABLE]; while (!ulp_flow_db_next_entry_get(flow_tbl, &flow_id)) { if (flow_db->func_id_tbl[flow_id] == func_id) ulp_mapper_resources_free(ulp_ctx, flow_id, BNXT_ULP_REGULAR_FLOW_TABLE); } - + bnxt_ulp_cntxt_release_fdb_lock(ulp_ctx); return 0; } diff --git a/drivers/net/bnxt/tf_ulp/ulp_mapper.c b/drivers/net/bnxt/tf_ulp/ulp_mapper.c index 732141166..85ae3b5c4 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_mapper.c +++ b/drivers/net/bnxt/tf_ulp/ulp_mapper.c @@ -2668,12 +2668,21 @@ int32_t ulp_mapper_flow_destroy(struct bnxt_ulp_context *ulp_ctx, uint32_t fid, enum bnxt_ulp_flow_db_tables flow_tbl_type) { + int32_t rc; + if (!ulp_ctx) { BNXT_TF_DBG(ERR, "Invalid parms, unable to free flow\n"); return -EINVAL; } + if (bnxt_ulp_cntxt_acquire_fdb_lock(ulp_ctx)) { + BNXT_TF_DBG(ERR, "Flow db lock acquire failed\n"); + return -EINVAL; + } + + rc = ulp_mapper_resources_free(ulp_ctx, fid, flow_tbl_type); + bnxt_ulp_cntxt_release_fdb_lock(ulp_ctx); + return rc; - return ulp_mapper_resources_free(ulp_ctx, fid, flow_tbl_type); } /* Function to handle the default global templates that are allocated during @@ -2838,6 +2847,12 @@ ulp_mapper_flow_create(struct bnxt_ulp_context *ulp_ctx, return -EINVAL; } + /* Protect flow creation */ + if (bnxt_ulp_cntxt_acquire_fdb_lock(ulp_ctx)) { + BNXT_TF_DBG(ERR, "Flow db lock acquire failed\n"); + return -EINVAL; + } + /* Allocate a Flow ID for attaching all resources for the flow to. * Once allocated, all errors have to walk the list of resources and * free each of them. @@ -2848,6 +2863,7 @@ ulp_mapper_flow_create(struct bnxt_ulp_context *ulp_ctx, &parms.fid); if (rc) { BNXT_TF_DBG(ERR, "Unable to allocate flow table entry\n"); + bnxt_ulp_cntxt_release_fdb_lock(ulp_ctx); return rc; } @@ -2871,10 +2887,12 @@ ulp_mapper_flow_create(struct bnxt_ulp_context *ulp_ctx, } *flowid = parms.fid; + bnxt_ulp_cntxt_release_fdb_lock(ulp_ctx); return rc; flow_error: + bnxt_ulp_cntxt_release_fdb_lock(ulp_ctx); /* Free all resources that were allocated during flow creation */ trc = ulp_mapper_flow_destroy(ulp_ctx, parms.fid, BNXT_ULP_REGULAR_FLOW_TABLE); -- 2.21.1 (Apple Git-122.3)