mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-31 22:48:21 +00:00
vmm_cacheheader firstfree
keep track of the first free entry of each cache to make searching quicker
This commit is contained in:
@@ -16,6 +16,7 @@ struct vmm_cacheheader;
|
|||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
int lock;
|
int lock;
|
||||||
|
size_t firstfree;
|
||||||
struct vmm_cacheheader* next;
|
struct vmm_cacheheader* next;
|
||||||
size_t freecount;
|
size_t freecount;
|
||||||
} vmm_cacheheader;
|
} vmm_cacheheader;
|
||||||
|
|||||||
+9
-9
@@ -32,7 +32,10 @@ static void freeentry(vmm_mapping* entry){
|
|||||||
++entry->cache->freecount;
|
++entry->cache->freecount;
|
||||||
memset(entry, 0, sizeof(vmm_mapping));
|
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);
|
spinlock_release(&cache->lock);
|
||||||
}
|
}
|
||||||
@@ -48,21 +51,18 @@ static vmm_mapping* allocentry(vmm_cache* cache){
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO keep first free in cache header
|
for(size_t i = cache->header.firstfree; i < VMM_CACHE_ENTRY_COUNT; ++i){
|
||||||
|
|
||||||
for(size_t i = 0; i < VMM_CACHE_ENTRY_COUNT; ++i){
|
|
||||||
if(!cache->mappings[i].cache){
|
if(!cache->mappings[i].cache){
|
||||||
found = &cache->mappings[i];
|
found = &cache->mappings[i];
|
||||||
goto _found;
|
found->cache = cache;
|
||||||
|
cache->header.firstfree = i;
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_found:
|
done:
|
||||||
|
|
||||||
--cache->header.freecount;
|
--cache->header.freecount;
|
||||||
if(found)
|
|
||||||
found->cache = &cache->header;
|
|
||||||
|
|
||||||
spinlock_release(&cache->header.lock);
|
spinlock_release(&cache->header.lock);
|
||||||
|
|
||||||
return found;
|
return found;
|
||||||
|
|||||||
Reference in New Issue
Block a user