1
0
Fork 0
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:
Stefan Lankes 2017-09-23 23:27:12 +02:00
parent 638923afbf
commit c3dfbfb39a
2 changed files with 12 additions and 12 deletions

View file

@ -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)

View file

@ -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);
}