Implement lock IRQ nesting via stack variables/contexts
All checks were successful
Build documentation / build-and-deploy (push) Successful in 21s
All checks were successful
Build documentation / build-and-deploy (push) Successful in 21s
This commit is contained in:
@@ -100,6 +100,8 @@ static size_t pmm_find_free_space (struct pmm_region* pmm_region, size_t nblks)
|
||||
}
|
||||
|
||||
physaddr_t pmm_alloc (size_t nblks) {
|
||||
spin_lock_ctx_t ctxpmmr;
|
||||
|
||||
for (size_t region = 0; region < PMM_REGIONS_MAX; region++) {
|
||||
struct pmm_region* pmm_region = &pmm.regions[region];
|
||||
|
||||
@@ -107,7 +109,7 @@ physaddr_t pmm_alloc (size_t nblks) {
|
||||
if (!(pmm_region->flags & PMM_REGION_ACTIVE))
|
||||
continue;
|
||||
|
||||
spin_lock (&pmm_region->lock);
|
||||
spin_lock (&pmm_region->lock, &ctxpmmr);
|
||||
|
||||
/* Find starting bit of the free bit range */
|
||||
size_t bit = pmm_find_free_space (pmm_region, nblks);
|
||||
@@ -116,18 +118,19 @@ physaddr_t pmm_alloc (size_t nblks) {
|
||||
if (bit != (size_t)-1) {
|
||||
/* Mark it */
|
||||
bm_set_region (&pmm_region->bm, bit, nblks);
|
||||
spin_unlock (&pmm_region->lock);
|
||||
spin_unlock (&pmm_region->lock, &ctxpmmr);
|
||||
|
||||
return pmm_region->membase + bit * PAGE_SIZE;
|
||||
}
|
||||
|
||||
spin_unlock (&pmm_region->lock);
|
||||
spin_unlock (&pmm_region->lock, &ctxpmmr);
|
||||
}
|
||||
|
||||
return PMM_ALLOC_ERR;
|
||||
}
|
||||
|
||||
void pmm_free (physaddr_t p_addr, size_t nblks) {
|
||||
spin_lock_ctx_t ctxpmmr;
|
||||
/* Round down to nearest page boundary */
|
||||
physaddr_t aligned_p_addr = align_down (p_addr, PAGE_SIZE);
|
||||
|
||||
@@ -145,11 +148,11 @@ void pmm_free (physaddr_t p_addr, size_t nblks) {
|
||||
|
||||
size_t bit = div_align_up (addr, PAGE_SIZE);
|
||||
|
||||
spin_lock (&pmm_region->lock);
|
||||
spin_lock (&pmm_region->lock, &ctxpmmr);
|
||||
|
||||
bm_clear_region (&pmm_region->bm, bit, nblks);
|
||||
|
||||
spin_unlock (&pmm_region->lock);
|
||||
spin_unlock (&pmm_region->lock, &ctxpmmr);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user