mempool: make alignment/rounding 64-bit compatible

Minimum alignment and rounding must be done on a word boundary. Let's
replace _ALIGN4() with WB_UP() which is equivalent on 32-bit targets,
and 64-bit aware.

Also enforce a minimal alignment on the memory pool. This is making
a difference mostly on64-bit targets where the widely used 4-byte
alignment is not sufficient.

The _ALIGN4() macro has no users left so it is removed.

Signed-off-by: Nicolas Pitre <npitre@baylibre.com>
This commit is contained in:
Nicolas Pitre 2019-06-26 11:32:58 -04:00 committed by Andrew Boie
parent d62e229680
commit cf974371fb
5 changed files with 9 additions and 11 deletions

View file

@ -4159,13 +4159,13 @@ struct k_mem_pool {
* @req K-MPOOL-001
*/
#define K_MEM_POOL_DEFINE(name, minsz, maxsz, nmax, align) \
char __aligned(align) _mpool_buf_##name[_ALIGN4(maxsz) * nmax \
char __aligned(WB_UP(align)) _mpool_buf_##name[WB_UP(maxsz) * nmax \
+ _MPOOL_BITS_SIZE(maxsz, minsz, nmax)]; \
struct sys_mem_pool_lvl _mpool_lvls_##name[Z_MPOOL_LVLS(maxsz, minsz)]; \
Z_STRUCT_SECTION_ITERABLE(k_mem_pool, name) = { \
.base = { \
.buf = _mpool_buf_##name, \
.max_sz = _ALIGN4(maxsz), \
.max_sz = WB_UP(maxsz), \
.n_max = nmax, \
.n_levels = Z_MPOOL_LVLS(maxsz, minsz), \
.levels = _mpool_lvls_##name, \

View file

@ -47,15 +47,15 @@ struct sys_mem_pool_block {
* @param section Destination binary section for pool data
*/
#define SYS_MEM_POOL_DEFINE(name, ignored, minsz, maxsz, nmax, align, section) \
char __aligned(align) Z_GENERIC_SECTION(section) \
_mpool_buf_##name[_ALIGN4(maxsz) * nmax \
char __aligned(WB_UP(align)) Z_GENERIC_SECTION(section) \
_mpool_buf_##name[WB_UP(maxsz) * nmax \
+ _MPOOL_BITS_SIZE(maxsz, minsz, nmax)]; \
struct sys_mem_pool_lvl Z_GENERIC_SECTION(section) \
_mpool_lvls_##name[Z_MPOOL_LVLS(maxsz, minsz)]; \
Z_GENERIC_SECTION(section) struct sys_mem_pool name = { \
.base = { \
.buf = _mpool_buf_##name, \
.max_sz = _ALIGN4(maxsz), \
.max_sz = WB_UP(maxsz), \
.n_max = nmax, \
.n_levels = Z_MPOOL_LVLS(maxsz, minsz), \
.levels = _mpool_lvls_##name, \

View file

@ -36,8 +36,6 @@ struct sys_mem_pool_base {
u8_t flags;
};
#define _ALIGN4(n) ((((n)+3)/4)*4)
#define Z_MPOOL_HAVE_LVL(maxsz, minsz, l) (((maxsz) >> (2*(l))) \
>= (minsz) ? 1 : 0)

View file

@ -107,7 +107,7 @@ void *realloc(void *ptr, size_t requested_size)
*/
block_size = blk->pool->base.max_sz;
for (int i = 1; i <= blk->level; i++) {
block_size = _ALIGN4(block_size / 4);
block_size = WB_UP(block_size / 4);
}
/* We really need this much memory */

View file

@ -111,7 +111,7 @@ void z_sys_mem_pool_base_init(struct sys_mem_pool_base *p)
bits += (nblocks + 31)/32;
}
sz = _ALIGN4(sz / 4);
sz = WB_UP(sz / 4);
}
for (i = 0; i < p->n_max; i++) {
@ -259,7 +259,7 @@ int z_sys_mem_pool_block_alloc(struct sys_mem_pool_base *p, size_t size,
lsizes[0] = p->max_sz;
for (i = 0; i < p->n_levels; i++) {
if (i > 0) {
lsizes[i] = _ALIGN4(lsizes[i-1] / 4);
lsizes[i] = WB_UP(lsizes[i-1] / 4);
}
if (lsizes[i] < size) {
@ -331,7 +331,7 @@ void z_sys_mem_pool_block_free(struct sys_mem_pool_base *p, u32_t level,
*/
lsizes[0] = p->max_sz;
for (i = 1; i <= level; i++) {
lsizes[i] = _ALIGN4(lsizes[i-1] / 4);
lsizes[i] = WB_UP(lsizes[i-1] / 4);
}
block_free(p, level, lsizes, block);