kernel: Re-factor sys_mem_blocks definition
Rearranges the sys_mem_blocks fields so that information that describes
how much of the memory block is used is co-located. This will allow
easier of its statistics into the object core statistics reporting
framework.
Signed-off-by: Peter Mitsis <peter.mitsis@intel.com>
diff --git a/drivers/mm/mm_drv_intel_adsp_mtl_tlb.c b/drivers/mm/mm_drv_intel_adsp_mtl_tlb.c
index 899b75c..55a9b17 100644
--- a/drivers/mm/mm_drv_intel_adsp_mtl_tlb.c
+++ b/drivers/mm/mm_drv_intel_adsp_mtl_tlb.c
@@ -625,7 +625,7 @@
uint32_t avalible_memory_size = ace_hpsram_get_bank_count() * SRAM_BANK_SIZE;
- L2_PHYS_SRAM_REGION.num_blocks = avalible_memory_size / CONFIG_MM_DRV_PAGE_SIZE;
+ L2_PHYS_SRAM_REGION.info.num_blocks = avalible_memory_size / CONFIG_MM_DRV_PAGE_SIZE;
ret = calculate_memory_regions(UNUSED_L2_START_ALIGNED);
CHECKIF(ret != 0) {
diff --git a/include/zephyr/rtio/rtio.h b/include/zephyr/rtio/rtio.h
index 2848150..ecbacb9 100644
--- a/include/zephyr/rtio/rtio.h
+++ b/include/zephyr/rtio/rtio.h
@@ -383,7 +383,7 @@
if (r == NULL || r->block_pool == NULL) {
return 0;
}
- return BIT(r->block_pool->blk_sz_shift);
+ return BIT(r->block_pool->info.blk_sz_shift);
#endif
}
@@ -402,7 +402,7 @@
uint32_t block_size = rtio_mempool_block_size(r);
uintptr_t buff = (uintptr_t)mem_pool->buffer;
- uint32_t buff_size = mem_pool->num_blocks * block_size;
+ uint32_t buff_size = mem_pool->info.num_blocks * block_size;
if (addr < buff || addr >= buff + buff_size) {
return UINT16_MAX;
@@ -693,7 +693,7 @@
static inline void rtio_block_pool_free(struct rtio *r, void *buf, uint32_t buf_len)
{
#ifdef CONFIG_RTIO_SYS_MEM_BLOCKS
- size_t num_blks = buf_len >> r->block_pool->blk_sz_shift;
+ size_t num_blks = buf_len >> r->block_pool->info.blk_sz_shift;
sys_mem_blocks_free_contiguous(r->block_pool, buf, num_blks);
#endif
@@ -1019,8 +1019,9 @@
if (iodev_sqe->sqe.op == RTIO_OP_RX && iodev_sqe->sqe.flags & RTIO_SQE_MEMPOOL_BUFFER) {
struct rtio *r = iodev_sqe->r;
struct sys_mem_blocks *mem_pool = r->block_pool;
- int blk_index = (iodev_sqe->sqe.buf - mem_pool->buffer) >> mem_pool->blk_sz_shift;
- int blk_count = iodev_sqe->sqe.buf_len >> mem_pool->blk_sz_shift;
+ int blk_index = (iodev_sqe->sqe.buf - mem_pool->buffer) >>
+ mem_pool->info.blk_sz_shift;
+ int blk_count = iodev_sqe->sqe.buf_len >> mem_pool->info.blk_sz_shift;
flags = RTIO_CQE_FLAG_PREP_MEMPOOL(blk_index, blk_count);
}
@@ -1062,7 +1063,7 @@
*buff_len = blk_count * blk_size;
__ASSERT_NO_MSG(*buff >= r->block_pool->buffer);
__ASSERT_NO_MSG(*buff <
- r->block_pool->buffer + blk_size * r->block_pool->num_blocks);
+ r->block_pool->buffer + blk_size * r->block_pool->info.num_blocks);
return 0;
}
return -EINVAL;
diff --git a/include/zephyr/sys/mem_blocks.h b/include/zephyr/sys/mem_blocks.h
index 53f6cbf..77c37a7 100644
--- a/include/zephyr/sys/mem_blocks.h
+++ b/include/zephyr/sys/mem_blocks.h
@@ -82,12 +82,17 @@
* @cond INTERNAL_HIDDEN
*/
-struct sys_mem_blocks {
- /* Number of blocks */
- uint32_t num_blocks;
+struct sys_mem_blocks_info {
+ uint32_t num_blocks; /* Total number of blocks */
+ uint8_t blk_sz_shift; /* Bit shift for block size */
+#ifdef CONFIG_SYS_MEM_BLOCKS_RUNTIME_STATS
+ uint32_t used_blocks; /* Current number of blocks in use */
+ uint32_t max_used_blocks; /* Maximum number of blocks in use */
+#endif
+};
- /* Bit shift for block size */
- uint8_t blk_sz_shift;
+struct sys_mem_blocks {
+ struct sys_mem_blocks_info info;
/* Memory block buffer */
uint8_t *buffer;
@@ -98,11 +103,7 @@
#ifdef CONFIG_SYS_MEM_BLOCKS_RUNTIME_STATS
/* Spinlock guarding access to memory block internals */
struct k_spinlock lock;
-
- uint32_t used_blocks;
- uint32_t max_used_blocks;
#endif
-
};
struct sys_multi_mem_blocks {
@@ -125,8 +126,7 @@
_SYS_BITARRAY_DEFINE(_sys_mem_blocks_bitmap_##name, \
num_blks, mbmod); \
mbmod sys_mem_blocks_t name = { \
- .num_blocks = num_blks, \
- .blk_sz_shift = ilog2(blk_sz), \
+ .info = {num_blks, ilog2(blk_sz)}, \
.buffer = buf, \
.bitmap = &_sys_mem_blocks_bitmap_##name, \
}
diff --git a/lib/os/mem_blocks.c b/lib/os/mem_blocks.c
index 3517a57..e282a61 100644
--- a/lib/os/mem_blocks.c
+++ b/lib/os/mem_blocks.c
@@ -16,7 +16,6 @@
size_t offset;
int r;
uint8_t *blk;
- void *ret = NULL;
#ifdef CONFIG_SYS_MEM_BLOCKS_RUNTIME_STATS
k_spinlock_key_t key = k_spin_lock(&mem_block->lock);
@@ -24,29 +23,33 @@
/* Find an unallocated block */
r = sys_bitarray_alloc(mem_block->bitmap, num_blocks, &offset);
- if (r == 0) {
-
+ if (r != 0) {
#ifdef CONFIG_SYS_MEM_BLOCKS_RUNTIME_STATS
- mem_block->used_blocks += (uint32_t)num_blocks;
-
- if (mem_block->max_used_blocks < mem_block->used_blocks) {
- mem_block->max_used_blocks = mem_block->used_blocks;
- }
-
k_spin_unlock(&mem_block->lock, key);
#endif
-
- /* Calculate the start address of the newly allocated block */
-
- blk = mem_block->buffer + (offset << mem_block->blk_sz_shift);
-
- ret = blk;
+ return NULL;
}
- return ret;
+
+#ifdef CONFIG_SYS_MEM_BLOCKS_RUNTIME_STATS
+ mem_block->info.used_blocks += (uint32_t)num_blocks;
+
+ if (mem_block->info.max_used_blocks < mem_block->info.used_blocks) {
+ mem_block->info.max_used_blocks = mem_block->info.used_blocks;
+ }
+
+ k_spin_unlock(&mem_block->lock, key);
+#endif
+
+ /* Calculate the start address of the newly allocated block */
+
+ blk = mem_block->buffer + (offset << mem_block->info.blk_sz_shift);
+
+ return blk;
}
-static int free_blocks(sys_mem_blocks_t *mem_block, void *ptr, size_t num_blocks)
+static int free_blocks(sys_mem_blocks_t *mem_block, void *ptr,
+ size_t num_blocks)
{
size_t offset;
uint8_t *blk = ptr;
@@ -58,8 +61,8 @@
goto out;
}
- offset = (blk - mem_block->buffer) >> mem_block->blk_sz_shift;
- if (offset >= mem_block->num_blocks) {
+ offset = (blk - mem_block->buffer) >> mem_block->info.blk_sz_shift;
+ if (offset >= mem_block->info.num_blocks) {
ret = -EFAULT;
goto out;
}
@@ -71,7 +74,7 @@
#ifdef CONFIG_SYS_MEM_BLOCKS_RUNTIME_STATS
if (ret == 0) {
- mem_block->used_blocks -= (uint32_t) num_blocks;
+ mem_block->info.used_blocks -= (uint32_t)num_blocks;
}
k_spin_unlock(&mem_block->lock, key);
@@ -82,7 +85,7 @@
}
int sys_mem_blocks_alloc_contiguous(sys_mem_blocks_t *mem_block, size_t count,
- void **out_block)
+ void **out_block)
{
int ret = 0;
@@ -95,7 +98,7 @@
goto out;
}
- if (count > mem_block->num_blocks) {
+ if (count > mem_block->info.num_blocks) {
/* Definitely not enough blocks to be allocated */
ret = -ENOMEM;
goto out;
@@ -111,11 +114,11 @@
*out_block = ptr;
#ifdef CONFIG_SYS_MEM_BLOCKS_LISTENER
heap_listener_notify_alloc(HEAP_ID_FROM_POINTER(mem_block),
- ptr, count << mem_block->blk_sz_shift);
+ ptr, count << mem_block->info.blk_sz_shift);
#endif
out:
- return ret;
+ return ret;
}
int sys_mem_blocks_alloc(sys_mem_blocks_t *mem_block, size_t count,
@@ -134,7 +137,7 @@
goto out;
}
- if (count > mem_block->num_blocks) {
+ if (count > mem_block->info.num_blocks) {
/* Definitely not enough blocks to be allocated */
ret = -ENOMEM;
goto out;
@@ -151,7 +154,8 @@
#ifdef CONFIG_SYS_MEM_BLOCKS_LISTENER
heap_listener_notify_alloc(HEAP_ID_FROM_POINTER(mem_block),
- ptr, BIT(mem_block->blk_sz_shift));
+ ptr,
+ BIT(mem_block->info.blk_sz_shift));
#endif
}
@@ -165,7 +169,8 @@
return ret;
}
-int sys_mem_blocks_is_region_free(sys_mem_blocks_t *mem_block, void *in_block, size_t count)
+int sys_mem_blocks_is_region_free(sys_mem_blocks_t *mem_block, void *in_block,
+ size_t count)
{
bool result;
size_t offset;
@@ -174,11 +179,13 @@
__ASSERT_NO_MSG(mem_block->bitmap != NULL);
__ASSERT_NO_MSG(mem_block->buffer != NULL);
- offset = ((uint8_t *)in_block - mem_block->buffer) >> mem_block->blk_sz_shift;
+ offset = ((uint8_t *)in_block - mem_block->buffer) >>
+ mem_block->info.blk_sz_shift;
- __ASSERT_NO_MSG(offset + count <= mem_block->num_blocks);
+ __ASSERT_NO_MSG(offset + count <= mem_block->info.num_blocks);
- result = sys_bitarray_is_region_cleared(mem_block->bitmap, count, offset);
+ result = sys_bitarray_is_region_cleared(mem_block->bitmap, count,
+ offset);
return result;
}
@@ -196,9 +203,10 @@
goto out;
}
- offset = ((uint8_t *)in_block - mem_block->buffer) >> mem_block->blk_sz_shift;
+ offset = ((uint8_t *)in_block - mem_block->buffer) >>
+ mem_block->info.blk_sz_shift;
- if (offset + count > mem_block->num_blocks) {
+ if (offset + count > mem_block->info.num_blocks) {
/* Definitely not enough blocks to be allocated */
ret = -ENOMEM;
goto out;
@@ -208,7 +216,8 @@
k_spinlock_key_t key = k_spin_lock(&mem_block->lock);
#endif
- ret = sys_bitarray_test_and_set_region(mem_block->bitmap, count, offset, true);
+ ret = sys_bitarray_test_and_set_region(mem_block->bitmap, count,
+ offset, true);
if (ret != 0) {
#ifdef CONFIG_SYS_MEM_BLOCKS_RUNTIME_STATS
@@ -219,10 +228,10 @@
}
#ifdef CONFIG_SYS_MEM_BLOCKS_RUNTIME_STATS
- mem_block->used_blocks += (uint32_t)count;
+ mem_block->info.used_blocks += (uint32_t)count;
- if (mem_block->max_used_blocks < mem_block->used_blocks) {
- mem_block->max_used_blocks = mem_block->used_blocks;
+ if (mem_block->info.max_used_blocks < mem_block->info.used_blocks) {
+ mem_block->info.max_used_blocks = mem_block->info.used_blocks;
}
k_spin_unlock(&mem_block->lock, key);
@@ -230,7 +239,7 @@
#ifdef CONFIG_SYS_MEM_BLOCKS_LISTENER
heap_listener_notify_alloc(HEAP_ID_FROM_POINTER(mem_block),
- in_block, count << mem_block->blk_sz_shift);
+ in_block, count << mem_block->info.blk_sz_shift);
#endif
out:
@@ -254,7 +263,7 @@
goto out;
}
- if (count > mem_block->num_blocks) {
+ if (count > mem_block->info.num_blocks) {
ret = -EINVAL;
goto out;
}
@@ -275,7 +284,7 @@
* notifying at the end of function.
*/
heap_listener_notify_free(HEAP_ID_FROM_POINTER(mem_block),
- ptr, BIT(mem_block->blk_sz_shift));
+ ptr, BIT(mem_block->info.blk_sz_shift));
}
#endif
}
@@ -297,7 +306,7 @@
goto out;
}
- if (count > mem_block->num_blocks) {
+ if (count > mem_block->info.num_blocks) {
ret = -EINVAL;
goto out;
}
@@ -309,7 +318,7 @@
}
#ifdef CONFIG_SYS_MEM_BLOCKS_LISTENER
heap_listener_notify_free(HEAP_ID_FROM_POINTER(mem_block),
- block, count << mem_block->blk_sz_shift);
+ block, count << mem_block->info.blk_sz_shift);
#endif
out:
@@ -363,7 +372,7 @@
ret = sys_mem_blocks_alloc(allocator, count, out_blocks);
if ((ret == 0) && (blk_size != NULL)) {
- *blk_size = BIT(allocator->blk_sz_shift);
+ *blk_size = BIT(allocator->info.blk_sz_shift);
}
out:
@@ -395,7 +404,8 @@
one_alloc = group->allocators[i];
start = one_alloc->buffer;
- end = start + (BIT(one_alloc->blk_sz_shift) * one_alloc->num_blocks);
+ end = start + (BIT(one_alloc->info.blk_sz_shift) *
+ one_alloc->info.num_blocks);
if (((uint8_t *)in_blocks[0] >= start) &&
((uint8_t *)in_blocks[0] < end)) {
@@ -422,12 +432,13 @@
return -EINVAL;
}
- stats->allocated_bytes = mem_block->used_blocks <<
- mem_block->blk_sz_shift;
- stats->free_bytes = (mem_block->num_blocks << mem_block->blk_sz_shift) -
+ stats->allocated_bytes = mem_block->info.used_blocks <<
+ mem_block->info.blk_sz_shift;
+ stats->free_bytes = (mem_block->info.num_blocks <<
+ mem_block->info.blk_sz_shift) -
stats->allocated_bytes;
- stats->max_allocated_bytes = mem_block->max_used_blocks <<
- mem_block->blk_sz_shift;
+ stats->max_allocated_bytes = mem_block->info.max_used_blocks <<
+ mem_block->info.blk_sz_shift;
return 0;
}
@@ -438,7 +449,7 @@
return -EINVAL;
}
- mem_block->max_used_blocks = mem_block->used_blocks;
+ mem_block->info.max_used_blocks = mem_block->info.used_blocks;
return 0;
}
diff --git a/tests/drivers/build_all/sensor/src/generic_test.c b/tests/drivers/build_all/sensor/src/generic_test.c
index 256a16c..42ac57e 100644
--- a/tests/drivers/build_all/sensor/src/generic_test.c
+++ b/tests/drivers/build_all/sensor/src/generic_test.c
@@ -58,7 +58,7 @@
/* Wipe the mempool by marking every block free */
zassert_ok(sys_bitarray_clear_region(sensor_read_rtio_ctx.block_pool->bitmap,
- sensor_read_rtio_ctx.block_pool->num_blocks,
+ sensor_read_rtio_ctx.block_pool->info.num_blocks,
0));
/* Flush the SQ and CQ */
diff --git a/tests/lib/mem_blocks/src/main.c b/tests/lib/mem_blocks/src/main.c
index d7351a1..4641a6d 100644
--- a/tests/lib/mem_blocks/src/main.c
+++ b/tests/lib/mem_blocks/src/main.c
@@ -61,7 +61,8 @@
uint8_t *start, *end, *ptr_u8;
start = mem_block->buffer;
- end = start + (BIT(mem_block->blk_sz_shift) * mem_block->num_blocks);
+ end = start + (BIT(mem_block->info.blk_sz_shift) *
+ mem_block->info.num_blocks);
ptr_u8 = (uint8_t *)ptr;
@@ -155,9 +156,11 @@
zassert_equal(listener_mem[i], blocks[i][0],
"Heap allocated pointer mismatched: %p != %p",
listener_mem[i], blocks[i][0]);
- zassert_equal(listener_size[i], BIT(mem_block->blk_sz_shift),
+ zassert_equal(listener_size[i],
+ BIT(mem_block->info.blk_sz_shift),
"Heap allocated sized: %u != %u",
- listener_size[i], BIT(mem_block->blk_sz_shift));
+ listener_size[i],
+ BIT(mem_block->info.blk_sz_shift));
#endif
}
@@ -190,9 +193,11 @@
zassert_equal(listener_mem[i], blocks[i][0],
"Heap allocated pointer mismatched: %p != %p",
listener_mem[i], blocks[i][0]);
- zassert_equal(listener_size[i], BIT(mem_block->blk_sz_shift),
+ zassert_equal(listener_size[i],
+ BIT(mem_block->info.blk_sz_shift),
"Heap allocated sized: %u != %u",
- listener_size[i], BIT(mem_block->blk_sz_shift));
+ listener_size[i],
+ BIT(mem_block->info.blk_sz_shift));
#endif
}
}
@@ -701,7 +706,8 @@
/* Fake a pointer */
blocks[0] = mem_block_01.buffer +
- (BIT(mem_block_01.blk_sz_shift) * mem_block_01.num_blocks);
+ (BIT(mem_block_01.info.blk_sz_shift) *
+ mem_block_01.info.num_blocks);
ret = sys_mem_blocks_free(&mem_block_01, 1, blocks);
zassert_equal(ret, -EFAULT,
"sys_mem_blocks_free should fail with -EFAULT but not");
@@ -791,7 +797,8 @@
/* Fake a pointer */
blocks[0] = mem_block_01.buffer +
- (BIT(mem_block_01.blk_sz_shift) * mem_block_01.num_blocks);
+ (BIT(mem_block_01.info.blk_sz_shift) *
+ mem_block_01.info.num_blocks);
ret = sys_multi_mem_blocks_free(&alloc_group, 1, blocks);
zassert_equal(ret, -EINVAL,
"sys_multi_mem_blocks_free should fail with -EINVAL but not");