stos: mm: Add locking to VAD lists

Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
Chloe M.
2026-06-23 22:27:05 +00:00
parent b5c2ba80f7
commit 7ce1cf27d1
3 changed files with 17 additions and 6 deletions
+3
View File
@@ -10,6 +10,7 @@
#define _MM_VAD_H_ 1 #define _MM_VAD_H_ 1
#include <stdef.h> #include <stdef.h>
#include <ke/spinlock.h>
#define VAD_FROM_VMA(VMA) \ #define VAD_FROM_VMA(VMA) \
((MM_VAD *)(VMA)) ((MM_VAD *)(VMA))
@@ -31,10 +32,12 @@ typedef struct _MM_VAD {
* *
* @First: First entry in VAD list * @First: First entry in VAD list
* @Last: Last entry in VAD list * @Last: Last entry in VAD list
* @Lock: Lock protecting this VAD list
*/ */
typedef struct { typedef struct {
MM_VAD *First; MM_VAD *First;
MM_VAD *Last; MM_VAD *Last;
SPINLOCK Lock;
} MM_VAD_LIST; } MM_VAD_LIST;
/* /*
+5
View File
@@ -19,6 +19,7 @@ MmVadListAppend(MM_VAD_LIST *List, MM_VAD *Vad)
Vad->Next = NULL; Vad->Next = NULL;
Vad->Prev = NULL; Vad->Prev = NULL;
KeSpinLockAcquire(&List->Lock, true);
if (List->Last == NULL || List->First == NULL) { if (List->Last == NULL || List->First == NULL) {
List->Last = Vad; List->Last = Vad;
@@ -29,6 +30,8 @@ MmVadListAppend(MM_VAD_LIST *List, MM_VAD *Vad)
Last->Next = Vad; Last->Next = Vad;
List->Last = Vad; List->Last = Vad;
} }
KeSpinLockRelease(&List->Lock);
} }
MM_VAD * MM_VAD *
@@ -44,11 +47,13 @@ MmVadListPop(MM_VAD_LIST *List)
return NULL; return NULL;
} }
KeSpinLockAcquire(&List->Lock, true);
Last = List->Last; Last = List->Last;
if (Last->Prev != NULL) { if (Last->Prev != NULL) {
Last->Prev->Next = NULL; Last->Prev->Next = NULL;
} }
List->Last = Last->Prev; List->Last = Last->Prev;
KeSpinLockRelease(&List->Lock);
return Last; return Last;
} }
+9 -6
View File
@@ -13,6 +13,7 @@
#include <hal/page.h> #include <hal/page.h>
#include <ex/trace.h> #include <ex/trace.h>
#include <ke/knot.h> #include <ke/knot.h>
#include <ke/spinlock.h>
#include <stapi/status.h> #include <stapi/status.h>
#include <string.h> #include <string.h>
@@ -26,10 +27,8 @@
static MMU_VAS KernelVas; static MMU_VAS KernelVas;
static MM_VAD_LIST VadList; static MM_VAD_LIST VadList;
static UPTR BumpPtr; static UPTR BumpPtr;
static SPINLOCK VadListLock;
/*
* TODO: Add some locking around this
*/
static ST_STATUS static ST_STATUS
MmGrabPages(VOID) MmGrabPages(VOID)
{ {
@@ -42,6 +41,7 @@ MmGrabPages(VOID)
MaxOff = PAGES_PER_GRAB * PAGESIZE; MaxOff = PAGES_PER_GRAB * PAGESIZE;
HalMmuReadVas(&Vas); HalMmuReadVas(&Vas);
KeSpinLockAcquire(&VadListLock, true);
for (USIZE Off = 0; Off < MaxOff; Off += PAGESIZE) { for (USIZE Off = 0; Off < MaxOff; Off += PAGESIZE) {
/* Don't blast past the limit */ /* Don't blast past the limit */
if ((BumpPtr + Off) >= VALLOC_MAX) { if ((BumpPtr + Off) >= VALLOC_MAX) {
@@ -51,6 +51,7 @@ MmGrabPages(VOID)
AllocBase = BumpPtr + Off; AllocBase = BumpPtr + Off;
AllocPfn = MmRequestFrame(); AllocPfn = MmRequestFrame();
if (AllocPfn == 0) { if (AllocPfn == 0) {
KeSpinLockRelease(&VadListLock);
return STATUS_NO_MEMORY; return STATUS_NO_MEMORY;
} }
@@ -63,6 +64,7 @@ MmGrabPages(VOID)
); );
if (Status != STATUS_SUCCESS) { if (Status != STATUS_SUCCESS) {
KeSpinLockRelease(&VadListLock);
return Status; return Status;
} }
@@ -70,12 +72,10 @@ MmGrabPages(VOID)
} }
BumpPtr = AllocBase; BumpPtr = AllocBase;
KeSpinLockRelease(&VadListLock);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
/*
* TODO: Consider locking
*/
VOID * VOID *
MmAllocPages(USIZE Count) MmAllocPages(USIZE Count)
{ {
@@ -135,5 +135,8 @@ MmInitVmm(VOID)
HalMmuWriteVas(&KernelVas); HalMmuWriteVas(&KernelVas);
DTRACE("ah!~... [ok @ %p]\n", VAS_BASE(&KernelVas)); DTRACE("ah!~... [ok @ %p]\n", VAS_BASE(&KernelVas));
BumpPtr = VALLOC_BASE; BumpPtr = VALLOC_BASE;
KeSpinLockInit(&VadListLock, "vmm-vad");
KeSpinLockInit(&VadList.Lock, "vmm-vadlist");
} }