You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by je...@apache.org on 2023/01/18 08:02:42 UTC
[nuttx] 03/03: mempool:Calibration total memory statistics
This is an automated email from the ASF dual-hosted git repository.
jerpelea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit b362f18d6a67b7ba28130bed44ab8d264eded4b7
Author: anjiahao <an...@xiaomi.com>
AuthorDate: Tue Jan 10 18:10:28 2023 +0800
mempool:Calibration total memory statistics
Signed-off-by: anjiahao <an...@xiaomi.com>
---
include/nuttx/mm/mempool.h | 19 ++++++++++++-------
mm/mempool/mempool.c | 15 +++++++++++++++
mm/mempool/mempool_multiple.c | 6 ++++--
mm/mm_heap/mm_initialize.c | 3 ++-
mm/tlsf/mm_tlsf.c | 3 ++-
5 files changed, 35 insertions(+), 11 deletions(-)
diff --git a/include/nuttx/mm/mempool.h b/include/nuttx/mm/mempool.h
index 4c7aeaeb5c..8e4236cedc 100644
--- a/include/nuttx/mm/mempool.h
+++ b/include/nuttx/mm/mempool.h
@@ -75,6 +75,9 @@ struct mempool_s
size_t expandsize; /* The size of expand block every time for mempool */
bool wait; /* The flag of need to wait when mempool is empty */
FAR void *priv; /* This pointer is used to store the user's private data */
+ bool calibrate; /* The flag is use expend memory calibration
+ * real memory usage
+ */
mempool_alloc_t alloc; /* The alloc function for mempool */
mempool_free_t free; /* The free function for mempool */
@@ -85,12 +88,14 @@ struct mempool_s
sq_queue_t iqueue; /* The free block queue in interrupt mempool */
sq_queue_t equeue; /* The expand block queue for normal mempool */
#if CONFIG_MM_BACKTRACE >= 0
- struct list_node alist; /* The used block list in mempool */
+ struct list_node alist; /* The used block list in mempool */
#else
- size_t nalloc; /* The number of used block in mempool */
+ size_t nalloc; /* The number of used block in mempool */
#endif
- spinlock_t lock; /* The protect lock to mempool */
- sem_t waitsem; /* The semaphore of waiter get free block */
+ spinlock_t lock; /* The protect lock to mempool */
+ sem_t waitsem; /* The semaphore of waiter get free block */
+ size_t nexpend; /* The number of expend memory for mempool */
+ size_t totalsize; /* Total size of the expend for mempoll */
#if defined(CONFIG_FS_PROCFS) && !defined(CONFIG_FS_PROCFS_EXCLUDE_MEMPOOL)
struct mempool_procfs_entry_s procfs; /* The entry of procfs */
#endif
@@ -288,8 +293,8 @@ void mempool_procfs_unregister(FAR struct mempool_procfs_entry_s *entry);
* free - The free memory function for multiples pool.
* arg - The alloc & free memory fuctions used arg.
* expandsize - The expend mempry for all pools in multiples pool.
- * dict_expendsize - The expend number for multiple dictnoary
- *
+ * dict_expendsize - The expend size for multiple dictnoary.
+ * calibrate - Whether to calibrate when counting memory usage.
* Returned Value:
* Return an initialized multiple pool pointer on success,
* otherwise NULL is returned.
@@ -304,7 +309,7 @@ mempool_multiple_init(FAR const char *name,
mempool_multiple_alloc_t alloc,
mempool_multiple_free_t free,
FAR void *arg, size_t expandsize,
- size_t dict_expendsize);
+ size_t dict_expendsize, bool calibrate);
/****************************************************************************
* Name: mempool_multiple_alloc
diff --git a/mm/mempool/mempool.c b/mm/mempool/mempool.c
index 10186c2aa9..7a1ea154ff 100644
--- a/mm/mempool/mempool.c
+++ b/mm/mempool/mempool.c
@@ -154,6 +154,8 @@ int mempool_init(FAR struct mempool_s *pool, FAR const char *name)
sq_init(&pool->queue);
sq_init(&pool->iqueue);
sq_init(&pool->equeue);
+ pool->nexpend = 0;
+ pool->totalsize = 0;
#if CONFIG_MM_BACKTRACE >= 0
list_initialize(&pool->alist);
@@ -173,6 +175,8 @@ int mempool_init(FAR struct mempool_s *pool, FAR const char *name)
return -ENOMEM;
}
+ pool->nexpend++;
+ pool->totalsize += size;
mempool_add_queue(&pool->iqueue, pool->ibase, ninterrupt, blocksize);
kasan_poison(pool->ibase, size);
}
@@ -194,6 +198,8 @@ int mempool_init(FAR struct mempool_s *pool, FAR const char *name)
return -ENOMEM;
}
+ pool->nexpend++;
+ pool->totalsize += size;
mempool_add_queue(&pool->queue, base, ninitial, blocksize);
sq_addlast((FAR sq_entry_t *)(base + ninitial * blocksize),
&pool->equeue);
@@ -273,6 +279,8 @@ retry:
return NULL;
}
+ pool->nexpend++;
+ pool->totalsize += size;
kasan_poison(base, size);
flags = spin_lock_irqsave(&pool->lock);
mempool_add_queue(&pool->queue, base, nexpand, blocksize);
@@ -425,6 +433,11 @@ int mempool_info_task(FAR struct mempool_s *pool,
info->aordblks += count;
info->uordblks += count * pool->blocksize;
+ if (pool->calibrate)
+ {
+ info->aordblks -= pool->nexpend;
+ info->uordblks -= pool->totalsize;
+ }
}
else if (info->pid == -1)
{
@@ -436,6 +449,8 @@ int mempool_info_task(FAR struct mempool_s *pool,
info->aordblks += count;
info->uordblks += count * pool->blocksize;
+ info->aordblks -= pool->nexpend;
+ info->uordblks -= pool->totalsize;
}
#if CONFIG_MM_BACKTRACE >= 0
else
diff --git a/mm/mempool/mempool_multiple.c b/mm/mempool/mempool_multiple.c
index c8516ae79f..0ca738be06 100644
--- a/mm/mempool/mempool_multiple.c
+++ b/mm/mempool/mempool_multiple.c
@@ -253,7 +253,8 @@ mempool_multiple_get_dict(FAR struct mempool_multiple_s *mpool,
* free - The free memory function for multiples pool.
* arg - The alloc & free memory fuctions used arg.
* expandsize - The expend mempry for all pools in multiples pool.
- * dict_expendsize - The expend size for multiple dictnoary
+ * dict_expendsize - The expend size for multiple dictnoary.
+ * calibrate - Whether to calibrate when counting memory usage.
* Returned Value:
* Return an initialized multiple pool pointer on success,
* otherwise NULL is returned.
@@ -266,7 +267,7 @@ mempool_multiple_init(FAR const char *name,
mempool_multiple_alloc_t alloc,
mempool_multiple_free_t free,
FAR void *arg, size_t expandsize,
- size_t dict_expendsize)
+ size_t dict_expendsize, bool calibrate)
{
FAR struct mempool_multiple_s *mpool;
FAR struct mempool_s *pools;
@@ -325,6 +326,7 @@ mempool_multiple_init(FAR const char *name,
pools[i].priv = mpool;
pools[i].alloc = mempool_multiple_alloc_callback;
pools[i].free = mempool_multiple_free_callback;
+ pools[i].calibrate = calibrate;
ret = mempool_init(pools + i, name);
if (ret < 0)
diff --git a/mm/mm_heap/mm_initialize.c b/mm/mm_heap/mm_initialize.c
index 763c9387a2..830bf15389 100644
--- a/mm/mm_heap/mm_initialize.c
+++ b/mm/mm_heap/mm_initialize.c
@@ -259,7 +259,8 @@ FAR struct mm_heap_s *mm_initialize(FAR const char *name,
(mempool_multiple_alloc_t)mm_memalign,
(mempool_multiple_free_t)mm_free, heap,
CONFIG_MM_HEAP_MEMPOOL_EXPAND,
- CONFIG_MM_HEAP_MEMPOOL_DICTIONARY_EXPAND);
+ CONFIG_MM_HEAP_MEMPOOL_DICTIONARY_EXPAND,
+ true);
#endif
return heap;
diff --git a/mm/tlsf/mm_tlsf.c b/mm/tlsf/mm_tlsf.c
index 308fc1ca2c..7e3ab3093b 100644
--- a/mm/tlsf/mm_tlsf.c
+++ b/mm/tlsf/mm_tlsf.c
@@ -804,7 +804,8 @@ FAR struct mm_heap_s *mm_initialize(FAR const char *name,
(mempool_multiple_alloc_t)mm_memalign,
(mempool_multiple_free_t)mm_free, heap,
CONFIG_MM_HEAP_MEMPOOL_EXPAND,
- CONFIG_MM_HEAP_MEMPOOL_DICTIONARY_EXPAND);
+ CONFIG_MM_HEAP_MEMPOOL_DICTIONARY_EXPAND,
+ true);
#endif
return heap;