[Barrelfish-users] A Bug of ram_alloc_remote -- Affinity Issues
Shi Jinghao
jhshi at cs.hku.hk
Wed Aug 1 14:32:31 CEST 2012
In ram_alloc_remote, there is a hack that before we obtain the
ram_alloc_lock and do the actual transport, we first check if cs->space ==
1: if yes, we do a pair of dummy slot_alloc and slot_free to help the
slot_allocator grow itself. But since slot_alloc may involve another
ram_alloc call, we need to reset the affinity to the default (0, 0) before
slot_alloc and restore the affinity after slot_free.
I found this bug when I repeatly do: set affinity to
(0x80000000-0xc0000000) (shared memory on SCC), allocate a 4K frame use
frame_alloc, set the affinity back to (0, 0). After a certain number of
iterations, all the slot in slot_allocator are consumed and trigger the
dummy slot_alloc/slot_free operation. Then the slot_alloc failed since at
the moment, the affinity is not the default (0, 0) but
(0x80000000,0xc0000000). So the new frame is allocated on a non-expected
physical memory region and somehow a page fault is triggered, which cause
the system to crash.
Here is the fix patch, FYI.
diff -r ba0440b6d59d lib/barrelfish/ram_alloc.c
--- a/lib/barrelfish/ram_alloc.c Wed Aug 01 20:17:53 2012 +0800
+++ b/lib/barrelfish/ram_alloc.c Wed Aug 01 20:18:31 2012 +0800
@@ -35,6 +35,7 @@
struct slot_alloc_state *sas = get_slot_alloc_state();
struct slot_allocator *ca = (struct slot_allocator*)(&sas->defca);
if (ca->space == 1) {
+ ram_set_affinity(0, 0);
struct capref cap;
err = slot_alloc(&cap);
if (err_is_fail(err)) {
@@ -44,6 +45,7 @@
if (err_is_fail(err)) {
return err_push(err, LIB_ERR_SLOT_FREE);
}
+ ram_set_affinity(minbase, maxlimit);
}
assert(ret != NULL);
Thanks,
Jinghao
-------------- next part --------------
An HTML attachment was scrubbed...
URL: https://lists.inf.ethz.ch/pipermail/barrelfish-users/attachments/20120801/3c5e0386/attachment.html
More information about the Barrelfish-users
mailing list