mempool: fully use the inline free block bitmap on 64-bit targets

The "bits" field in struct sys_mem_pool_lvl is unioned with a pointer.
That leaves more space for inline free bits on 64-bit targets.
Let's declare it as an array and adjust its size based on the pointer
size. On 32-bit targets the generated code remains identical.

Signed-off-by: Nicolas Pitre <npitre@baylibre.com>
This commit is contained in:
Nicolas Pitre 2019-05-22 15:16:11 -04:00 committed by Andrew Boie
commit fc4ca923bb
2 changed files with 7 additions and 7 deletions

View file

@ -18,7 +18,7 @@
struct sys_mem_pool_lvl { struct sys_mem_pool_lvl {
union { union {
u32_t *bits_p; u32_t *bits_p;
u32_t bits; u32_t bits[sizeof(u32_t *)/4];
}; };
sys_dlist_t free_list; sys_dlist_t free_list;
}; };
@ -67,11 +67,11 @@ struct sys_mem_pool_base {
#define Z_MPOOL_LBIT_WORDS_UNCLAMPED(n_max, l) \ #define Z_MPOOL_LBIT_WORDS_UNCLAMPED(n_max, l) \
((((n_max) << (2*(l))) + 31) / 32) ((((n_max) << (2*(l))) + 31) / 32)
/* One word gets stored free unioned with the pointer, otherwise the /* One or two 32-bit words gets stored free unioned with the pointer,
* calculated unclamped value * otherwise the calculated unclamped value
*/ */
#define Z_MPOOL_LBIT_WORDS(n_max, l) \ #define Z_MPOOL_LBIT_WORDS(n_max, l) \
(Z_MPOOL_LBIT_WORDS_UNCLAMPED(n_max, l) < 2 ? 0 \ (Z_MPOOL_LBIT_WORDS_UNCLAMPED(n_max, l) <= sizeof(u32_t *)/4 ? 0 \
: Z_MPOOL_LBIT_WORDS_UNCLAMPED(n_max, l)) : Z_MPOOL_LBIT_WORDS_UNCLAMPED(n_max, l))
/* How many bytes for the bitfields of a single level? */ /* How many bytes for the bitfields of a single level? */

View file

@ -33,7 +33,7 @@ static int get_bit_ptr(struct sys_mem_pool_base *p, int level, int bn,
u32_t **word) u32_t **word)
{ {
u32_t *bitarray = level <= p->max_inline_level ? u32_t *bitarray = level <= p->max_inline_level ?
&p->levels[level].bits : p->levels[level].bits_p; p->levels[level].bits : p->levels[level].bits_p;
*word = &bitarray[bn / 32]; *word = &bitarray[bn / 32];
@ -104,7 +104,7 @@ void z_sys_mem_pool_base_init(struct sys_mem_pool_base *p)
sys_dlist_init(&p->levels[i].free_list); sys_dlist_init(&p->levels[i].free_list);
if (nblocks <= 32) { if (nblocks <= sizeof(p->levels[i].bits)*8) {
p->max_inline_level = i; p->max_inline_level = i;
} else { } else {
p->levels[i].bits_p = bits; p->levels[i].bits_p = bits;