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