[dpdk-dev] [PATCH 2/5] net/bnxt: action record external pool updates

Venkat Duvvuru venkatkumar.duvvuru at broadcom.com
Sat Apr 25 05:47:23 CEST 2020


From: Farah Smith <farah.smith at broadcom.com>

- Added support variable sized action records
- Additional error checking on table scope params
- Single external pool supported per direction
- Changed to return action record pointer
- Allows action pool to fully utilize the number of flows

Signed-off-by: Farah Smith <farah.smith at broadcom.com>
Signed-off-by: Mike Baucom <michael.baucom at broadcom.com>
Reviewed-by: Peter Spreadborough <peter.spreadborough at broadcom.com>
Reviewed-by: Kishore Padmanabha <kishore.padmanabha at broadcom.com>
---
 drivers/net/bnxt/tf_core/tf_core.c    |   3 -
 drivers/net/bnxt/tf_core/tf_core.h    |  15 ++--
 drivers/net/bnxt/tf_core/tf_rm.c      |   3 -
 drivers/net/bnxt/tf_core/tf_session.h |   6 --
 drivers/net/bnxt/tf_core/tf_tbl.c     | 136 +++++++++++++---------------------
 drivers/net/bnxt/tf_core/tf_tbl.h     |   4 +-
 6 files changed, 62 insertions(+), 105 deletions(-)

diff --git a/drivers/net/bnxt/tf_core/tf_core.c b/drivers/net/bnxt/tf_core/tf_core.c
index fc7d638..cf9f36a 100644
--- a/drivers/net/bnxt/tf_core/tf_core.c
+++ b/drivers/net/bnxt/tf_core/tf_core.c
@@ -175,9 +175,6 @@ tf_open_session(struct tf                    *tfp,
 	/* Setup hash seeds */
 	tf_seeds_init(session);
 
-	/* Initialize external pool data structures */
-	tf_init_tbl_pool(session);
-
 	session->ref_count++;
 
 	/* Return session ID */
diff --git a/drivers/net/bnxt/tf_core/tf_core.h b/drivers/net/bnxt/tf_core/tf_core.h
index 6a1f3a1..4b60973 100644
--- a/drivers/net/bnxt/tf_core/tf_core.h
+++ b/drivers/net/bnxt/tf_core/tf_core.h
@@ -83,7 +83,7 @@ enum tf_mem {
 
 /** EEM record AR helper
  *
- * Helpers to handle the Action Record Pointer in the EEM Record Entry.
+ * Helper to handle the Action Record Pointer in the EEM Record Entry.
  *
  * Convert absolute offset to action record pointer in EEM record entry
  * Convert action record pointer in EEM record entry to absolute offset
@@ -91,8 +91,6 @@ enum tf_mem {
 #define TF_ACT_REC_OFFSET_2_PTR(offset) ((offset) >> 4)
 #define TF_ACT_REC_PTR_2_OFFSET(offset) ((offset) << 4)
 
-#define TF_ACT_REC_INDEX_2_OFFSET(idx) ((idx) << 9)
-
 /*
  * Helper Macros
  */
@@ -943,8 +941,6 @@ enum tf_tbl_type {
 	 * scope. Internal types are not.
 	 */
 	TF_TBL_TYPE_EXT,
-	/** Future - external pool of size0 entries */
-	TF_TBL_TYPE_EXT_0,
 	TF_TBL_TYPE_MAX
 };
 
@@ -960,6 +956,10 @@ struct tf_alloc_tbl_entry_parms {
 	 */
 	enum tf_tbl_type type;
 	/**
+	 * [in] Table scope identifier (ignored unless TF_TBL_TYPE_EXT)
+	 */
+	uint32_t tbl_scope_id;
+	/**
 	 * [in] Enable search for matching entry. If the table type is
 	 * internal the shadow copy will be searched before
 	 * alloc. Session must be configured with shadow copy enabled.
@@ -1029,6 +1029,10 @@ struct tf_free_tbl_entry_parms {
 	 */
 	enum tf_tbl_type type;
 	/**
+	 * [in] Table scope identifier (ignored unless TF_TBL_TYPE_EXT)
+	 */
+	uint32_t tbl_scope_id;
+	/**
 	 * [in] Index to free
 	 */
 	uint32_t idx;
@@ -1070,7 +1074,6 @@ int tf_free_tbl_entry(struct tf *tfp,
 struct tf_set_tbl_entry_parms {
 	/**
 	 * [in] Table scope identifier
-	 *
 	 */
 	uint32_t tbl_scope_id;
 	/**
diff --git a/drivers/net/bnxt/tf_core/tf_rm.c b/drivers/net/bnxt/tf_core/tf_rm.c
index a5e96f29..38b1e71 100644
--- a/drivers/net/bnxt/tf_core/tf_rm.c
+++ b/drivers/net/bnxt/tf_core/tf_rm.c
@@ -3104,7 +3104,6 @@ tf_rm_lookup_tbl_type_pool(struct tf_session *tfs,
 		break;
 	/* No bitalloc pools for these types */
 	case TF_TBL_TYPE_EXT:
-	case TF_TBL_TYPE_EXT_0:
 	default:
 		break;
 	}
@@ -3211,7 +3210,6 @@ tf_rm_convert_tbl_type(enum tf_tbl_type type,
 	case TF_TBL_TYPE_ACT_MODIFY_IPV6_SRC:
 	case TF_TBL_TYPE_VNIC_SVIF:
 	case TF_TBL_TYPE_EXT:   /* No pools for this type */
-	case TF_TBL_TYPE_EXT_0: /* No pools for this type */
 	default:
 		*hcapi_type = -1;
 		rc = -EOPNOTSUPP;
@@ -3277,7 +3275,6 @@ tf_rm_convert_index(struct tf_session *tfs,
 	/* Not yet supported */
 	case TF_TBL_TYPE_VNIC_SVIF:
 	case TF_TBL_TYPE_EXT:   /* No pools for this type */
-	case TF_TBL_TYPE_EXT_0: /* No pools for this type */
 	default:
 		return -EOPNOTSUPP;
 	}
diff --git a/drivers/net/bnxt/tf_core/tf_session.h b/drivers/net/bnxt/tf_core/tf_session.h
index fed34f1..50ef2d5 100644
--- a/drivers/net/bnxt/tf_core/tf_session.h
+++ b/drivers/net/bnxt/tf_core/tf_session.h
@@ -289,12 +289,6 @@ struct tf_session {
 
 	/** Table scope array */
 	struct tf_tbl_scope_cb tbl_scopes[TF_NUM_TBL_SCOPE];
-
-	/** Each external pool is associated with a single table scope
-	 *  For each external pool store the associated table scope in
-	 *  this data structure
-	 */
-	uint32_t ext_pool_2_scope[TF_DIR_MAX][TF_EXT_POOL_CNT_MAX];
 };
 
 #endif /* _TF_SESSION_H_ */
diff --git a/drivers/net/bnxt/tf_core/tf_tbl.c b/drivers/net/bnxt/tf_core/tf_tbl.c
index 17df274..236affe 100644
--- a/drivers/net/bnxt/tf_core/tf_tbl.c
+++ b/drivers/net/bnxt/tf_core/tf_tbl.c
@@ -701,6 +701,21 @@ tf_em_validate_num_entries(struct tf_tbl_scope_cb *tbl_scope_cb,
 		}
 	}
 
+	if (parms->rx_num_flows_in_k != 0 &&
+	    (parms->rx_max_key_sz_in_bits / 8 == 0)) {
+		PMD_DRV_LOG(ERR,
+			    "EEM: Rx key size required: %u\n",
+			    (parms->rx_max_key_sz_in_bits));
+		return -EINVAL;
+	}
+
+	if (parms->tx_num_flows_in_k != 0 &&
+	    (parms->tx_max_key_sz_in_bits / 8 == 0)) {
+		PMD_DRV_LOG(ERR,
+			    "EEM: Tx key size required: %u\n",
+			    (parms->tx_max_key_sz_in_bits));
+		return -EINVAL;
+	}
 	/* Rx */
 	tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[KEY0_TABLE].num_entries =
 		parms->rx_num_flows_in_k * TF_KILOBYTE;
@@ -715,7 +730,7 @@ tf_em_validate_num_entries(struct tf_tbl_scope_cb *tbl_scope_cb,
 	tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[RECORD_TABLE].num_entries =
 		parms->rx_num_flows_in_k * TF_KILOBYTE;
 	tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[RECORD_TABLE].entry_size =
-		parms->tx_max_action_entry_sz_in_bits / 8;
+		parms->rx_max_action_entry_sz_in_bits / 8;
 
 	tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[EFC_TABLE].num_entries =
 		0;
@@ -954,14 +969,10 @@ tf_free_tbl_entry_shadow(struct tf_session *tfs,
 /**
  * Create External Tbl pool of memory indexes.
  *
- * [in] session
- *   Pointer to session
  * [in] dir
  *   direction
  * [in] tbl_scope_cb
  *   pointer to the table scope
- * [in] tbl_scope_id
- *   id of the table scope
  * [in] num_entries
  *   number of entries to write
  * [in] entry_sz_bytes
@@ -973,18 +984,16 @@ tf_free_tbl_entry_shadow(struct tf_session *tfs,
  *          - Failure, entry not allocated, out of resources
  */
 static int
-tf_create_tbl_pool_external(struct tf_session *session,
-			    enum tf_dir dir,
+tf_create_tbl_pool_external(enum tf_dir dir,
 			    struct tf_tbl_scope_cb *tbl_scope_cb,
-			    uint32_t table_scope_id,
 			    uint32_t num_entries,
 			    uint32_t entry_sz_bytes)
-
 {
 	struct tfp_calloc_parms parms;
-	uint32_t i, j;
+	uint32_t i;
+	int32_t j;
 	int rc = 0;
-	struct stack *pool = &tbl_scope_cb->ext_pool[dir][TF_EXT_POOL_0];
+	struct stack *pool = &tbl_scope_cb->ext_act_pool[dir];
 
 	parms.nitems = num_entries;
 	parms.size = sizeof(uint32_t);
@@ -1009,18 +1018,23 @@ tf_create_tbl_pool_external(struct tf_session *session,
 	/* Save the  malloced memory address so that it can
 	 * be freed when the table scope is freed.
 	 */
-	tbl_scope_cb->ext_pool_mem[dir][TF_EXT_POOL_0] =
-		(uint32_t *)parms.mem_va;
+	tbl_scope_cb->ext_act_pool_mem[dir] = (uint32_t *)parms.mem_va;
 
-	/* Fill pool with indexes
+	/* Fill pool with indexes in reverse
 	 */
-	j = num_entries * entry_sz_bytes - 1;
+	j = (num_entries - 1) * entry_sz_bytes;
 
 	for (i = 0; i < num_entries; i++) {
 		rc = stack_push(pool, j);
 		if (rc != 0) {
-			PMD_DRV_LOG(ERR, "%d TBL: stack failure %s\n",
-				    dir, strerror(-rc));
+			PMD_DRV_LOG(ERR, "%s TBL: stack failure %s\n",
+				    tf_dir_2_str(dir), strerror(-rc));
+			goto cleanup;
+		}
+
+		if (j < 0) {
+			PMD_DRV_LOG(ERR, "%d TBL: invalid offset (%d)\n",
+				    dir, j);
 			goto cleanup;
 		}
 		j -= entry_sz_bytes;
@@ -1032,10 +1046,6 @@ tf_create_tbl_pool_external(struct tf_session *session,
 			    dir, strerror(-rc));
 		goto cleanup;
 	}
-	/* Set the table scope associated with the pool
-	 */
-	session->ext_pool_2_scope[dir][TF_EXT_POOL_0] = table_scope_id;
-
 	return 0;
 cleanup:
 	tfp_free((void *)parms.mem_va);
@@ -1045,8 +1055,6 @@ tf_create_tbl_pool_external(struct tf_session *session,
 /**
  * Destroy External Tbl pool of memory indexes.
  *
- * [in] session
- *   Pointer to session
  * [in] dir
  *   direction
  * [in] tbl_scope_cb
@@ -1054,18 +1062,13 @@ tf_create_tbl_pool_external(struct tf_session *session,
  *
  */
 static void
-tf_destroy_tbl_pool_external(struct tf_session *session,
-			    enum tf_dir dir,
-			    struct tf_tbl_scope_cb *tbl_scope_cb)
+tf_destroy_tbl_pool_external(enum tf_dir dir,
+			     struct tf_tbl_scope_cb *tbl_scope_cb)
 {
-	uint32_t *ext_pool_mem =
-		tbl_scope_cb->ext_pool_mem[dir][TF_EXT_POOL_0];
+	uint32_t *ext_act_pool_mem =
+		tbl_scope_cb->ext_act_pool_mem[dir];
 
-	tfp_free(ext_pool_mem);
-
-	/* Set the table scope associated with the pool
-	 */
-	session->ext_pool_2_scope[dir][TF_EXT_POOL_0] = TF_TBL_SCOPE_INVALID;
+	tfp_free(ext_act_pool_mem);
 }
 
 /**
@@ -1088,7 +1091,6 @@ tf_alloc_tbl_entry_pool_external(struct tf *tfp,
 	int rc;
 	uint32_t index;
 	struct tf_session *tfs;
-	uint32_t tbl_scope_id;
 	struct tf_tbl_scope_cb *tbl_scope_cb;
 	struct stack *pool;
 
@@ -1107,26 +1109,17 @@ tf_alloc_tbl_entry_pool_external(struct tf *tfp,
 
 	tfs = (struct tf_session *)(tfp->session->core_data);
 
-	if (parms->type != TF_TBL_TYPE_EXT) {
-		PMD_DRV_LOG(ERR,
-			    "dir:%d, Type not supported, type:%d\n",
-			    parms->dir,
-			    parms->type);
-		return -EOPNOTSUPP;
-	}
-
 	/* Get the pool info from the table scope
 	 */
-	tbl_scope_id = tfs->ext_pool_2_scope[parms->dir][TF_EXT_POOL_0];
-	tbl_scope_cb = tbl_scope_cb_find(tfs, tbl_scope_id);
+	tbl_scope_cb = tbl_scope_cb_find(tfs, parms->tbl_scope_id);
 
 	if (tbl_scope_cb == NULL) {
 		PMD_DRV_LOG(ERR,
-			    "dir:%d, table scope not allocated\n",
-			    parms->dir);
+					"%s, table scope not allocated\n",
+					tf_dir_2_str(parms->dir));
 		return -EINVAL;
 	}
-	pool = &tbl_scope_cb->ext_pool[parms->dir][TF_EXT_POOL_0];
+	pool = &tbl_scope_cb->ext_act_pool[parms->dir];
 
 	/* Allocate an element
 	 */
@@ -1246,12 +1239,11 @@ tf_alloc_tbl_entry_pool_internal(struct tf *tfp,
  */
 static int
 tf_free_tbl_entry_pool_external(struct tf *tfp,
-		       struct tf_free_tbl_entry_parms *parms)
+				struct tf_free_tbl_entry_parms *parms)
 {
 	int rc = 0;
 	struct tf_session *tfs;
 	uint32_t index;
-	uint32_t tbl_scope_id;
 	struct tf_tbl_scope_cb *tbl_scope_cb;
 	struct stack *pool;
 
@@ -1270,26 +1262,17 @@ tf_free_tbl_entry_pool_external(struct tf *tfp,
 
 	tfs = (struct tf_session *)(tfp->session->core_data);
 
-	if (parms->type != TF_TBL_TYPE_EXT) {
-		PMD_DRV_LOG(ERR,
-			    "dir:%d, Type not supported, type:%d\n",
-			    parms->dir,
-			    parms->type);
-		return -EOPNOTSUPP;
-	}
-
 	/* Get the pool info from the table scope
 	 */
-	tbl_scope_id = tfs->ext_pool_2_scope[parms->dir][TF_EXT_POOL_0];
-	tbl_scope_cb = tbl_scope_cb_find(tfs, tbl_scope_id);
+	tbl_scope_cb = tbl_scope_cb_find(tfs, parms->tbl_scope_id);
 
 	if (tbl_scope_cb == NULL) {
 		PMD_DRV_LOG(ERR,
-			    "dir:%d, table scope error\n",
+			    "dir:%d, Session info invalid\n",
 			    parms->dir);
 		return -EINVAL;
 	}
-	pool = &tbl_scope_cb->ext_pool[parms->dir][TF_EXT_POOL_0];
+	pool = &tbl_scope_cb->ext_act_pool[parms->dir];
 
 	index = parms->idx;
 
@@ -1390,18 +1373,6 @@ tf_free_tbl_entry_pool_internal(struct tf *tfp,
 	return rc;
 }
 
-/* API defined in tf_tbl.h */
-void
-tf_init_tbl_pool(struct tf_session *session)
-{
-	enum tf_dir dir;
-
-	for (dir = 0; dir < TF_DIR_MAX; dir++) {
-		session->ext_pool_2_scope[dir][TF_EXT_POOL_0] =
-			TF_TBL_SCOPE_INVALID;
-	}
-}
-
 /* API defined in tf_em.h */
 struct tf_tbl_scope_cb *
 tbl_scope_cb_find(struct tf_session *session,
@@ -1447,8 +1418,7 @@ tf_free_eem_tbl_scope_cb(struct tf *tfp,
 	for (dir = 0; dir < TF_DIR_MAX; dir++) {
 		/* Free associated external pools
 		 */
-		tf_destroy_tbl_pool_external(session,
-					     dir,
+		tf_destroy_tbl_pool_external(dir,
 					     tbl_scope_cb);
 		tf_msg_em_op(tfp,
 			     dir,
@@ -1551,12 +1521,10 @@ tf_alloc_eem_tbl_scope(struct tf *tfp,
 		 * Initially, this is a single fixed size pool for all external
 		 * actions related to a single table scope.
 		 */
-		rc = tf_create_tbl_pool_external(session,
-						 dir,
-						 tbl_scope_cb,
-						 index,
-						 TF_EXT_POOL_ENTRY_CNT,
-						 TF_EXT_POOL_ENTRY_SZ_BYTES);
+		rc = tf_create_tbl_pool_external(dir,
+					    tbl_scope_cb,
+					    em_tables[RECORD_TABLE].num_entries,
+					    em_tables[RECORD_TABLE].entry_size);
 		if (rc) {
 			PMD_DRV_LOG(ERR,
 				    "%d TBL: Unable to allocate idx pools %s\n",
@@ -1600,13 +1568,12 @@ tf_set_tbl_entry(struct tf *tfp,
 
 	if (parms->type == TF_TBL_TYPE_EXT) {
 		void *base_addr;
-		uint32_t offset = TF_ACT_REC_INDEX_2_OFFSET(parms->idx);
+		uint32_t offset = parms->idx;
 		uint32_t tbl_scope_id;
 
 		session = (struct tf_session *)(tfp->session->core_data);
 
-		tbl_scope_id =
-			session->ext_pool_2_scope[parms->dir][TF_EXT_POOL_0];
+		tbl_scope_id = parms->tbl_scope_id;
 
 		if (tbl_scope_id == TF_TBL_SCOPE_INVALID)  {
 			PMD_DRV_LOG(ERR,
@@ -1618,7 +1585,6 @@ tf_set_tbl_entry(struct tf *tfp,
 		/* Get the table scope control block associated with the
 		 * external pool
 		 */
-
 		tbl_scope_cb = tbl_scope_cb_find(session, tbl_scope_id);
 
 		if (tbl_scope_cb == NULL)
diff --git a/drivers/net/bnxt/tf_core/tf_tbl.h b/drivers/net/bnxt/tf_core/tf_tbl.h
index 5d3ea71..bdc6288 100644
--- a/drivers/net/bnxt/tf_core/tf_tbl.h
+++ b/drivers/net/bnxt/tf_core/tf_tbl.h
@@ -72,8 +72,8 @@ struct tf_tbl_scope_cb {
 	int index;
 	struct tf_em_ctx_mem_info  em_ctx_info[TF_DIR_MAX];
 	struct tf_em_caps          em_caps[TF_DIR_MAX];
-	struct stack               ext_pool[TF_DIR_MAX][TF_EXT_POOL_CNT_MAX];
-	uint32_t              *ext_pool_mem[TF_DIR_MAX][TF_EXT_POOL_CNT_MAX];
+	struct stack               ext_act_pool[TF_DIR_MAX];
+	uint32_t                  *ext_act_pool_mem[TF_DIR_MAX];
 };
 
 /** Hardware Page sizes supported for EEM: 4K, 8K, 64K, 256K, 1M, 2M, 4M, 1G.
-- 
2.7.4



More information about the dev mailing list