fix(bt): fixed mempool deinit crash issue for esp32s31

This commit is contained in:
ShenWeilong
2026-08-26 11:41:51 +08:00
parent f1c41c8949
commit 2829e28730
13 changed files with 133 additions and 9 deletions

View File

@@ -21,6 +21,7 @@
#include "btdm_lp.h"
#include "btdm_log.h"
#include "btdm_external.h"
#include "btdm_mempool.h"
/*
***************************************************************************************************
@@ -95,6 +96,8 @@ bt_controller_deinit(void)
{
s_btdm_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE;
btdm_mempool_deinit_all(true);
hci_transport_deinit();
#if UC_BT_CTRL_BR_EDR_IS_ENABLE

View File

@@ -21,6 +21,7 @@
#include "btdm_lp.h"
#include "btdm_log.h"
#include "btdm_external.h"
#include "btdm_mempool.h"
/*
***************************************************************************************************
@@ -95,6 +96,8 @@ bt_controller_deinit(void)
{
s_btdm_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE;
btdm_mempool_deinit_all(true);
hci_transport_deinit();
#if UC_BT_CTRL_BR_EDR_IS_ENABLE

View File

@@ -358,6 +358,29 @@ void os_mempool_flags_set(struct os_mempool *mp, uint8_t flags);
*/
void os_mempool_flags_clear(struct os_mempool *mp, uint8_t flags);
/**
* @brief Deinitialize a memory pool.
*
* @param mp Pointer to memory pool
*/
void os_mempool_deinit(struct os_mempool *mp);
/**
* @brief Deinitialize all of memory pools.
*
* @param is_controller Whether called from controller.
*
* @return OS_OK on success; OS_INVALID_PARM if not found corresponding memory pools.
*/
os_error_t os_mempool_deinit_all(bool is_controller);
/**
* @brief Check if there are any live memory pools.
*
* @return true if there are any live memory pools; false otherwise.
*/
bool os_mempool_has_live_pool(void);
#ifdef __cplusplus
}
#endif

View File

@@ -735,6 +735,11 @@ os_mempool_module_init(void)
static os_error_t
os_mempool_mem_free(struct os_mempool *mp)
{
/* Extended mempool has its own free logic */
if (mp->mp_flags & OS_MEMPOOL_F_EXT) {
return OS_OK;
}
/* For runtime allocation mode, check whether all blocks have been freed */
if (!(mp->mp_flags & OS_MEMPOOL_F_RUNTIME)) {
return OS_EINVAL;
@@ -767,8 +772,15 @@ os_mempool_mem_free(struct os_mempool *mp)
#endif
void
os_mempool_deinit(bool is_controller)
os_mempool_deinit(struct os_mempool *mp)
{
os_mempool_unregister(mp);
}
os_error_t
os_mempool_deinit_all(bool is_controller)
{
os_error_t err = OS_INVALID_PARM;
struct os_mempool *mp = NULL;
struct os_mempool *next = NULL;
@@ -780,8 +792,17 @@ os_mempool_deinit(bool is_controller)
next = STAILQ_NEXT(mp, mp_list);
os_mempool_unregister(mp);
mp = next;
err = OS_OK;
} else {
mp = STAILQ_NEXT(mp, mp_list);
}
}
return err;
}
bool
os_mempool_has_live_pool(void)
{
return !STAILQ_EMPTY(&g_os_mempool_list);
}

View File

@@ -28,7 +28,8 @@ config BT_CTRL_TASK_STACK_SIZE
This configures stack size of NimBLE controller task
config BT_CTRL_ALLOW_MALLOC_FROM_SPIRAM
bool "Allow allocating BT memory from SPIRAM"
depends on SOC_SPIRAM_SUPPORTED
bool "Allow allocating controller memory from SPIRAM (EXPERIMENTAL)"
default n
help
Allocate part of memory from SPIRAM. Need to enable CONFIG_SPIRAM first.

View File

@@ -353,6 +353,22 @@ void os_mempool_flags_set(struct os_mempool *mp, uint8_t flags);
*/
void os_mempool_flags_clear(struct os_mempool *mp, uint8_t flags);
/**
* @brief Deinitialize a memory pool.
*
* @param mp Pointer to memory pool
*/
void os_mempool_deinit(struct os_mempool *mp);
/**
* @brief Deinitialize all of memory pools.
*
* @param is_controller Whether called from controller.
*
* @return OS_OK on success; OS_INVALID_PARM if not found corresponding memory pools.
*/
os_error_t os_mempool_deinit_all(bool is_controller);
#else /* !CONFIG_BT_DUAL_MODE_ARCH */
#include "btdm_mempool.h"
@@ -444,6 +460,18 @@ os_mempool_flags_clear(struct os_mempool *mp, uint8_t flags)
btdm_mempool_flags_clear((struct btdm_mempool *)mp, flags);
}
static inline void
os_mempool_deinit(struct os_mempool *mp)
{
btdm_mempool_deinit((struct btdm_mempool *)mp);
}
static inline os_error_t
os_mempool_deinit_all(bool is_controller)
{
return (os_error_t)btdm_mempool_deinit_all(is_controller);
}
#endif /* !CONFIG_BT_DUAL_MODE_ARCH */

