From: Shuanglin Wang <shuanglin.wang@broadcom.com>
TF supports the flow scale query feature for OVS application.
The resource usage is tracked when opening a TF session
or adding/deleting a flow. The resources includes WC TCAM,
EM, Action, Counter, Meter, ACT_ENCAP, ACT_ENCAP, and SP_SMAC.
User can query the resource usage using niccli.
This feature is disabled by default. Using the build flag
-DTF_FLOW_SCALE_QUERY to enable it.
Improvement on flow scale query feature
Several improvements on flow scale query feature:
1. Some default rules require both RX and TX resources;
need to update usage states on both directions.
2. Update resource usage state for regular flows only.
3. Added a buffer dirty state to avoid unnecessary
state sync with firmware.
Signed-off-by: Shuanglin Wang <shuanglin.wang@broadcom.com>
Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
Reviewed-by: Kishore Padmanabha <kishore.padmanabha@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
---
drivers/net/bnxt/tf_ulp/ulp_flow_db.c | 17 +++++++++++++++++
drivers/net/bnxt/tf_ulp/ulp_mapper.c | 13 +++++++++++++
2 files changed, 30 insertions(+)
@@ -14,6 +14,9 @@
#include "ulp_flow_db.h"
#include "ulp_fc_mgr.h"
#include "ulp_tun.h"
+#ifdef TF_FLOW_SCALE_QUERY
+#include "tf_resources.h"
+#endif /* TF_FLOW_SCALE_QUERY */
#define ULP_FLOW_DB_RES_DIR_BIT 31
#define ULP_FLOW_DB_RES_DIR_MASK 0x80000000
@@ -958,8 +961,15 @@ ulp_flow_db_flush_flows(struct bnxt_ulp_context *ulp_ctx,
return -EINVAL;
}
+#ifdef TF_FLOW_SCALE_QUERY
+ tf_resc_pause_usage_update();
+#endif
while (!ulp_flow_db_next_entry_get(flow_db, flow_type, &fid))
ulp_mapper_resources_free(ulp_ctx, flow_type, fid, NULL);
+#ifdef TF_FLOW_SCALE_QUERY
+ tf_resc_resume_usage_update();
+ tf_resc_usage_update_all(ulp_ctx->bp);
+#endif
bnxt_ulp_cntxt_release_fdb_lock(ulp_ctx);
@@ -996,6 +1006,9 @@ ulp_flow_db_function_flow_flush(struct bnxt_ulp_context *ulp_ctx,
return -EINVAL;
}
+#ifdef TF_FLOW_SCALE_QUERY
+ tf_resc_pause_usage_update();
+#endif
while (!ulp_flow_db_next_entry_get(flow_db, BNXT_ULP_FDB_TYPE_REGULAR,
&flow_id)) {
if (flow_db->func_id_tbl[flow_id] == func_id)
@@ -1004,6 +1017,10 @@ ulp_flow_db_function_flow_flush(struct bnxt_ulp_context *ulp_ctx,
flow_id,
NULL);
}
+#ifdef TF_FLOW_SCALE_QUERY
+ tf_resc_resume_usage_update();
+ tf_resc_usage_update_all(ulp_ctx->bp);
+#endif
bnxt_ulp_cntxt_release_fdb_lock(ulp_ctx);
return 0;
}
@@ -21,6 +21,9 @@
#include "ulp_port_db.h"
#include "ulp_ha_mgr.h"
#include "bnxt_tf_pmd_shim.h"
+#ifdef TF_FLOW_SCALE_QUERY
+#include "tf_resources.h"
+#endif /* TF_FLOW_SCALE_QUERY */
static uint8_t mapper_fld_zeros[16] = { 0 };
@@ -4315,6 +4318,12 @@ ulp_mapper_resources_free(struct bnxt_ulp_context *ulp_ctx,
if (rc)
frc = rc;
+#ifdef TF_FLOW_SCALE_QUERY
+ /* update for regular flows only */
+ if (flow_type == BNXT_ULP_FDB_TYPE_REGULAR)
+ tf_resc_usage_update_all(ulp_ctx->bp);
+#endif /* TF_FLOW_SCALE_QUERY */
+
return frc;
}
@@ -4464,6 +4473,10 @@ ulp_mapper_flow_create(struct bnxt_ulp_context *ulp_ctx,
goto flow_error;
}
+#ifdef TF_FLOW_SCALE_QUERY
+ tf_resc_usage_update_all(ulp_ctx->bp);
+#endif /* TF_FLOW_SCALE_QUERY */
+
return rc;
batch_error: