fix buflen when calling single_slot_alloc_raw()
authorKornilios Kourtis <kkourt@inf.ethz.ch>
Tue, 2 Apr 2013 12:40:51 +0000 (14:40 +0200)
committerKornilios Kourtis <kkourt@inf.ethz.ch>
Mon, 22 Apr 2013 15:31:50 +0000 (17:31 +0200)
commit428ac6fdb4b5270b9cd1ef312e82817beb2759b6
tree1f512fc975491b4baa5672de3083f8e3a54a9b71
parent7cf537aa62fa6600ae0306dc400f024be0a728fa
fix buflen when calling single_slot_alloc_raw()

Here's my understanding (this is from reading the code):
 - single_slot_alloc manages slots for a single cnode  using a list of
   free nodes. The list is maintained starting with ->head, and each node
   represents a range of slots (slot, space).  The list is initialized
   with a single node with {slot=0, space=nslots}

 - The worst case scenario for the size of the list is when only the odd
   (or even) slots are free. This is the worst case because for all nodes
   in the list space=1. Adding nodes should result in smaller number of
   nodes but with higher ->space values.

 - The list nodes are allocated/freed using a (simple) slab allocator.
   Hence, the slab allocator should be initialized so that it contains
   nslots/2 objects to accommodate for the worst case.

The problem is that this does not happen: the slab allocator requires some
additional memory for adding headers to objects which is not accounted for.
This is why in your case the allocator does not have additional objects to
provide in slab_alloc().

This commit allocates appropriately sized buffers for the slab allocator and
hopefully fixes your problem.

Many thanks to Georgios Varisteas <yorgos@kth.se> for reporting the bug and
help us debug the problem.
include/barrelfish/core_state.h
include/barrelfish/slot_alloc.h
lib/barrelfish/slot_alloc/multi_slot_alloc.c
lib/barrelfish/slot_alloc/single_slot_alloc.c
lib/barrelfish/slot_alloc/slot_alloc.c
lib/spawndomain/spawn.c