View File

@@ -330,12 +330,30 @@ void e_btdm_mempool_module_init(void);
#define btdm_mempool_module_init BTDM_MEMPOOL_EXT_FUNC(btdm_mempool_module_init)
/**
* Deinitialize the memory pool module.
* Deinitialize a memory pool.
*
* @param mp Pointer to memory pool
*/
void e_btdm_mempool_deinit(struct btdm_mempool *mp);
#define btdm_mempool_deinit BTDM_MEMPOOL_EXT_FUNC(btdm_mempool_deinit)
/**
* Deinitialize all of memory pools.
*
* @param is_controller Whether called from controller.
*
* @return BTDM_OSAL_OK on success; BTDM_OSAL_INVALID_PARM if not found corresponding memory pools.
*/
void e_btdm_mempool_deinit(bool is_controller);
#define btdm_mempool_deinit BTDM_MEMPOOL_EXT_FUNC(btdm_mempool_deinit)
btdm_osal_error_t e_btdm_mempool_deinit_all(bool is_controller);
#define btdm_mempool_deinit_all BTDM_MEMPOOL_EXT_FUNC(btdm_mempool_deinit_all)
/**
* Check if there are any live memory pools.
*
* @return true if there are any live memory pools; false otherwise.
*/
bool e_btdm_mempool_has_live_pool(void);
#define btdm_mempool_has_live_pool BTDM_MEMPOOL_EXT_FUNC(btdm_mempool_has_live_pool)
#ifdef __cplusplus
}

View File

@@ -18,6 +18,11 @@ static STAILQ_HEAD(, btdm_mempool) s_btdm_osal_mempool_list = STAILQ_HEAD_INITIA
static btdm_osal_error_t
e_btdm_mempool_mem_free(struct btdm_mempool *mp)
{
/* Extended mempool has its own free logic */
if (mp->mp_flags & BTDM_MEMPOOL_F_EXT) {
return BTDM_OSAL_OK;
}
/* For runtime allocation mode, check whether all blocks have been freed */
if (!(mp->mp_flags & BTDM_MEMPOOL_F_RUNTIME)) {
return BTDM_OSAL_EINVAL;
@@ -588,8 +593,15 @@ e_btdm_mempool_module_init(void)
}
void
e_btdm_mempool_deinit(bool is_controller)
e_btdm_mempool_deinit(struct btdm_mempool *mp)
{
btdm_mempool_unregister(mp);
}
btdm_osal_error_t
e_btdm_mempool_deinit_all(bool is_controller)
{
btdm_osal_error_t err = BTDM_OSAL_INVALID_PARM;
struct btdm_mempool *mp = NULL;
struct btdm_mempool *next = NULL;
@@ -601,8 +613,17 @@ e_btdm_mempool_deinit(bool is_controller)
next = STAILQ_NEXT(mp, mp_list);
btdm_mempool_unregister(mp);
mp = next;
err = BTDM_OSAL_OK;
} else {
mp = STAILQ_NEXT(mp, mp_list);
}
}
return err;
}
bool
e_btdm_mempool_has_live_pool(void)
{
return !STAILQ_EMPTY(&s_btdm_osal_mempool_list);
}

View File

@@ -1174,6 +1174,7 @@ btdm_osal_elem_mempool_init(btdm_osal_elem_num_t *elem_num)
if (rc) {
return -2;
}
btdm_mempool_flags_set(&s_btdm_osal_ev_pool, BTDM_MEMPOOL_F_CONTROLLER);
}
if (elem_num->co_count) {
@@ -1190,6 +1191,7 @@ btdm_osal_elem_mempool_init(btdm_osal_elem_num_t *elem_num)
if (rc) {
return -4;
}
btdm_mempool_flags_set(&s_btdm_osal_co_pool, BTDM_MEMPOOL_F_CONTROLLER);
}
return 0;
@@ -1200,12 +1202,15 @@ btdm_osal_elem_mempool_deinit(void)
{
if (s_btdm_osal_ev_buf) {
BTDM_OSAL_ASSERT(s_btdm_osal_ev_pool.mp_num_free == s_btdm_osal_ev_pool.mp_num_blocks);
btdm_mempool_deinit(&s_btdm_osal_ev_pool);
btdm_osal_free(s_btdm_osal_ev_buf);
s_btdm_osal_ev_buf = NULL;
}
if (s_btdm_osal_co_buf) {
BTDM_OSAL_ASSERT(s_btdm_osal_co_pool.mp_num_free == s_btdm_osal_co_pool.mp_num_blocks);
btdm_mempool_deinit(&s_btdm_osal_co_pool);
btdm_osal_free(s_btdm_osal_co_buf);
s_btdm_osal_co_buf = NULL;
}

View File

@@ -102,6 +102,7 @@ hci_driver_util_memory_init(void)
ESP_LOGE(TAG, "Failed to initialize tx pool");
goto init_err;
}
btdm_mempool_flags_set(s_hci_driver_util_env.tx_entry_pool, BTDM_MEMPOOL_F_CONTROLLER);
return 0;