diff --git a/arch/sim/src/sim/up_heap.c b/arch/sim/src/sim/up_heap.c index 5b7055e1efc..2307973054a 100644 --- a/arch/sim/src/sim/up_heap.c +++ b/arch/sim/src/sim/up_heap.c @@ -48,7 +48,11 @@ struct mm_delaynode_s struct mm_heap_impl_s { - struct mm_delaynode_s *mm_delaylist; +#ifdef CONFIG_SMP + struct mm_delaynode_s *mm_delaylist[CONFIG_SMP_NCPUS]; +#else + struct mm_delaynode_s *mm_delaylist[1]; +#endif }; /**************************************************************************** @@ -65,8 +69,8 @@ static void mm_add_delaylist(FAR struct mm_heap_s *heap, FAR void *mem) flags = enter_critical_section(); - tmp->flink = heap->mm_impl->mm_delaylist; - heap->mm_impl->mm_delaylist = tmp; + tmp->flink = heap->mm_impl->mm_delaylist[up_cpu_index()]; + heap->mm_impl->mm_delaylist[up_cpu_index()] = tmp; leave_critical_section(flags); } @@ -83,8 +87,8 @@ static void mm_free_delaylist(FAR struct mm_heap_s *heap) flags = enter_critical_section(); - tmp = heap->mm_impl->mm_delaylist; - heap->mm_impl->mm_delaylist = NULL; + tmp = heap->mm_impl->mm_delaylist[up_cpu_index()]; + heap->mm_impl->mm_delaylist[up_cpu_index()] = NULL; leave_critical_section(flags); @@ -137,7 +141,9 @@ void mm_initialize(FAR struct mm_heap_s *heap, FAR void *heap_start, FAR struct mm_heap_impl_s *impl; impl = host_memalign(sizeof(FAR void *), sizeof(*impl)); - impl->mm_delaylist = NULL; + DEBUGASSERT(impl); + + memset(impl, 0, sizeof(struct mm_heap_impl_s)); heap->mm_impl = impl; } diff --git a/mm/mm_heap/mm.h b/mm/mm_heap/mm.h index 987ddfaf9f6..b1d13f6bbac 100644 --- a/mm/mm_heap/mm.h +++ b/mm/mm_heap/mm.h @@ -202,7 +202,11 @@ struct mm_heap_impl_s /* Free delay list, for some situation can't do free immdiately */ - FAR struct mm_delaynode_s *mm_delaylist; +#ifdef CONFIG_SMP + FAR struct mm_delaynode_s *mm_delaylist[CONFIG_SMP_NCPUS]; +#else + FAR struct mm_delaynode_s *mm_delaylist[1]; +#endif }; /* Functions contained in mm_sem.c ******************************************/ diff --git a/mm/mm_heap/mm_free.c b/mm/mm_heap/mm_free.c index ea46914cbe5..dff0748c303 100644 --- a/mm/mm_heap/mm_free.c +++ b/mm/mm_heap/mm_free.c @@ -50,8 +50,8 @@ static void mm_add_delaylist(FAR struct mm_heap_s *heap, FAR void *mem) flags = enter_critical_section(); - tmp->flink = heap_impl->mm_delaylist; - heap_impl->mm_delaylist = tmp; + tmp->flink = heap_impl->mm_delaylist[up_cpu_index()]; + heap_impl->mm_delaylist[up_cpu_index()] = tmp; leave_critical_section(flags); } diff --git a/mm/mm_heap/mm_initialize.c b/mm/mm_heap/mm_initialize.c index 62759e95861..2948b1adcb2 100644 --- a/mm/mm_heap/mm_initialize.c +++ b/mm/mm_heap/mm_initialize.c @@ -191,20 +191,10 @@ void mm_initialize(FAR struct mm_heap_s *heap, FAR void *heapstart, /* Set up global variables */ - heap_impl->mm_heapsize = 0; - -#if CONFIG_MM_REGIONS > 1 - heap_impl->mm_nregions = 0; -#endif - - /* Initialize mm_delaylist */ - - heap_impl->mm_delaylist = NULL; + memset(heap_impl, 0, sizeof(struct mm_heap_impl_s)); /* Initialize the node array */ - memset(heap_impl->mm_nodelist, 0, - sizeof(struct mm_freenode_s) * MM_NNODES); for (i = 1; i < MM_NNODES; i++) { heap_impl->mm_nodelist[i - 1].flink = &heap_impl->mm_nodelist[i]; diff --git a/mm/mm_heap/mm_malloc.c b/mm/mm_heap/mm_malloc.c index 86b18615017..5aa0528b26f 100644 --- a/mm/mm_heap/mm_malloc.c +++ b/mm/mm_heap/mm_malloc.c @@ -59,8 +59,8 @@ static void mm_free_delaylist(FAR struct mm_heap_s *heap) flags = enter_critical_section(); - tmp = heap_impl->mm_delaylist; - heap_impl->mm_delaylist = NULL; + tmp = heap_impl->mm_delaylist[up_cpu_index()]; + heap_impl->mm_delaylist[up_cpu_index()] = NULL; leave_critical_section(flags); diff --git a/mm/tlsf/mm_tlsf.c b/mm/tlsf/mm_tlsf.c index 728759962e4..8761ba59d5b 100644 --- a/mm/tlsf/mm_tlsf.c +++ b/mm/tlsf/mm_tlsf.c @@ -87,7 +87,11 @@ struct mm_heap_impl_s /* Free delay list, for some situation can't do free immdiately */ - FAR struct mm_delaynode_s *mm_delaylist; +#ifdef CONFIG_SMP + struct mm_delaynode_s *mm_delaylist[CONFIG_SMP_NCPUS]; +#else + struct mm_delaynode_s *mm_delaylist[1]; +#endif }; /**************************************************************************** @@ -306,8 +310,8 @@ static void mm_add_delaylist(FAR struct mm_heap_s *heap, FAR void *mem) flags = enter_critical_section(); - tmp->flink = impl->mm_delaylist; - impl->mm_delaylist = tmp; + tmp->flink = impl->mm_delaylist[up_cpu_index()]; + impl->mm_delaylist[up_cpu_index()] = tmp; leave_critical_section(flags); } @@ -331,8 +335,8 @@ static void mm_free_delaylist(FAR struct mm_heap_s *heap) flags = enter_critical_section(); - tmp = impl->mm_delaylist; - impl->mm_delaylist = NULL; + tmp = impl->mm_delaylist[up_cpu_index()]; + impl->mm_delaylist[up_cpu_index()] = NULL; leave_critical_section(flags);