vmmcache: make dirty page list FIFO

This commit is contained in:
Matheus
2024-09-11 19:45:35 -03:00
parent e8d28adabe
commit 84ce545cf6
+13 -6
View File
@@ -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);
} }