mirror of
https://github.com/hermitcore/libhermit.git
synced 2025-03-09 00:00:03 +01:00
use one lock for the memory management to avoid deadlocks
This commit is contained in:
parent
638923afbf
commit
c3dfbfb39a
2 changed files with 12 additions and 12 deletions
12
mm/malloc.c
12
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)
|
||||
|
|
12
mm/vma.c
12
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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue