stos: mm: Add locking to VAD lists
Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -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
@@ -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");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user