@@ -52,6 +52,11 @@ struct dmm_heap {
52
52
size_t blk_size ;
53
53
const struct dmm_region * region ;
54
54
sys_bitarray_t bitarray ;
55
+ #ifdef CONFIG_DMM_STATS
56
+ atomic_t curr_use ;
57
+ uint32_t max_use ;
58
+ struct k_spinlock lock ;
59
+ #endif
55
60
};
56
61
57
62
static const struct dmm_region dmm_regions [] = {
@@ -235,6 +240,15 @@ static void *dmm_buffer_alloc(struct dmm_heap *dh, size_t length)
235
240
236
241
tail_mask_set (dh -> tail_mask , num_bits , off );
237
242
243
+ #ifdef CONFIG_DMM_STATS
244
+ k_spinlock_key_t key ;
245
+
246
+ key = k_spin_lock (& dh -> lock );
247
+ dh -> curr_use += num_bits ;
248
+ dh -> max_use = MAX (dh -> max_use , dh -> curr_use );
249
+ k_spin_unlock (& dh -> lock , key );
250
+ #endif
251
+
238
252
return (void * )(dh -> ptr + dh -> blk_size * off );
239
253
}
240
254
@@ -244,6 +258,9 @@ static void dmm_buffer_free(struct dmm_heap *dh, void *buffer)
244
258
size_t num_bits = num_bits_get (dh -> tail_mask , offset );
245
259
int rv ;
246
260
261
+ #ifdef CONFIG_DMM_STATS
262
+ atomic_sub (& dh -> curr_use , num_bits );
263
+ #endif
247
264
rv = sys_bitarray_free (& dh -> bitarray , num_bits , offset );
248
265
(void )rv ;
249
266
__ASSERT_NO_MSG (rv == 0 );
@@ -431,6 +448,34 @@ int dmm_buffer_in_release(void *region, void *user_buffer, size_t user_length, v
431
448
return 0 ;
432
449
}
433
450
451
+ int dmm_stats_get (void * region , uintptr_t * start_addr , uint32_t * curr_use , uint32_t * max_use )
452
+ {
453
+ #ifdef CONFIG_DMM_STATS
454
+ struct dmm_heap * dh ;
455
+
456
+ dh = dmm_heap_find (region );
457
+ if (dh == NULL ) {
458
+ return - EINVAL ;
459
+ }
460
+
461
+ if (start_addr ) {
462
+ * start_addr = dh -> ptr ;
463
+ }
464
+
465
+ if (curr_use ) {
466
+ * curr_use = (100 * dh -> curr_use ) / dh -> bitarray .num_bits ;
467
+ }
468
+
469
+ if (max_use ) {
470
+ * max_use = (100 * dh -> max_use ) / dh -> bitarray .num_bits ;
471
+ }
472
+
473
+ return 0 ;
474
+ #else
475
+ return - ENOTSUP ;
476
+ #endif
477
+ }
478
+
434
479
int dmm_init (void )
435
480
{
436
481
struct dmm_heap * dh ;
0 commit comments