From ed866b05a9dac8e839fadf6cd6d8957fee5f4e2c Mon Sep 17 00:00:00 2001 From: Matheus Date: Wed, 27 Jul 2022 20:44:34 -0300 Subject: [PATCH] vmm_cacheheader firstfree keep track of the first free entry of each cache to make searching quicker --- src/include/kernel/vmm.h | 1 + src/sys/mm/vmm.c | 18 +++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/include/kernel/vmm.h b/src/include/kernel/vmm.h index ba0a11ab..9bf97710 100644 --- a/src/include/kernel/vmm.h +++ b/src/include/kernel/vmm.h @@ -16,6 +16,7 @@ struct vmm_cacheheader; typedef struct{ int lock; + size_t firstfree; struct vmm_cacheheader* next; size_t freecount; } vmm_cacheheader; diff --git a/src/sys/mm/vmm.c b/src/sys/mm/vmm.c index d123d694..61240135 100644 --- a/src/sys/mm/vmm.c +++ b/src/sys/mm/vmm.c @@ -32,7 +32,10 @@ static void freeentry(vmm_mapping* entry){ ++entry->cache->freecount; memset(entry, 0, sizeof(vmm_mapping)); - // TODO set first free + size_t n = ((size_t)entry - (size_t)cache + sizeof(vmm_cacheheader)) / sizeof(vmm_mapping); + + if(n < cache->firstfree) + cache->firstfree = n; spinlock_release(&cache->lock); } @@ -47,22 +50,19 @@ static vmm_mapping* allocentry(vmm_cache* cache){ spinlock_release(&cache->header.lock); return NULL; } - - // TODO keep first free in cache header - for(size_t i = 0; i < VMM_CACHE_ENTRY_COUNT; ++i){ + for(size_t i = cache->header.firstfree; i < VMM_CACHE_ENTRY_COUNT; ++i){ if(!cache->mappings[i].cache){ found = &cache->mappings[i]; - goto _found; + found->cache = cache; + cache->header.firstfree = i; + goto done; } } - _found: + done: --cache->header.freecount; - if(found) - found->cache = &cache->header; - spinlock_release(&cache->header.lock); return found;