slab: don't assume allocations succeed A couple places assumed a MEM_ATOMIC allocation would succeed. You can tell they are old places since they still passed '0' for a flag. Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/kern/src/slab.c b/kern/src/slab.c index 602cf2d..3f8934d 100644 --- a/kern/src/slab.c +++ b/kern/src/slab.c
@@ -425,7 +425,7 @@ void (*dtor)(void *, void *), void *priv) { - struct kmem_cache *kc = kmem_cache_alloc(kmem_cache_cache, 0); + struct kmem_cache *kc = kmem_cache_alloc(kmem_cache_cache, MEM_WAIT); __kmem_cache_create(kc, name, obj_size, align, flags, source, ctor, dtor, priv); @@ -837,7 +837,7 @@ void *buf; uintptr_t delta; - a_slab = kmem_cache_alloc(kmem_slab_cache, 0); + a_slab = kmem_cache_alloc(kmem_slab_cache, MEM_ATOMIC); if (!a_slab) return FALSE; buf = arena_alloc(cp->source, cp->import_amt, MEM_ATOMIC); @@ -861,7 +861,18 @@ BSD_LIST_INIT(&a_slab->bufctl_freelist); /* for each buffer, set up a bufctl and point to the buffer */ for (int i = 0; i < a_slab->num_total_obj; i++) { - a_bufctl = kmem_cache_alloc(kmem_bufctl_cache, 0); + a_bufctl = kmem_cache_alloc(kmem_bufctl_cache, + MEM_ATOMIC); + if (!a_bufctl) { + struct kmem_bufctl *i, *temp; + + BSD_LIST_FOREACH_SAFE(i, + &a_slab->bufctl_freelist, + link, temp) { + kmem_cache_free(kmem_bufctl_cache, i); + } + goto err_source_obj; + } BSD_LIST_INSERT_HEAD(&a_slab->bufctl_freelist, a_bufctl, link); a_bufctl->buf_addr = buf;