kernel: spinlocks

This commit is contained in:
Matheus
2023-04-23 17:12:05 -03:00
parent f16091656a
commit 0394165361
8 changed files with 59 additions and 30 deletions
+9 -5
View File
@@ -3,12 +3,14 @@
#include <logging.h>
#include <string.h>
#include <arch/mmu.h>
#include <spinlock.h>
uintptr_t hhdmbase;
static size_t memorysize;
static size_t physicalpagecount;
typedef struct {
spinlock_t lock;
uintmax_t base;
uintmax_t top;
uintmax_t searchstart;
@@ -75,11 +77,12 @@ static inline void initsection(int section, uintmax_t base, uintmax_t top) {
.top = top,
.searchstart = base
};
SPINLOCK_INIT(bmsections[section].lock);
}
void *pmm_alloc(size_t size, int section) {
for (int i = section; i >= 0; --i) {
// TODO lock section
spinlock_acquire(&bmsections[i].lock);
uintmax_t page = getfreearea(&bmsections[i], size);
if (page) {
@@ -88,10 +91,11 @@ void *pmm_alloc(size_t size, int section) {
for (size_t j = 0; j < size; ++j)
bmset((void *)((page + j) * PAGE_SIZE), 0);
// TODO unlock
spinlock_release(&bmsections[i].lock);
return (void *)(page * PAGE_SIZE);
}
// TODO unlock section
spinlock_release(&bmsections[i].lock);
}
return NULL;
}
@@ -101,7 +105,7 @@ void pmm_free(void *addr, size_t size) {
for (int i = 0; i < PMM_SECTION_COUNT; ++i) {
if (page >= bmsections[i].base && page < bmsections[i].top) {
// TODO lock
spinlock_acquire(&bmsections[i].lock);
if ((uintptr_t)addr / PAGE_SIZE < bmsections[i].searchstart)
bmsections[i].searchstart = (uintptr_t)addr / PAGE_SIZE;
@@ -109,7 +113,7 @@ void pmm_free(void *addr, size_t size) {
for (uintmax_t j = 0; j < size; ++j)
bmset((void *)((page + j) * PAGE_SIZE), 1);
// TODO unlock
spinlock_release(&bmsections[i].lock);
return;
}
}
+6 -8
View File
@@ -125,7 +125,7 @@ static slab_t *returnobject(scache_t *cache, void *obj) {
}
void *slab_allocate(scache_t *cache) {
// TODO lock
spinlock_acquire(&cache->lock);
slab_t *slab = NULL;
if (cache->partial != NULL)
slab = cache->partial;
@@ -170,12 +170,12 @@ void *slab_allocate(scache_t *cache) {
}
cleanup:
// TODO unlock
spinlock_release(&cache->lock);
return ret;
}
void slab_free(scache_t *cache, void *addr) {
// TODO lock
spinlock_acquire(&cache->lock);
slab_t *slab = returnobject(cache, addr);
__assert(slab);
@@ -205,8 +205,7 @@ void slab_free(scache_t *cache, void *addr) {
slab->prev = NULL;
cache->partial = slab;
}
// TODO unlock
spinlock_release(&cache->lock);
}
scache_t *slab_newcache(size_t size, size_t alignment, void (*ctor)(scache_t *, void *), void (*dtor)(scache_t *, void *)) {
@@ -227,6 +226,7 @@ scache_t *slab_newcache(size_t size, size_t alignment, void (*ctor)(scache_t *,
cache->full = NULL;
cache->empty = NULL;
cache->partial = NULL;
SPINLOCK_INIT(cache->lock);
printf("slab: new cache: size %lu align %lu truesize %lu objcount %lu\n", cache->size, cache->alignment, cache->truesize, cache->slabobjcount);
@@ -256,13 +256,11 @@ static size_t purge(scache_t *cache, size_t maxcount){
}
void slab_freecache(scache_t *cache) {
// TODO lock
spinlock_acquire(&cache->lock);
__assert(cache->partial == NULL);
__assert(cache->full == NULL);
purge(cache, (size_t)-1);
slab_free(&selfcache, cache);
// TODO unlock
}
+10 -11
View File
@@ -9,7 +9,6 @@
#define RANGE_TOP(x) (void *)((uintptr_t)x->start + x->size)
static vmmcache_t *newcache() {
// TODO initialize lock
vmmcache_t *ptr = pmm_alloc(1, PMM_SECTION_DEFAULT);
if (ptr == NULL)
return NULL;
@@ -17,6 +16,7 @@ static vmmcache_t *newcache() {
ptr->header.freecount = VMM_RANGES_PER_CACHE;
ptr->header.firstfree = 0;
ptr->header.next = NULL;
SPINLOCK_INIT(ptr->header.lock);
for (uintmax_t i = 0; i < VMM_RANGES_PER_CACHE; ++i) {
ptr->ranges[i].size = 0;
@@ -42,23 +42,22 @@ static vmmrange_t *allocrange() {
vmmcache_t *cache = cachelist;
vmmrange_t *range = NULL;
while (cache) {
// TODO lock
spinlock_acquire(&cache->header.lock);
if (cache->header.freecount > 0) {
--cache->header.freecount;
uintmax_t r = getentrynumber(cache);
cache->header.firstfree = r + 1;
range = &cache->ranges[r];
range->size = -1; // set as allocated temporarily
spinlock_release(&cache->header.lock);
break;
} else if (cache->header.next == NULL)
cache->header.next = newcache();
cache = cache->header.next;
// TODO unlock
spinlock_release(&cache->header.lock);
}
// TODO unlock cache
return range;
}
@@ -233,7 +232,7 @@ bool vmm_pagefault(void *addr, bool user, int actions) {
if (space == NULL || (space == &kernelspace && user))
return false;
// TODO lock
spinlock_acquire(&space->lock);
vmmrange_t *range = getrange(space, addr);
bool status = false;
@@ -267,7 +266,7 @@ bool vmm_pagefault(void *addr, bool user, int actions) {
status = true;
cleanup:
// TODO unlock
spinlock_release(&space->lock);
return status;
}
@@ -288,7 +287,7 @@ void *vmm_map(void *addr, volatile size_t size, int flags, mmuflags_t mmuflags,
if (space == NULL)
return NULL;
// TODO lock space
spinlock_acquire(&space->lock);
void *start = getfreerange(space, addr, size);
void *retaddr = NULL;
@@ -345,7 +344,7 @@ void *vmm_map(void *addr, volatile size_t size, int flags, mmuflags_t mmuflags,
if (start == NULL && range) {
// TODO free range
}
// TODO unlock
spinlock_release(&space->lock);
return retaddr;
}
@@ -363,11 +362,11 @@ void vmm_unmap(void *addr, size_t size, int flags) {
if (space == NULL)
return;
// TODO lock space
spinlock_acquire(&space->lock);
unmap(space, addr, size);
// TODO unlock space
spinlock_release(&space->lock);
}
vmmcontext_t *vmm_newcontext() {