From c3dfbfb39a71061c08d9f4cb874fd5b8a92e8fc5 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Sat, 23 Sep 2017 23:27:12 +0200 Subject: [PATCH] use one lock for the memory management to avoid deadlocks --- mm/malloc.c | 12 ++++++------ mm/vma.c | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/mm/malloc.c b/mm/malloc.c index dac637062..0718eb62a 100644 --- a/mm/malloc.c +++ b/mm/malloc.c @@ -38,8 +38,8 @@ /// A linked list for each binary size exponent static buddy_t* buddy_lists[BUDDY_LISTS] = { [0 ... BUDDY_LISTS-1] = NULL }; -/// Lock for the buddy lists -static spinlock_irqsave_t buddy_lock = SPINLOCK_IRQSAVE_INIT; + +extern spinlock_irqsave_t hermit_mm_lock; /** @brief Check if larger free buddies are available */ static inline int buddy_large_avail(uint8_t exp) @@ -67,7 +67,7 @@ static inline int buddy_exp(size_t sz) /** @brief Get a free buddy by potentially splitting a larger one */ static buddy_t* buddy_get(int exp) { - spinlock_irqsave_lock(&buddy_lock); + spinlock_irqsave_lock(&hermit_mm_lock); buddy_t** list = &buddy_lists[exp-BUDDY_MIN]; buddy_t* buddy = *list; buddy_t* split; @@ -93,7 +93,7 @@ static buddy_t* buddy_get(int exp) } out: - spinlock_irqsave_unlock(&buddy_lock); + spinlock_irqsave_unlock(&hermit_mm_lock); return buddy; } @@ -104,11 +104,11 @@ out: */ static void buddy_put(buddy_t* buddy) { - spinlock_irqsave_lock(&buddy_lock); + spinlock_irqsave_lock(&hermit_mm_lock); buddy_t** list = &buddy_lists[buddy->prefix.exponent-BUDDY_MIN]; buddy->next = *list; *list = buddy; - spinlock_irqsave_unlock(&buddy_lock); + spinlock_irqsave_unlock(&hermit_mm_lock); } void buddy_dump(void) diff --git a/mm/vma.c b/mm/vma.c index c89b5a3c4..4c99cec1d 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -47,7 +47,7 @@ extern const void kernel_start; */ static vma_t vma_boot = { VMA_MIN, VMA_MIN, VMA_HEAP }; static vma_t* vma_list = &vma_boot; -static spinlock_irqsave_t vma_lock = SPINLOCK_IRQSAVE_INIT; +spinlock_irqsave_t hermit_mm_lock = SPINLOCK_IRQSAVE_INIT; int vma_init(void) { @@ -79,7 +79,7 @@ out: size_t vma_alloc(size_t size, uint32_t flags) { - spinlock_irqsave_t* lock = &vma_lock; + spinlock_irqsave_t* lock = &hermit_mm_lock; vma_t** list = &vma_list; LOG_DEBUG("vma_alloc: size = %#lx, flags = %#x\n", size, flags); @@ -144,7 +144,7 @@ found: int vma_free(size_t start, size_t end) { - spinlock_irqsave_t* lock = &vma_lock; + spinlock_irqsave_t* lock = &hermit_mm_lock; vma_t* vma; vma_t** list = &vma_list; @@ -206,7 +206,7 @@ int vma_free(size_t start, size_t end) int vma_add(size_t start, size_t end, uint32_t flags) { - spinlock_irqsave_t* lock = &vma_lock; + spinlock_irqsave_t* lock = &hermit_mm_lock; vma_t** list = &vma_list; int ret = 0; @@ -280,7 +280,7 @@ void vma_dump(void) } LOG_INFO("VMAs:\n"); - spinlock_irqsave_lock(&vma_lock); + spinlock_irqsave_lock(&hermit_mm_lock); print_vma(&vma_boot); - spinlock_irqsave_unlock(&vma_lock); + spinlock_irqsave_unlock(&hermit_mm_lock); }