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:
parent
d62e229680
commit
cf974371fb
|
@ -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, \
|
||||
|
|
|
@ -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, \
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue