openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

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:
Msdk-6.5.16/include/bcm_int/esw/alpm.h | 31++++++++++++++++++++++++++++++-
Msdk-6.5.16/include/bcm_int/esw/alpm_util.h | 1+
Msdk-6.5.16/src/appl/diag/esw/l3.c | 2+-
Msdk-6.5.16/src/bcm/esw/alpm2/alpm.c | 46++++++++++++++++++++++++++++++++++++++++------
Msdk-6.5.16/src/bcm/esw/alpm2/alpm_tr.c | 7+++++--
Msdk-6.5.16/src/bcm/esw/alpm2/alpm_util.c | 12++++++++++++
Msdk-6.5.16/src/bcm/esw/alpm2/alpm_wb.c | 4++++
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;