1
0
Fork 0
mirror of https://github.com/hermitcore/libhermit.git synced 2025-03-09 00:00:03 +01:00

mm: make malloc and vma locks irqsave

This commit is contained in:
daniel-k 2016-08-31 13:28:22 +02:00
parent df4f685b6c
commit d31ba3c3ac
2 changed files with 20 additions and 20 deletions

View file

@ -38,7 +38,7 @@
/// 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_t buddy_lock = SPINLOCK_INIT;
static spinlock_irqsave_t buddy_lock = SPINLOCK_IRQSAVE_INIT;
/** @brief Check if larger free buddies are available */
static inline int buddy_large_avail(uint8_t exp)
@ -66,7 +66,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_lock(&buddy_lock);
spinlock_irqsave_lock(&buddy_lock);
buddy_t** list = &buddy_lists[exp-BUDDY_MIN];
buddy_t* buddy = *list;
buddy_t* split;
@ -92,7 +92,7 @@ static buddy_t* buddy_get(int exp)
}
out:
spinlock_unlock(&buddy_lock);
spinlock_irqsave_unlock(&buddy_lock);
return buddy;
}
@ -103,11 +103,11 @@ out:
*/
static void buddy_put(buddy_t* buddy)
{
spinlock_lock(&buddy_lock);
spinlock_irqsave_lock(&buddy_lock);
buddy_t** list = &buddy_lists[buddy->prefix.exponent-BUDDY_MIN];
buddy->next = *list;
*list = buddy;
spinlock_unlock(&buddy_lock);
spinlock_irqsave_unlock(&buddy_lock);
}
void buddy_dump(void)

View file

@ -48,7 +48,7 @@ extern const void kernel_end;
*/
static vma_t vma_boot = { VMA_MIN, VMA_MIN, VMA_HEAP };
static vma_t* vma_list = &vma_boot;
static spinlock_t vma_lock = SPINLOCK_INIT;
static spinlock_irqsave_t vma_lock = SPINLOCK_IRQSAVE_INIT;
// TODO: we might move the architecture specific VMA regions to a
// seperate function arch_vma_init()
@ -86,7 +86,7 @@ out:
size_t vma_alloc(size_t size, uint32_t flags)
{
spinlock_t* lock = &vma_lock;
spinlock_irqsave_t* lock = &vma_lock;
vma_t** list = &vma_list;
//kprintf("vma_alloc: size = %#lx, flags = %#x\n", size, flags);
@ -98,7 +98,7 @@ size_t vma_alloc(size_t size, uint32_t flags)
size_t base = VMA_MIN;
size_t limit = VMA_MAX;
spinlock_lock(lock);
spinlock_irqsave_lock(lock);
// first fit search for free memory area
vma_t* pred = NULL; // vma before current gap
@ -115,7 +115,7 @@ size_t vma_alloc(size_t size, uint32_t flags)
} while (pred || succ);
fail:
spinlock_unlock(lock); // we were unlucky to find a free gap
spinlock_irqsave_unlock(lock); // we were unlucky to find a free gap
return 0;
@ -143,14 +143,14 @@ found:
*list = new;
}
spinlock_unlock(lock);
spinlock_irqsave_unlock(lock);
return start;
}
int vma_free(size_t start, size_t end)
{
spinlock_t* lock = &vma_lock;
spinlock_irqsave_t* lock = &vma_lock;
vma_t* vma;
vma_t** list = &vma_list;
@ -159,7 +159,7 @@ int vma_free(size_t start, size_t end)
if (BUILTIN_EXPECT(start >= end, 0))
return -EINVAL;
spinlock_lock(lock);
spinlock_irqsave_lock(lock);
// search vma
vma = *list;
@ -169,7 +169,7 @@ int vma_free(size_t start, size_t end)
}
if (BUILTIN_EXPECT(!vma, 0)) {
spinlock_unlock(lock);
spinlock_irqsave_unlock(lock);
return -EINVAL;
}
@ -190,7 +190,7 @@ int vma_free(size_t start, size_t end)
else {
vma_t* new = kmalloc(sizeof(vma_t));
if (BUILTIN_EXPECT(!new, 0)) {
spinlock_unlock(lock);
spinlock_irqsave_unlock(lock);
return -ENOMEM;
}
@ -205,14 +205,14 @@ int vma_free(size_t start, size_t end)
new->prev = vma;
}
spinlock_unlock(lock);
spinlock_irqsave_unlock(lock);
return 0;
}
int vma_add(size_t start, size_t end, uint32_t flags)
{
spinlock_t* lock = &vma_lock;
spinlock_irqsave_t* lock = &vma_lock;
vma_t** list = &vma_list;
int ret = 0;
@ -221,7 +221,7 @@ int vma_add(size_t start, size_t end, uint32_t flags)
//kprintf("vma_add: start = %#lx, end = %#lx, flags = %#x\n", start, end, flags);
spinlock_lock(lock);
spinlock_irqsave_lock(lock);
// search gap
vma_t* pred = NULL;
@ -267,7 +267,7 @@ int vma_add(size_t start, size_t end, uint32_t flags)
}
fail:
spinlock_unlock(lock);
spinlock_irqsave_unlock(lock);
return ret;
}
@ -286,7 +286,7 @@ void vma_dump(void)
}
kputs("VMAs:\n");
spinlock_lock(&vma_lock);
spinlock_irqsave_lock(&vma_lock);
print_vma(&vma_boot);
spinlock_unlock(&vma_lock);
spinlock_irqsave_unlock(&vma_lock);
}