mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 23:18:21 +00:00
vmmcache: make dirty page list FIFO
This commit is contained in:
@@ -319,6 +319,7 @@ static int syncpage(page_t *page, bool backinglock) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static page_t *dirtylist;
|
static page_t *dirtylist;
|
||||||
|
static page_t *dirtylistend;
|
||||||
|
|
||||||
// expects vnode to be held
|
// expects vnode to be held
|
||||||
int vmmcache_syncvnode(vnode_t *vnode, uintmax_t offset, size_t size) {
|
int vmmcache_syncvnode(vnode_t *vnode, uintmax_t offset, size_t size) {
|
||||||
@@ -346,6 +347,9 @@ int vmmcache_syncvnode(vnode_t *vnode, uintmax_t offset, size_t size) {
|
|||||||
else
|
else
|
||||||
dirtylist = page->writenext;
|
dirtylist = page->writenext;
|
||||||
|
|
||||||
|
if (dirtylist == NULL)
|
||||||
|
dirtylistend = NULL;
|
||||||
|
|
||||||
page->writenext = vnodedirtylist;
|
page->writenext = vnodedirtylist;
|
||||||
page->writeprev = NULL;
|
page->writeprev = NULL;
|
||||||
vnodedirtylist = page;
|
vnodedirtylist = page;
|
||||||
@@ -406,6 +410,8 @@ int vmmcache_makedirty(page_t *page) {
|
|||||||
page->writenext = dirtylist;
|
page->writenext = dirtylist;
|
||||||
if (dirtylist)
|
if (dirtylist)
|
||||||
dirtylist->writeprev = page;
|
dirtylist->writeprev = page;
|
||||||
|
else
|
||||||
|
dirtylistend = page;
|
||||||
|
|
||||||
dirtylist = page;
|
dirtylist = page;
|
||||||
pmm_hold(pmm_getpageaddress(page));
|
pmm_hold(pmm_getpageaddress(page));
|
||||||
@@ -434,8 +440,7 @@ static void writer() {
|
|||||||
interrupt_set(true);
|
interrupt_set(true);
|
||||||
for (;;) {
|
for (;;) {
|
||||||
HOLD_LOCK();
|
HOLD_LOCK();
|
||||||
// TODO make FIFO rather than LIFO
|
volatile page_t *page = dirtylistend;
|
||||||
volatile page_t *page = dirtylist;
|
|
||||||
if (page == NULL) {
|
if (page == NULL) {
|
||||||
EVENT_SIGNAL(&syncevent);
|
EVENT_SIGNAL(&syncevent);
|
||||||
RELEASE_LOCK();
|
RELEASE_LOCK();
|
||||||
@@ -443,11 +448,13 @@ static void writer() {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
dirtylist = page->writenext;
|
dirtylistend = page->writeprev;
|
||||||
if (dirtylist)
|
if (dirtylistend)
|
||||||
dirtylist->writeprev = NULL;
|
dirtylistend->writenext = NULL;
|
||||||
|
else
|
||||||
|
dirtylist = NULL;
|
||||||
|
|
||||||
page->writenext = NULL;
|
page->writeprev = NULL;
|
||||||
// TODO notify error on vmmcache_syncvnode
|
// TODO notify error on vmmcache_syncvnode
|
||||||
syncpage((page_t *)page, true);
|
syncpage((page_t *)page, true);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user