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:
parent
e6f77d7f14
commit
9af2f0ee82
1 changed files with 18 additions and 15 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue