diff --git a/paw/stos/head/mm/vad.h b/paw/stos/head/mm/vad.h index 24853e0..621f21d 100644 --- a/paw/stos/head/mm/vad.h +++ b/paw/stos/head/mm/vad.h @@ -10,6 +10,7 @@ #define _MM_VAD_H_ 1 #include +#include #define VAD_FROM_VMA(VMA) \ ((MM_VAD *)(VMA)) @@ -31,10 +32,12 @@ typedef struct _MM_VAD { * * @First: First entry in VAD list * @Last: Last entry in VAD list + * @Lock: Lock protecting this VAD list */ typedef struct { MM_VAD *First; MM_VAD *Last; + SPINLOCK Lock; } MM_VAD_LIST; /* diff --git a/paw/stos/mm/vad.c b/paw/stos/mm/vad.c index c41bdfc..2034cc0 100644 --- a/paw/stos/mm/vad.c +++ b/paw/stos/mm/vad.c @@ -19,6 +19,7 @@ MmVadListAppend(MM_VAD_LIST *List, MM_VAD *Vad) Vad->Next = NULL; Vad->Prev = NULL; + KeSpinLockAcquire(&List->Lock, true); if (List->Last == NULL || List->First == NULL) { List->Last = Vad; @@ -29,6 +30,8 @@ MmVadListAppend(MM_VAD_LIST *List, MM_VAD *Vad) Last->Next = Vad; List->Last = Vad; } + + KeSpinLockRelease(&List->Lock); } MM_VAD * @@ -44,11 +47,13 @@ MmVadListPop(MM_VAD_LIST *List) return NULL; } + KeSpinLockAcquire(&List->Lock, true); Last = List->Last; if (Last->Prev != NULL) { Last->Prev->Next = NULL; } List->Last = Last->Prev; + KeSpinLockRelease(&List->Lock); return Last; } diff --git a/paw/stos/mm/vmm.c b/paw/stos/mm/vmm.c index e09b293..2b9c401 100644 --- a/paw/stos/mm/vmm.c +++ b/paw/stos/mm/vmm.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -26,10 +27,8 @@ static MMU_VAS KernelVas; static MM_VAD_LIST VadList; static UPTR BumpPtr; +static SPINLOCK VadListLock; -/* - * TODO: Add some locking around this - */ static ST_STATUS MmGrabPages(VOID) { @@ -42,6 +41,7 @@ MmGrabPages(VOID) MaxOff = PAGES_PER_GRAB * PAGESIZE; HalMmuReadVas(&Vas); + KeSpinLockAcquire(&VadListLock, true); for (USIZE Off = 0; Off < MaxOff; Off += PAGESIZE) { /* Don't blast past the limit */ if ((BumpPtr + Off) >= VALLOC_MAX) { @@ -51,6 +51,7 @@ MmGrabPages(VOID) AllocBase = BumpPtr + Off; AllocPfn = MmRequestFrame(); if (AllocPfn == 0) { + KeSpinLockRelease(&VadListLock); return STATUS_NO_MEMORY; } @@ -63,6 +64,7 @@ MmGrabPages(VOID) ); if (Status != STATUS_SUCCESS) { + KeSpinLockRelease(&VadListLock); return Status; } @@ -70,12 +72,10 @@ MmGrabPages(VOID) } BumpPtr = AllocBase; + KeSpinLockRelease(&VadListLock); return STATUS_SUCCESS; } -/* - * TODO: Consider locking - */ VOID * MmAllocPages(USIZE Count) { @@ -135,5 +135,8 @@ MmInitVmm(VOID) HalMmuWriteVas(&KernelVas); DTRACE("ah!~... [ok @ %p]\n", VAS_BASE(&KernelVas)); + BumpPtr = VALLOC_BASE; + KeSpinLockInit(&VadListLock, "vmm-vad"); + KeSpinLockInit(&VadList.Lock, "vmm-vadlist"); }