Skip to content
Permalink
Browse files

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>
  • Loading branch information...
Nicolas Pitre authored and andrewboie committed May 22, 2019
1 parent cf97437 commit fc4ca923bbe7fb013ccc4e26a17be4c8b2d1e6ad
Showing with 7 additions and 7 deletions.
  1. +5 −5 include/sys/mempool_base.h
  2. +2 −2 lib/os/mempool.c
@@ -18,7 +18,7 @@
struct sys_mem_pool_lvl {
union {
u32_t *bits_p;
u32_t bits;
u32_t bits[sizeof(u32_t *)/4];
};
sys_dlist_t free_list;
};
@@ -67,11 +67,11 @@ struct sys_mem_pool_base {
#define Z_MPOOL_LBIT_WORDS_UNCLAMPED(n_max, l) \
((((n_max) << (2*(l))) + 31) / 32)

/* One word gets stored free unioned with the pointer, otherwise the
* calculated unclamped value
/* One or two 32-bit words gets stored free unioned with the pointer,
* otherwise the calculated unclamped value
*/
#define Z_MPOOL_LBIT_WORDS(n_max, l) \
(Z_MPOOL_LBIT_WORDS_UNCLAMPED(n_max, l) < 2 ? 0 \
#define Z_MPOOL_LBIT_WORDS(n_max, l) \
(Z_MPOOL_LBIT_WORDS_UNCLAMPED(n_max, l) <= sizeof(u32_t *)/4 ? 0 \
: Z_MPOOL_LBIT_WORDS_UNCLAMPED(n_max, l))

/* How many bytes for the bitfields of a single level? */
@@ -33,7 +33,7 @@ static int get_bit_ptr(struct sys_mem_pool_base *p, int level, int bn,
u32_t **word)
{
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];

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

if (nblocks <= 32) {
if (nblocks <= sizeof(p->levels[i].bits)*8) {
p->max_inline_level = i;
} else {
p->levels[i].bits_p = bits;

0 comments on commit fc4ca92

Please sign in to comment.
You can’t perform that action at this time.