mm:use Kconfig to control sequence number to save memory

One memory block can save sizeof(size_t) size.

Signed-off-by: anjiahao <anjiahao@xiaomi.com>
This commit is contained in:
anjiahao 2024-12-20 11:37:53 +08:00 committed by Alan C. Assis
parent c21405d2d5
commit 92f26a98dd
9 changed files with 84 additions and 19 deletions

View file

@ -462,8 +462,10 @@ static ssize_t memdump_read(FAR struct file *filep, FAR char *buffer,
#if CONFIG_MM_BACKTRACE >= 0
"leak: dump all leaked node\n"
"pid: dump pid allocated node\n"
# ifdef CONFIG_MM_BACKTRACE_SEQNO
"The current sequence number %lu\n",
g_mm_seqno
# endif
#endif
);

View file

@ -122,7 +122,9 @@ struct mempool_backtrace_s
* if there is any out of bounds.
*/
pid_t pid;
# ifdef CONFIG_MM_BACKTRACE_SEQNO
unsigned long seqno; /* The sequence of memory malloc */
# endif
# if CONFIG_MM_BACKTRACE > 0
FAR void *backtrace[CONFIG_MM_BACKTRACE];
# endif

View file

@ -142,8 +142,12 @@
# define MM_DUMP_ALLOC(dump, node) \
((node) != NULL && (dump)->pid == PID_MM_ALLOC && \
(node)->pid != PID_MM_MEMPOOL)
# define MM_DUMP_SEQNO(dump, node) \
# ifdef CONFIG_MM_BACKTRACE_SEQNO
# define MM_DUMP_SEQNO(dump, node) \
((node)->seqno >= (dump)->seqmin && (node)->seqno <= (dump)->seqmax)
# else
# define MM_DUMP_SEQNO(dump,node) (true)
# endif
# define MM_DUMP_ASSIGN(dump, node) \
((node) != NULL && (dump)->pid == (node)->pid)
# define MM_DUMP_LEAK(dump, node) \
@ -166,6 +170,12 @@
#define MM_ALLOC_MAGIC 0xaa
#define MM_FREE_MAGIC 0x55
#ifdef CONFIG_MM_BACKTRACE_SEQNO
# define MM_INCSEQNO(p) ((p)->seqno = g_mm_seqno++)
#else
# define MM_INCSEQNO(p)
#endif
/****************************************************************************
* Public Types
****************************************************************************/
@ -195,7 +205,7 @@ extern "C"
#define EXTERN extern
#endif
#if CONFIG_MM_BACKTRACE >= 0
#ifdef CONFIG_MM_BACKTRACE_SEQNO
extern unsigned long g_mm_seqno;
#endif

View file

@ -138,6 +138,11 @@ config MM_BACKTRACE_DEFAULT
default n
depends on MM_BACKTRACE > 0
config MM_BACKTRACE_SEQNO
bool "Record sequence number in memory block"
default y
depends on MM_BACKTRACE >= 0
config MM_DUMP_ON_FAILURE
bool "Dump heap info on allocation failure"
default n

View file

