From 16a229c9360e205a70f5ceef148cf65d15d77363 Mon Sep 17 00:00:00 2001 From: fef Date: Sat, 23 Oct 2021 02:50:04 +0200 Subject: [PATCH] mm: protect cache pools with mutex --- include/gay/mutex.h | 10 +++++----- kernel/mm/page.c | 18 +++++++++++++++++- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/include/gay/mutex.h b/include/gay/mutex.h index 1a3e383..8ccabde 100644 --- a/include/gay/mutex.h +++ b/include/gay/mutex.h @@ -11,10 +11,12 @@ typedef struct { atom_t lock; } spin_t; -#define SPIN(name) struct spin name = { \ +#define SPIN_DEFINE { \ .lock = ATOM_DEFINE(0), \ } +#define SPIN(name) struct spin name = SPIN_DEFINE + void spin_init(spin_t *spin); void spin_lock(spin_t *spin); int spin_trylock(spin_t *spin); @@ -33,10 +35,8 @@ struct mtx { #define MTX_DEFINE(name) { \ .lock = ATOM_DEFINE(0), \ - .wait_queue_lock = { \ - .lock = ATOM_DEFINE(0) \ - }, \ - .wait_queue = CLIST_DEFINE(&(name).wait_queue), \ + .wait_queue_lock = SPIN_DEFINE, \ + .wait_queue = CLIST_DEFINE((name).wait_queue), \ } #define MTX(name) struct mtx name = MTX_DEFINE(name) diff --git a/kernel/mm/page.c b/kernel/mm/page.c index 8d18e43..e83190b 100644 --- a/kernel/mm/page.c +++ b/kernel/mm/page.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -62,6 +63,7 @@ struct cache_pool { usize free_entries; }; static struct cache_pool caches[CACHE_LEVELS]; +MTX(caches_lock); #define LONG_BIT_MASK (~(LONG_BIT - 1)) @@ -220,6 +222,12 @@ void *get_pages(usize count, enum mm_flags flags) return nil; } + if (flags & MM_NOSLEEP) { + kprintf("get_pages(): MM_NOSLEEP requested, this is not implemented yet :(\n"); + return nil; + } + mtx_lock(&caches_lock); + struct clist *entry; int entry_level; for (entry_level = level; entry_level < CACHE_LEVELS; entry_level++) { @@ -228,8 +236,10 @@ void *get_pages(usize count, enum mm_flags flags) break; } } - if (entry_level == CACHE_LEVELS) + if (entry_level == CACHE_LEVELS) { + mtx_unlock(&caches_lock); return nil; + } clist_del(entry); caches[entry_level].free_entries--; @@ -243,6 +253,7 @@ void *get_pages(usize count, enum mm_flags flags) } bit_set(caches[level].bitmap, bit_number); + mtx_unlock(&caches_lock); return (void *)entry; } @@ -254,11 +265,14 @@ void free_pages(void *ptr, usize count) return; } + mtx_lock(&caches_lock); + usize bit_number = get_bit_number(ptr, level); # if CFG_DEBUG_PAGE_ALLOCS if (!bit_tst(caches[level].bitmap, bit_number)) { kprintf("free_pages(%p, %zu): double free!\n", ptr, count); + mtx_unlock(&caches_lock); return; } # endif @@ -273,6 +287,8 @@ void free_pages(void *ptr, usize count) level++; bit_number >>= 1; } + + mtx_unlock(&caches_lock); } static inline usize get_bit_number(void *ptr, int level)