From 0169a51220a68d8d3bed0c20b6d606f43497a9e9 Mon Sep 17 00:00:00 2001 From: ligd Date: Mon, 14 Feb 2022 16:47:42 +0800 Subject: [PATCH] mm: handle take mm sem in IRQ Signed-off-by: ligd --- mm/mm_heap/mm_foreach.c | 5 ++++- mm/mm_heap/mm_sem.c | 25 +++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/mm/mm_heap/mm_foreach.c b/mm/mm_heap/mm_foreach.c index 25cec561f1..f2ad78bc26 100644 --- a/mm/mm_heap/mm_foreach.c +++ b/mm/mm_heap/mm_foreach.c @@ -68,7 +68,10 @@ void mm_foreach(FAR struct mm_heap_s *heap, mmchunk_handler_t handler, * Retake the semaphore for each region to reduce latencies */ - DEBUGVERIFY(mm_takesemaphore(heap)); + if (!mm_takesemaphore(heap)) + { + return; + } for (node = heap->mm_heapstart[region]; node < heap->mm_heapend[region]; diff --git a/mm/mm_heap/mm_sem.c b/mm/mm_heap/mm_sem.c index a4d4e869c7..b26a0dec97 100644 --- a/mm/mm_heap/mm_sem.c +++ b/mm/mm_heap/mm_sem.c @@ -104,9 +104,23 @@ bool mm_takesemaphore(FAR struct mm_heap_s *heap) #if defined(CONFIG_BUILD_FLAT) || defined(__KERNEL__) else if (sched_idletask()) { - /* Try to take the semaphore */ + return false; + } + else if (up_interrupt_context()) + { +#ifdef CONFIG_SMP + return false; +#else + int val; - return _SEM_TRYWAIT(&heap->mm_semaphore) >= 0; + /* Check the semaphore value, if held by someone, then return false. + * Else, we can take it, return true. + */ + + _SEM_GETVALUE(&heap->mm_semaphore, &val); + + return val > 0; +#endif } #endif else @@ -145,5 +159,12 @@ bool mm_takesemaphore(FAR struct mm_heap_s *heap) void mm_givesemaphore(FAR struct mm_heap_s *heap) { +#if defined(CONFIG_BUILD_FLAT) || defined(__KERNEL__) + if (up_interrupt_context()) + { + return; + } +#endif + DEBUGVERIFY(_SEM_POST(&heap->mm_semaphore)); }