From a524d9b48b9412e2c5fe83f1b29f81e365a39874 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sun, 16 Jun 2024 12:02:19 -0300 Subject: [PATCH] pmm: list tails and better standby page handling --- kernel-src/mm/pmm.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/kernel-src/mm/pmm.c b/kernel-src/mm/pmm.c index 5570b442..46c0ade7 100644 --- a/kernel-src/mm/pmm.c +++ b/kernel-src/mm/pmm.c @@ -14,7 +14,9 @@ size_t freepagecount; static mutex_t freelistmutex; static page_t *freelists[PMM_SECTION_COUNT]; +static page_t *freetails[PMM_SECTION_COUNT]; static page_t *standbylists[PMM_SECTION_COUNT]; +static page_t *standbytails[PMM_SECTION_COUNT]; typedef struct { uintmax_t baseid; @@ -51,6 +53,7 @@ static void insertinfreelist(page_t *page) { uintmax_t pageid = PAGE_GETID(page); PAGE_BOUNDARYCHECK(pageid); struct page_t **list; + struct page_t **tail; int section; @@ -62,6 +65,7 @@ static void insertinfreelist(page_t *page) { section = PMM_SECTION_DEFAULT; list = page->backing ? &standbylists[section] : &freelists[section]; + tail = page->backing ? &standbytails[section] : &freetails[section]; if (sections[section].searchstart > pageid) sections[section].searchstart = pageid; @@ -71,6 +75,8 @@ static void insertinfreelist(page_t *page) { *list = page; if (page->freenext) page->freenext->freeprev = page; + else + *tail = page; ++freepagecount; } @@ -79,6 +85,7 @@ static void removefromfreelist(page_t *page) { uintmax_t pageid = PAGE_GETID(page); PAGE_BOUNDARYCHECK(pageid); struct page_t **list; + struct page_t **tail; int section; @@ -90,6 +97,7 @@ static void removefromfreelist(page_t *page) { section = PMM_SECTION_DEFAULT; list = page->backing ? &standbylists[section] : &freelists[section]; + tail = page->backing ? &standbytails[section] : &freetails[section]; if (page->freeprev) page->freeprev->freenext = page->freenext; @@ -98,6 +106,8 @@ static void removefromfreelist(page_t *page) { if (page->freenext) page->freenext->freeprev = page->freeprev; + else + *tail = page->freeprev; --freepagecount; } @@ -165,10 +175,9 @@ void *pmm_allocpage(int section) { bool cachepage = false; // if that wasn't possible, try to take from the cache standby list - // TODO do this FIFO rather than LIFO if (page == NULL) { for (int i = section; i >= 0; --i) { - page = standbylists[i]; + page = standbytails[i]; if (page) { cachepage = true; internalhold(page);