From: Nikodemus S. <nik...@ra...> - 2010-03-27 16:03:53
Attachments:
0001-robuster-page-table-pickup.patch
|
Those of you who frequent #lisp may be aware that Attila has been experiencing repeatable crashes into LDB from starting up a fat core (gc invariant lost.) Attached patch is my analysis and fix of the issue -- but I would appreciate sanity checking it. I'm sitting on the fence on committing this during the freeze or no. On one hand, it's simple and IMO obviously harmless -- even if my diagnosis of the issue was wrong and the patch just fixes it by accident, I'm reasonably confident that it doesn't introduce new problems. On the other hand... well, GC related code and tail-end of the freeze. Commit message from the patch below for convenience: " The Problem: It is rare, but apparently possible, for there to be free pages in the middle of allocated pages even after the double-collection we do in gc_and_save(). Previously this was not an issue, since the static space pickup mechanism just ended up marking those pages as boxed and full -- so we could get a page or few of (0 . 0) in the static generation. No biggie. Now, however, we save page table information into the core (for normal, not cold cores). This means that a would get a page marked as free, but since it was below alloc_ptr gencgc_pickup_dynamic() would mark it having bytes_used=PAGE_BYTES, etc. ...and later, find_freeish_pages() would look at the page and cry out in existential anguish becaue it should be free but didn't have bytes_used==0. Oh Noes! The Fix: gencgc_pickup_dynamic() needs to be careful about pages marked free if partial pickup has already been done from the core. " Cheers, -- Nikodemus |
From: Christophe R. <cs...@ca...> - 2010-03-27 16:30:21
|
Nikodemus Siivola <nik...@ra...> writes: > Attached patch is my analysis and fix of the issue -- but I would > appreciate sanity checking it. I'm sitting on the fence on committing > this during the freeze or no. Strong vote for "no", please. Best, Christophe |