@ -107,7 +107,7 @@ static inline void mempool_add_backtrace(FAR struct mempool_s *pool,
DEBUGASSERT(buf->magic == MEMPOOL_MAGIC_FREE);
buf->magic = MEMPOOL_MAGIC_ALLOC;
buf->pid = _SCHED_GETTID();
buf->seqno = g_mm_seqno++;
MM_INCSEQNO(buf);
# if CONFIG_MM_BACKTRACE > 0
if (pool->procfs.backtrace)
{
@ -209,8 +209,15 @@ static void mempool_memdump_callback(FAR struct mempool_s *pool,
FAR const char *tmp = "";
# endif
syslog(LOG_INFO, "%6d%12zu%9zu%12lu%*p %s\n",
buf->pid, blocksize, overhead, buf->seqno,
syslog(LOG_INFO, "%6d%12zu%9zu"
#ifdef CONFIG_MM_BACKTRACE_SEQNO
"%12lu"
#endif
"%*p %s\n",
buf->pid, blocksize, overhead,
#ifdef CONFIG_MM_BACKTRACE_SEQNO
buf->seqno,
#endif
BACKTRACE_PTR_FMT_WIDTH,
((FAR char *)buf - pool->blocksize), tmp);
}

View file

@ -78,7 +78,7 @@
{ \
FAR struct mm_allocnode_s *tmp = (FAR struct mm_allocnode_s *)(ptr); \
tmp->pid = _SCHED_GETTID(); \
tmp->seqno = g_mm_seqno++; \
MM_INCSEQNO(tmp); \
} \
while (0)
#elif CONFIG_MM_BACKTRACE > 0
@ -102,7 +102,7 @@
{ \
tmp->backtrace[0] = NULL; \
} \
tmp->seqno = g_mm_seqno++; \
MM_INCSEQNO(tmp); \
} \
while (0)
#else
@ -178,7 +178,9 @@ struct mm_allocnode_s
mmsize_t size; /* Size of this chunk */
#if CONFIG_MM_BACKTRACE >= 0
pid_t pid; /* The pid for caller */
# ifdef CONFIG_MM_BACKTRACE_SEQNO
unsigned long seqno; /* The sequence of memory malloc */
# endif
# if CONFIG_MM_BACKTRACE > 0
FAR void *backtrace[CONFIG_MM_BACKTRACE]; /* The backtrace buffer for caller */
# endif

View file

@ -66,8 +66,15 @@ static void memdump_allocnode(FAR struct mm_allocnode_s *node)
nodesize, overhead, BACKTRACE_PTR_FMT_WIDTH,
(FAR const char *)node + MM_SIZEOF_ALLOCNODE);
#elif CONFIG_MM_BACKTRACE == 0
syslog(LOG_INFO, "%6d%12zu%9zu%12lu%*p\n",
node->pid, nodesize, overhead, node->seqno,
syslog(LOG_INFO, "%6d%12zu%9zu"
# ifdef CONFIG_MM_BACKTRACE_SEQNO
"%12lu"
# endif
"%*p\n",
node->pid, nodesize, overhead,
# ifdef CONFIG_MM_BACKTRACE_SEQNO
node->seqno,
# endif
BACKTRACE_PTR_FMT_WIDTH,
(FAR const char *)node + MM_SIZEOF_ALLOCNODE);
#else
@ -76,8 +83,15 @@ static void memdump_allocnode(FAR struct mm_allocnode_s *node)
backtrace_format(buf, sizeof(buf), node->backtrace,
CONFIG_MM_BACKTRACE);
syslog(LOG_INFO, "%6d%12zu%9zu%12lu%*p %s\n",
node->pid, nodesize, overhead, node->seqno,
syslog(LOG_INFO, "%6d%12zu%9zu"
# ifdef CONFIG_MM_BACKTRACE_SEQNO
"%12lu%"
# endif
"*p %s\n",
node->pid, nodesize, overhead,
# ifdef CONFIG_MM_BACKTRACE_SEQNO
node->seqno,
# endif
BACKTRACE_PTR_FMT_WIDTH,
(FAR const char *)node + MM_SIZEOF_ALLOCNODE, buf);
#endif
@ -293,8 +307,15 @@ void mm_memdump(FAR struct mm_heap_s *heap,
BACKTRACE_PTR_FMT_WIDTH,
"Address");
#else
syslog(LOG_INFO, "%6s%12s%9s%12s%*s %s\n", "PID", "Size", "Overhead",
"Sequence", BACKTRACE_PTR_FMT_WIDTH,
syslog(LOG_INFO, "%6s%12s%9s"
# ifdef CONFIG_MM_BACKTRACE_SEQNO
"%12s"
# endif
"%*s %s\n", "PID", "Size", "Overhead",
# ifdef CONFIG_MM_BACKTRACE_SEQNO
"Sequence",
# endif
BACKTRACE_PTR_FMT_WIDTH,
"Address", "Backtrace");
#endif

View file

@ -218,8 +218,16 @@ static void memdump_allocnode(FAR void *ptr, size_t size)
FAR struct memdump_backtrace_s *buf =
ptr + size - sizeof(struct memdump_backtrace_s);
syslog(LOG_INFO, "%6d%12zu%12lu%*p\n",
buf->pid, size, buf->seqno, BACKTRACE_PTR_FMT_WIDTH, ptr);
syslog(LOG_INFO, "%6d%12zu"
# ifdef CONFIG_MM_BACKTRACE_SEQNO
"%12lu"
# endif
"%*p\n",
buf->pid, size,
# ifdef CONFIG_MM_BACKTRACE_SEQNO
buf->seqno,
# endif
BACKTRACE_PTR_FMT_WIDTH, ptr);
#else
char tmp[BACKTRACE_BUFFER_SIZE(CONFIG_MM_BACKTRACE)];
FAR struct memdump_backtrace_s *buf =
@ -228,8 +236,16 @@ static void memdump_allocnode(FAR void *ptr, size_t size)
backtrace_format(tmp, sizeof(tmp), buf->backtrace,
CONFIG_MM_BACKTRACE);
syslog(LOG_INFO, "%6d%12zu%12lu%*p %s\n",
buf->pid, size, buf->seqno, BACKTRACE_PTR_FMT_WIDTH,
syslog(LOG_INFO, "%6d%12zu"
# ifdef CONFIG_MM_BACKTRACE_SEQNO
"%12lu"
# endif
"%*p %s\n",
buf->pid, size,
# ifdef CONFIG_MM_BACKTRACE_SEQNO
buf->seqno,
# endif
BACKTRACE_PTR_FMT_WIDTH,
ptr, tmp);
#endif
}
@ -299,7 +315,7 @@ static void memdump_backtrace(FAR struct mm_heap_s *heap,
# endif
buf->pid = _SCHED_GETTID();
buf->seqno = g_mm_seqno++;
MM_INCSEQNO(buf);
# if CONFIG_MM_BACKTRACE > 0
tcb = nxsched_get_tcb(buf->pid);
if (heap->mm_procfs.backtrace ||

View file

@ -33,7 +33,7 @@
* Public data
****************************************************************************/
#if CONFIG_MM_BACKTRACE >= 0
#ifdef CONFIG_MM_BACKTRACE_SEQNO
unsigned long g_mm_seqno;
#endif