diff --git a/mm/mempool/mempool.c b/mm/mempool/mempool.c index a476480342e..5e107ad23b8 100644 --- a/mm/mempool/mempool.c +++ b/mm/mempool/mempool.c @@ -40,6 +40,8 @@ * Pre-processor Definitions ****************************************************************************/ +#define MEMPOOL_HEADER_SIZE (sizeof(sq_entry_t) + CONFIG_MM_NODE_GUARDSIZE) + #if CONFIG_MM_BACKTRACE >= 0 #define MEMPOOL_MAGIC_FREE 0x55555555 #define MEMPOOL_MAGIC_ALLOC 0xAAAAAAAA @@ -148,7 +150,7 @@ static void mempool_foreach(FAR struct mempool_s *pool, sq_for_every(&pool->equeue, entry) { - nblks = (pool->expandsize - sizeof(sq_entry_t)) / blocksize; + nblks = (pool->expandsize - MEMPOOL_HEADER_SIZE) / blocksize; base = (FAR char *)entry - (nblks * blocksize); while (nblks--) @@ -280,10 +282,11 @@ int mempool_init(FAR struct mempool_s *pool, FAR const char *name) pool->ibase = NULL; } - if (pool->initialsize >= blocksize + sizeof(sq_entry_t)) + if (pool->initialsize >= blocksize + MEMPOOL_HEADER_SIZE) { - size_t ninitial = (pool->initialsize - sizeof(sq_entry_t)) / blocksize; - size_t size = ninitial * blocksize + sizeof(sq_entry_t); + size_t ninitial = (pool->initialsize - MEMPOOL_HEADER_SIZE) / + blocksize; + size_t size = ninitial * blocksize + MEMPOOL_HEADER_SIZE; FAR char *base; base = pool->alloc(pool, size); @@ -363,11 +366,11 @@ retry: size_t blocksize = MEMPOOL_REALBLOCKSIZE(pool); spin_unlock_irqrestore(&pool->lock, flags); - if (pool->expandsize >= blocksize + sizeof(sq_entry_t)) + if (pool->expandsize >= blocksize + MEMPOOL_HEADER_SIZE) { - size_t nexpand = (pool->expandsize - sizeof(sq_entry_t)) / + size_t nexpand = (pool->expandsize - MEMPOOL_HEADER_SIZE) / blocksize; - size_t size = nexpand * blocksize + sizeof(sq_entry_t); + size_t size = nexpand * blocksize + MEMPOOL_HEADER_SIZE; FAR char *base = pool->alloc(pool, size); if (base == NULL) @@ -499,7 +502,7 @@ int mempool_info(FAR struct mempool_s *pool, FAR struct mempoolinfo_s *info) info->ordblks = sq_count(&pool->queue); info->iordblks = sq_count(&pool->iqueue); info->aordblks = pool->nalloc; - info->arena = sq_count(&pool->equeue) * sizeof(sq_entry_t) + + info->arena = sq_count(&pool->equeue) * MEMPOOL_HEADER_SIZE + (info->aordblks + info->ordblks + info->iordblks) * blocksize; spin_unlock_irqrestore(&pool->lock, flags); info->sizeblks = blocksize; @@ -620,16 +623,16 @@ int mempool_deinit(FAR struct mempool_s *pool) return -EBUSY; } - if (pool->initialsize >= blocksize + sizeof(sq_entry_t)) + if (pool->initialsize >= blocksize + MEMPOOL_HEADER_SIZE) { - count = (pool->initialsize - sizeof(sq_entry_t)) / blocksize; + count = (pool->initialsize - MEMPOOL_HEADER_SIZE) / blocksize; } if (count == 0) { - if (pool->expandsize >= blocksize + sizeof(sq_entry_t)) + if (pool->expandsize >= blocksize + MEMPOOL_HEADER_SIZE) { - count = (pool->expandsize - sizeof(sq_entry_t)) / blocksize; + count = (pool->expandsize - MEMPOOL_HEADER_SIZE) / blocksize; } } @@ -641,11 +644,11 @@ int mempool_deinit(FAR struct mempool_s *pool) { blk = (FAR sq_entry_t *)((FAR char *)blk - count * blocksize); - blk = kasan_unpoison(blk, count * blocksize + sizeof(sq_entry_t)); + blk = kasan_unpoison(blk, count * blocksize + MEMPOOL_HEADER_SIZE); pool->free(pool, blk); - if (pool->expandsize >= blocksize + sizeof(sq_entry_t)) + if (pool->expandsize >= blocksize + MEMPOOL_HEADER_SIZE) { - count = (pool->expandsize - sizeof(sq_entry_t)) / blocksize; + count = (pool->expandsize - MEMPOOL_HEADER_SIZE) / blocksize; } }