qcacmn: Change ce desc history from dynamic to static

As dynamic allocation occupy cnss prealloc memory, which may
cause this prealloc pool to be exhausted.

Move dynamic memory to static.

Change-Id: Ia3500868cbcdbd9676f72a3588462ab0d6a21088
CRs-Fixed: 3171015
Esse commit está contido em:
Jingxiang Ge
2022-04-13 18:30:35 +08:00
commit de Madan Koyyalamudi
commit 4c3d1cbd29
2 arquivos alterados com 22 adições e 85 exclusões

Ver arquivo

@@ -1822,36 +1822,6 @@ ssize_t hif_ce_en_desc_hist(struct hif_softc *scn,
const char *buf, size_t size);
ssize_t hif_disp_ce_enable_desc_data_hist(struct hif_softc *scn, char *buf);
ssize_t hif_dump_desc_event(struct hif_softc *scn, char *buf);
/**
* hif_ce_debug_history_prealloc_init() - alloc ce debug history memory
*
* alloc ce debug history memory with driver init, so such memory can
* be existed even after stop module.
* on ini value.
*
* Return: QDF_STATUS_SUCCESS for success, other for fail.
*/
QDF_STATUS hif_ce_debug_history_prealloc_init(void);
/**
* hif_ce_debug_history_prealloc_deinit() - free ce debug history memory
*
* free ce debug history memory when driver deinit.
*
* Return: QDF_STATUS_SUCCESS for success, other for fail.
*/
QDF_STATUS hif_ce_debug_history_prealloc_deinit(void);
#else
static inline
QDF_STATUS hif_ce_debug_history_prealloc_init(void)
{
return QDF_STATUS_SUCCESS;
}
static inline
QDF_STATUS hif_ce_debug_history_prealloc_deinit(void)
{
return QDF_STATUS_SUCCESS;
}
#endif/*#if defined(HIF_CONFIG_SLUB_DEBUG_ON)||defined(HIF_CE_DEBUG_DATA_BUF)*/
/**

Ver arquivo

@@ -1981,71 +1981,41 @@ void free_mem_ce_debug_hist_data(struct hif_softc *scn, uint32_t ce_id)
#ifndef HIF_CE_DEBUG_DATA_DYNAMIC_BUF
#if defined(HIF_CONFIG_SLUB_DEBUG_ON) || defined(HIF_CE_DEBUG_DATA_BUF)
struct hif_ce_desc_event *hif_ce_desc_history[CE_COUNT_MAX];
/* define this variable for crashscope parse */
/* define below variables for crashscope parse */
struct hif_ce_desc_event *hif_ce_desc_history[CE_COUNT_MAX];
uint32_t hif_ce_history_max = HIF_CE_HISTORY_MAX;
/**
* hif_ce_debug_only_enable_ce2_ce3() - if only enable ce2/ce3 debug
* This is different config for perf/debug buid version.
* for debug build, it will enable ce history for all ce, but for
* perf build(if CONFIG_SLUB_DEBUG_ON is N), it only enable for
* ce2(wmi event) & ce3(wmi cmd) history.
*
* Return: true if only enable ce2/ce3 debug, otherwise false.
*/
#if defined(CONFIG_SLUB_DEBUG_ON)
static inline bool hif_ce_debug_only_enable_ce2_ce3(void)
{
return false;
}
#define CE_DESC_HISTORY_BUFF_CNT CE_COUNT_MAX
#define IS_CE_DEBUG_ONLY_FOR_CE2_CE3 FALSE
#else
static inline bool hif_ce_debug_only_enable_ce2_ce3(void)
{
return true;
}
#define CE_DESC_HISTORY_BUFF_CNT 2
#define IS_CE_DEBUG_ONLY_FOR_CE2_CE3 TRUE
#endif
struct hif_ce_desc_event
hif_ce_desc_history_buff[CE_DESC_HISTORY_BUFF_CNT][HIF_CE_HISTORY_MAX];
QDF_STATUS hif_ce_debug_history_prealloc_deinit(void)
static struct hif_ce_desc_event *
hif_ce_debug_history_buf_get(unsigned int ce_id)
{
int ce_id;
for (ce_id = 0; ce_id < CE_COUNT_MAX; ce_id++) {
if (hif_ce_desc_history[ce_id]) {
qdf_mem_free(hif_ce_desc_history[ce_id]);
hif_ce_desc_history[ce_id] = NULL;
}
}
hif_debug("ce debug memory freed");
return QDF_STATUS_SUCCESS;
}
QDF_STATUS hif_ce_debug_history_prealloc_init(void)
{
int ce_id;
hif_debug("alloc ce debug memory, only_ce2/ce3 %d",
hif_ce_debug_only_enable_ce2_ce3());
for (ce_id = 0; ce_id < CE_COUNT_MAX; ce_id++) {
if (hif_ce_debug_only_enable_ce2_ce3() &&
ce_id != CE_ID_2 &&
ce_id != CE_ID_3) {
hif_ce_desc_history[ce_id] = NULL;
continue;
}
hif_debug("get ce debug buffer ce_id %u, only_ce2/ce3=%d",
ce_id, IS_CE_DEBUG_ONLY_FOR_CE2_CE3);
if (IS_CE_DEBUG_ONLY_FOR_CE2_CE3 &&
(ce_id == CE_ID_2 || ce_id == CE_ID_3)) {
hif_ce_desc_history[ce_id] =
qdf_mem_malloc(HIF_CE_HISTORY_MAX *
sizeof(struct hif_ce_desc_event));
if (!hif_ce_desc_history[ce_id]) {
hif_ce_debug_history_prealloc_deinit();
return QDF_STATUS_E_NOMEM;
}
hif_ce_desc_history_buff[ce_id - CE_ID_2];
} else {
hif_ce_desc_history[ce_id] =
hif_ce_desc_history_buff[ce_id];
}
return QDF_STATUS_SUCCESS;
return hif_ce_desc_history[ce_id];
}
/**
@@ -2062,7 +2032,8 @@ alloc_mem_ce_debug_history(struct hif_softc *scn, unsigned int ce_id,
struct ce_desc_hist *ce_hist = &scn->hif_ce_desc_hist;
QDF_STATUS status = QDF_STATUS_SUCCESS;
if (hif_ce_debug_only_enable_ce2_ce3() &&
/* For perf build, return directly for non ce2/ce3 */
if (IS_CE_DEBUG_ONLY_FOR_CE2_CE3 &&
ce_id != CE_ID_2 &&
ce_id != CE_ID_3) {
ce_hist->enable[ce_id] = false;
@@ -2070,11 +2041,7 @@ alloc_mem_ce_debug_history(struct hif_softc *scn, unsigned int ce_id,
return QDF_STATUS_SUCCESS;
}
if (!hif_ce_desc_history[ce_id]) {
hif_err("prealloc memory failed");
return QDF_STATUS_E_NOMEM;
}
ce_hist->hist_ev[ce_id] = hif_ce_desc_history[ce_id];
ce_hist->hist_ev[ce_id] = hif_ce_debug_history_buf_get(ce_id);
ce_hist->enable[ce_id] = true;
if (src_nentries) {