commit 6e71e590205ea57c3132643cc2dc8ad4b2674fab
parent f20796f48281634187551ac142558fffda2902ae
Author: Broadcom SDK Release <sdk.releases@broadcom.com>
Date: Mon, 20 Jan 2020 15:42:04 -0800
SDK-179672: Improvement has been done for ALPM error tracking: Added route ...
Devices: 56980_A0,56980_B0,AllChips
Module: ALPM
Symptom:
Debuggability enhancements for ALPM error messages in syslog followed by
crash
Improvement has been done for ALPM error tracking: Added route
sequence in ALPM error message and trace log, if alpm_trace_enable=1.
"Alpm stat show" includes first 127 ALPM error messages recorded.
Diffstat:
7 files changed, 93 insertions(+), 10 deletions(-)
diff --git a/sdk-6.5.16/include/bcm_int/esw/alpm.h b/sdk-6.5.16/include/bcm_int/esw/alpm.h
@@ -352,6 +352,7 @@ typedef struct _alpm_cb_stat_s {
uint32 c_ripple;
uint32 c_bnkshrk;
uint32 c_bnkfree;
+ uint32 c_full;
/* Split misplaced case counter */
uint32 c_spl_mp_cs1;
@@ -432,12 +433,28 @@ typedef struct _alpm_ctrl_s {
#define _ALPM_DBG_INFO_ALL 0xffffffff
uint32 _alpm_dbg_info_bmp;
+#define _ALPM_ERR_MSG_BUF_CNT 128
+#define _ALPM_ERR_MSG_BUF_ENT_SZ 128
+ char *_alpm_err_msg_buf;
+
uint32 _alpm_schan_fifo_handle;
struct alpm_functions_s *alpm_driver;
} _alpm_ctrl_t;
+#define _ALPM_ERR_MSG_ENT(u, idx) (ALPMC(u)->_alpm_err_msg_buf+1+((idx)*_ALPM_ERR_MSG_BUF_ENT_SZ))
+/* First char stores the current index */
+#define _ALPM_ERR_MSG_CUR_IDX(u) ((ALPMC(u)->_alpm_err_msg_buf[0]))
+#define _ALPM_ERR_MSG_INSERT(u, msg) \
+ do { \
+ uint8 cur_idx = _ALPM_ERR_MSG_CUR_IDX(u);\
+ if (cur_idx < _ALPM_ERR_MSG_BUF_CNT - 1) { \
+ sal_memcpy(_ALPM_ERR_MSG_ENT(u, cur_idx), msg, _ALPM_ERR_MSG_BUF_ENT_SZ); \
+ _ALPM_ERR_MSG_CUR_IDX(u) = cur_idx + 1; \
+ } \
+ } while(0)
+
extern _alpm_ctrl_t *alpm_control[SOC_MAX_NUM_DEVICES];
/* bcm_esw_alpm_pvt_trav_cb */
@@ -995,9 +1012,21 @@ do { \
} \
} while (0)
+extern char alpm_tmpbuf[_ALPM_ERR_MSG_BUF_ENT_SZ];
+extern void alpm_util_snprintf(const char *fmt, ...);
+
+#define ALPM_ERR_MSG_LOG(stuff_) do { \
+ ALPM_LOG(BSL_LS_BCM_ALPM|BSL_ERROR, ("#%d: ", ALPMTR_CNT(u)));\
+ ALPM_LOG(BSL_LS_BCM_ALPM|BSL_ERROR, stuff_);\
+ sal_memset(alpm_tmpbuf, 0, sizeof(alpm_tmpbuf));\
+ sal_sprintf(alpm_tmpbuf, "#%d: ", ALPMTR_CNT(u));\
+ alpm_util_snprintf stuff_;\
+ _ALPM_ERR_MSG_INSERT(u, alpm_tmpbuf); \
+ } while (0)
+
/* Any layer log macros */
#define ALPM_FATAL(stuff_) ALPM_LOG(BSL_LS_BCM_ALPM|BSL_FATAL, stuff_)
-#define ALPM_ERR(stuff_) ALPM_LOG(BSL_LS_BCM_ALPM|BSL_ERROR, stuff_)
+#define ALPM_ERR(stuff_) ALPM_ERR_MSG_LOG(stuff_)
#define ALPM_WARN(stuff_) ALPM_LOG(BSL_LS_BCM_ALPM|BSL_WARN, stuff_)
#define ALPM_INFO(stuff_) ALPM_LOG(BSL_LS_BCM_ALPM|BSL_INFO, stuff_)
#define ALPM_VERB(stuff_) ALPM_LOG(BSL_LS_BCM_ALPM|BSL_VERBOSE, stuff_)
diff --git a/sdk-6.5.16/include/bcm_int/esw/alpm_util.h b/sdk-6.5.16/include/bcm_int/esw/alpm_util.h
@@ -22,6 +22,7 @@ typedef struct _alpm_log_s {
int vrf;
int nh_idx;
int rc; /* op returned code */
+ int seq; /* route sequence */
uint32 flags;
union u {
bcm_ip_t ip;
diff --git a/sdk-6.5.16/src/appl/diag/esw/l3.c b/sdk-6.5.16/src/appl/diag/esw/l3.c
@@ -5541,7 +5541,7 @@ _cmd_esw_alpm_trace_dump(int u, int showflags, char *filename)
{
int rv = BCM_E_NONE;
_alpm_log_t *p;
- char data[256];
+ char data[300];
#ifndef NO_FILEIO
FILE *fp = NULL;
#endif
diff --git a/sdk-6.5.16/src/bcm/esw/alpm2/alpm.c b/sdk-6.5.16/src/bcm/esw/alpm2/alpm.c
@@ -850,14 +850,18 @@ alpm_pvt_update(int u, _alpm_cb_t *acb, _bcm_defip_cfg_t *lpm_cfg, uint32 write_
}
} else {
upr_acb = ACB_UPR(u, acb);
- ALPM_IEG(alpm_cb_find(u, upr_acb, lpm_cfg, &pvt_node, &bkt_node));
- rv = alpm_bkt_ent_write(u, upr_acb, pvt_node, lpm_cfg,
- bkt_node->ent_idx, write_flags);
+ rv = alpm_cb_find(u, upr_acb, lpm_cfg, &pvt_node, &bkt_node);
+ if (BCM_SUCCESS(rv)) {
+ rv = alpm_bkt_ent_write(u, upr_acb, pvt_node, lpm_cfg,
+ bkt_node->ent_idx, write_flags);
+ } else {
+ ALPM_ERR(("pvt_update->alpm_cb_find: rv %d, ACB.%d pvt_node=%p, bkt_node=%p\n",
+ rv, ACB_IDX(upr_acb), pvt_node, bkt_node));
+ }
}
ALPM_INFO(("**ACB(%d).PVT.UPD rv %d\n", ACB_IDX(acb), rv));
-bad:
return rv;
}
@@ -2970,6 +2974,7 @@ retry:
/* Case 2.2.2, split given l3 pvt_node first */
rv = alpm_cb_split(u, acb, lpm_cfg, &bkt_info, 0xffff);
+
if (BCM_SUCCESS(rv)) {
lpm_cfg->spl_pn = NULL;
lpm_cfg->spl_key_len = 0;
@@ -4435,6 +4440,9 @@ retry_spl:
VRF_ROUTE_ADD(acb, vrf_id, ipt);
_exit:
lpm_cfg->tcam_write = NULL;
+ if (rv == BCM_E_FULL) {
+ acb->acb_cnt.c_full++;
+ }
return rv;
bad:
@@ -4445,6 +4453,9 @@ bad:
alpm_util_free(bkt_node);
}
lpm_cfg->tcam_write = NULL;
+ if (rv == BCM_E_FULL) {
+ acb->acb_cnt.c_full++;
+ }
return rv;
}
@@ -4465,6 +4476,10 @@ bcm_esw_alpm_ctrl_deinit(int u)
alpm_util_free(ALPMC(u)->_alpm_merge_state);
}
+ if (ALPMC(u)->_alpm_err_msg_buf != NULL) {
+ alpm_util_free(ALPMC(u)->_alpm_err_msg_buf);
+ }
+
if (ALPMC(u) != NULL) {
alpm_util_free(ALPMC(u));
ALPMC(u) = NULL;
@@ -4550,6 +4565,9 @@ bcm_esw_alpm_ctrl_init(int u)
alloc_sz = sizeof(int) * vrf_id_cnt;
ALPM_ALLOC_EG(ALPMC(u)->_alpm_merge_state, alloc_sz, "_alpm_merge_state");
+ alloc_sz = _ALPM_ERR_MSG_BUF_CNT * _ALPM_ERR_MSG_BUF_ENT_SZ;
+ ALPM_ALLOC_EG(ALPMC(u)->_alpm_err_msg_buf, alloc_sz, "_alpm_err_msg_buf");
+
if (soc_feature(u, soc_feature_alpm2)) {
if (SOC_IS_TOMAHAWK3(u)) {
ALPMC(u)->alpm_driver = &th3_alpm_driver;
@@ -4594,6 +4612,9 @@ bcm_esw_alpm_ctrl_cleanup(int u)
alloc_sz = sizeof(int) * vrf_id_cnt;
sal_memset(ALPMC(u)->_alpm_merge_state, 0, alloc_sz);
+ alloc_sz = _ALPM_ERR_MSG_BUF_CNT * _ALPM_ERR_MSG_BUF_ENT_SZ;
+ sal_memset(ALPMC(u)->_alpm_err_msg_buf, 0, alloc_sz);
+
rv = ALPM_DRV(u)->alpm_ctrl_cleanup(u);
return rv;
}
@@ -4767,6 +4788,9 @@ bcm_esw_alpm_insert(int u, _bcm_defip_cfg_t *lpm_cfg)
rv = BCM_E_NONE;
}
}
+ if (rv == BCM_E_FULL) {
+ acb->acb_cnt.c_full++;
+ }
return(rv);
}
@@ -4786,7 +4810,11 @@ bcm_esw_alpm_insert(int u, _bcm_defip_cfg_t *lpm_cfg)
/* Insert prefix into trie */
/* Split trie : Insertion into trie results into Split */
/* Allocate a TCAM entry for PIVOT and bucket and move entries */
- ALPM_IER_PRT_EXCEPT(alpm_cb_path_construct(u, acb, lpm_cfg), BCM_E_FULL);
+ rv = alpm_cb_path_construct(u, acb, lpm_cfg);
+ if (rv == BCM_E_FULL) {
+ acb->acb_cnt.c_full++;
+ }
+ ALPM_IER_PRT_EXCEPT(rv, BCM_E_FULL);
rv = alpm_cb_insert(u, acb, lpm_cfg);
if (BCM_SUCCESS(rv)) {
@@ -5781,6 +5809,12 @@ alpm_cb_stat_dump(int u, int acb_bmp)
cli_out("\toff\n");
}
+ cli_out("ALPM recorded error messages:\n");
+ for (i = 0; i < _ALPM_ERR_MSG_CUR_IDX(u); i++) {
+ cli_out("%3d: %s", i, _ALPM_ERR_MSG_ENT(u, i));
+ }
+ cli_out("\n");
+
alpm_util_mem_stat_get(&alloc_cnt, &free_cnt);
cli_out("ALPM Host mem: alloc %8d free %8d\n", alloc_cnt, free_cnt);
for (i = 0; i < ACB_CNT(u); i++) {
@@ -5838,7 +5872,7 @@ alpm_cb_stat_dump(int u, int acb_bmp)
cli_out("\tSMCS21 : %8d\n", acb->acb_cnt.c_spl_mp_cs21);
cli_out("\tSMCS221: %8d\n", acb->acb_cnt.c_spl_mp_cs221);
cli_out("\tSMCS222: %8d\n", acb->acb_cnt.c_spl_mp_cs222);
-
+ cli_out("\tFULL: %8d\n", acb->acb_cnt.c_full);
cli_out("\n");
}
}
diff --git a/sdk-6.5.16/src/bcm/esw/alpm2/alpm_tr.c b/sdk-6.5.16/src/bcm/esw/alpm2/alpm_tr.c
@@ -139,6 +139,7 @@ alpm_trace_log(int u, int op, _bcm_defip_cfg_t *cfg, int nh_idx, int rc)
ALPMTR_CURR(u)->op = op;
ALPMTR_CURR(u)->rc = rc;
+ ALPMTR_CURR(u)->seq = ALPMTR_CNT(u);
if (cfg) {
ALPMTR_CURR(u)->flags = cfg->defip_flags;
ALPMTR_CURR(u)->vrf = cfg->defip_vrf;
@@ -197,7 +198,7 @@ alpm_trace_print(int u, int showflags, _alpm_log_t *p, char *data)
{
int egress_idx_min;
char flags_st[14] = {0};
- char rc_st[20] = {0};
+ char rc_st[40] = {0};
char ip_st[SAL_IPADDR_STR_LEN]; /* only for IPv4 */
char mask_st[SAL_IPADDR_STR_LEN];
@@ -206,7 +207,9 @@ alpm_trace_print(int u, int showflags, _alpm_log_t *p, char *data)
rc_st[0] = 0;
if (BCM_FAILURE(p->rc)) {
- sal_sprintf(rc_st, "; # return failed (%d)", p->rc);
+ sal_sprintf(rc_st, "; #seq=%d return failed (%d)", p->seq, p->rc);
+ } else {
+ sal_sprintf(rc_st, "; #seq=%d", p->seq);
}
flags_st[0] = 0;
diff --git a/sdk-6.5.16/src/bcm/esw/alpm2/alpm_util.c b/sdk-6.5.16/src/bcm/esw/alpm2/alpm_util.c
@@ -49,6 +49,8 @@ char *alpm_util_acb_str[] = {
"ACB.1",
};
+char alpm_tmpbuf[_ALPM_ERR_MSG_BUF_ENT_SZ];
+
static uint32 alpm_mem_alloc_cnt;
static uint32 alpm_mem_free_cnt;
static uint32 alpm_mem_alloc_sz;
@@ -95,6 +97,16 @@ alpm_util_mem_stat_clear()
alpm_mem_alloc_sz = 0;
}
+void
+alpm_util_snprintf(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ sal_vsnprintf(alpm_tmpbuf + sal_strlen(alpm_tmpbuf), _ALPM_ERR_MSG_BUF_ENT_SZ - 1, fmt, ap);
+ va_end(ap);
+}
+
int
alpm_util_trie_max_key_len(int u, int ipt)
{
diff --git a/sdk-6.5.16/src/bcm/esw/alpm2/alpm_wb.c b/sdk-6.5.16/src/bcm/esw/alpm2/alpm_wb.c
@@ -738,6 +738,10 @@ alpm_wb_test(int u)
alpm_util_free(ALPMC(u)->_alpm_merge_state);
}
+ if (ALPMC(u)->_alpm_err_msg_buf != NULL) {
+ alpm_util_free(ALPMC(u)->_alpm_err_msg_buf);
+ }
+
if (ALPMC(u) != NULL) {
alpm_util_free(ALPMC(u));
ALPMC(u) = NULL;