mempool: Support mempool address and size alignment by setting CONFIG_MM_NODE_GUARDSIZE

Setting a reasonable CONFIG_MM_NODE_GUARDSIZE can ensure absolute alignment of usersize

Signed-off-by: wangmingrong1 <wangmingrong1@xiaomi.com>
This commit is contained in:
wangmingrong1 2025-03-19 14:29:57 +08:00 committed by Xiang Xiao
parent e6f77d7f14
commit 9af2f0ee82

View file

@ -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;
}
}