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:
parent
df4f685b6c
commit
d31ba3c3ac
2 changed files with 20 additions and 20 deletions
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue