logging: Add log mem shell command

Add log mem shell command to determine memory pool
usage of logging system.

Signed-off-by: Ryan Erickson <ryan.erickson@lairdconnect.com>
This commit is contained in:
Ryan Erickson 2021-08-11 13:50:56 -05:00 committed by Christopher Friedt
commit e4dc8ed26b
3 changed files with 72 additions and 22 deletions

View file

@ -467,6 +467,22 @@ struct log_msg *log_msg_create_n(const char *str,
log_arg_t *args,
uint32_t nargs);
/**
* @brief Get number of free blocks from the log mem pool
*/
uint32_t log_msg_mem_get_free(void);
/**
* @brief Get number of used blocks from the log mem pool
*/
uint32_t log_msg_mem_get_used(void);
/**
* @brief Get max used blocks from the log mem pool
*/
uint32_t log_msg_mem_get_max_used(void);
/**
* @}
*/

View file

@ -403,6 +403,28 @@ static int cmd_log_strdup_utilization(const struct shell *shell,
return 0;
}
static int cmd_log_memory_slabs(const struct shell *sh, size_t argc, char **argv)
{
uint32_t slabs_free;
uint32_t used;
uint32_t max;
slabs_free = log_msg_mem_get_free();
used = log_msg_mem_get_used();
shell_print(sh, "Blocks used:\t%d", used);
shell_print(sh, "Blocks free:\t%d", slabs_free);
if (IS_ENABLED(CONFIG_MEM_SLAB_TRACE_MAX_UTILIZATION)) {
max = log_msg_mem_get_max_used();
shell_print(sh, "Blocks max:\t%d", max);
} else {
shell_print(
sh,
"Enable CONFIG_MEM_SLAB_TRACE_MAX_UTILIZATION to get max memory utilization");
}
return 0;
}
SHELL_STATIC_SUBCMD_SET_CREATE(sub_log_backend,
SHELL_CMD_ARG(disable, &dsub_module_name,
@ -436,31 +458,28 @@ static void backend_name_get(size_t idx, struct shell_static_entry *entry)
SHELL_DYNAMIC_CMD_CREATE(dsub_backend_name_dynamic, backend_name_get);
SHELL_STATIC_SUBCMD_SET_CREATE(sub_log_stat,
SHELL_CMD(backend, &dsub_backend_name_dynamic,
"Logger backends commands.", NULL),
SHELL_STATIC_SUBCMD_SET_CREATE(
sub_log_stat,
SHELL_CMD(backend, &dsub_backend_name_dynamic, "Logger backends commands.", NULL),
SHELL_COND_CMD_ARG(CONFIG_SHELL_LOG_BACKEND, disable, &dsub_module_name,
"'log disable <module_0> .. <module_n>' disables logs in specified "
"modules (all if no modules specified).",
cmd_log_self_disable, 1, 255),
"'log disable <module_0> .. <module_n>' disables logs in specified "
"modules (all if no modules specified).",
cmd_log_self_disable, 1, 255),
SHELL_COND_CMD_ARG(CONFIG_SHELL_LOG_BACKEND, enable, &dsub_severity_lvl,
"'log enable <level> <module_0> ... <module_n>' enables logs up to"
" given level in specified modules (all if no modules specified).",
cmd_log_self_enable, 2, 255),
SHELL_COND_CMD(CONFIG_SHELL_LOG_BACKEND, go, NULL, "Resume logging",
cmd_log_self_go),
SHELL_COND_CMD(CONFIG_SHELL_LOG_BACKEND, halt, NULL, "Halt logging",
cmd_log_self_halt),
SHELL_CMD_ARG(list_backends, NULL, "Lists logger backends.",
cmd_log_backends_list, 1, 0),
"'log enable <level> <module_0> ... <module_n>' enables logs up to"
" given level in specified modules (all if no modules specified).",
cmd_log_self_enable, 2, 255),
SHELL_COND_CMD(CONFIG_SHELL_LOG_BACKEND, go, NULL, "Resume logging", cmd_log_self_go),
SHELL_COND_CMD(CONFIG_SHELL_LOG_BACKEND, halt, NULL, "Halt logging", cmd_log_self_halt),
SHELL_CMD_ARG(list_backends, NULL, "Lists logger backends.", cmd_log_backends_list, 1, 0),
SHELL_COND_CMD(CONFIG_SHELL_LOG_BACKEND, status, NULL, "Logger status",
cmd_log_self_status),
SHELL_COND_CMD_ARG(CONFIG_LOG_STRDUP_POOL_PROFILING, strdup_utilization,
NULL, "Get utilization of string duplicates pool",
cmd_log_strdup_utilization, 1, 0),
SHELL_SUBCMD_SET_END
);
cmd_log_self_status),
SHELL_COND_CMD_ARG(CONFIG_LOG_STRDUP_POOL_PROFILING, strdup_utilization, NULL,
"Get utilization of string duplicates pool", cmd_log_strdup_utilization,
1, 0),
SHELL_COND_CMD(CONFIG_LOG_MODE_DEFERRED, mem, NULL, "Logger memory usage",
cmd_log_memory_slabs),
SHELL_SUBCMD_SET_END);
SHELL_CMD_REGISTER(log, &sub_log_stat, "Commands for controlling logger",
NULL);

View file

@ -483,3 +483,18 @@ void log_msg_hexdump_data_get(struct log_msg *msg,
{
log_msg_hexdump_data_op(msg, data, length, offset, false);
}
uint32_t log_msg_mem_get_free(void)
{
return k_mem_slab_num_free_get(&log_msg_pool);
}
uint32_t log_msg_mem_get_used(void)
{
return k_mem_slab_num_used_get(&log_msg_pool);
}
uint32_t log_msg_mem_get_max_used(void)
{
return k_mem_slab_max_used_get(&log_msg_pool);
}