From 00cce59b1ab33028a564e6392d4675183823544c Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 3 Jul 2023 22:44:26 -0300 Subject: [PATCH] slab: fix linked list --- kernel-src/mm/slab.c | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/kernel-src/mm/slab.c b/kernel-src/mm/slab.c index f524a2a2..a3cc3e71 100644 --- a/kernel-src/mm/slab.c +++ b/kernel-src/mm/slab.c @@ -70,6 +70,9 @@ static bool growcache(scache_t *cache) { slab->next = cache->empty; + slab->prev = NULL; + if (slab->next) + slab->next->prev = slab; cache->empty = slab; return true; } @@ -159,25 +162,24 @@ void *slab_allocate(scache_t *cache) { if (slab == cache->empty) { cache->empty = slab->next; - if (slab->prev) - slab->prev->next = slab->next; if (slab->next) - slab->next->prev = slab->prev; + slab->next->prev = NULL; + if (cache->partial) cache->partial->prev = slab; + slab->next = cache->partial; slab->prev = NULL; cache->partial = slab; - } - - if (slab->used == cache->slabobjcount) { + } else if (slab->used == cache->slabobjcount) { cache->partial = slab->next; - if (slab->prev) - slab->prev->next = slab->next; + if (slab->next) - slab->next->prev = slab->prev; + slab->next->prev = NULL; + if (cache->full) cache->full->prev = slab; + slab->next = cache->full; slab->prev = NULL; cache->full = slab; @@ -195,28 +197,34 @@ void slab_free(scache_t *cache, void *addr) { __assert(slab); if (slab->used == 0) { - cache->partial = slab->next; - if (slab->prev) + if (slab->prev == NULL) + cache->partial = slab->next; + else slab->prev->next = slab->next; + if (slab->next) slab->next->prev = slab->prev; - if (cache->empty) - cache->empty->prev = slab; + slab->next = cache->empty; slab->prev = NULL; + if (slab->next) + slab->next->prev = slab; cache->empty = slab; } if (slab->used == cache->slabobjcount - 1) { - cache->full = slab->next; - if (slab->prev) + if (slab->prev == NULL) + cache->full = slab->next; + else slab->prev->next = slab->next; + if (slab->next) slab->next->prev = slab->prev; - if (cache->partial) - cache->partial->prev = slab; + slab->next = cache->partial; slab->prev = NULL; + if (slab->next) + slab->next->prev = slab; cache->partial = slab; } spinlock_release(&cache->lock);