1.0.37.4: robuster page table pickup
authorNikodemus Siivola <nikodemus@random-state.net>
Sun, 28 Mar 2010 10:51:51 +0000 (10:51 +0000)
committerNikodemus Siivola <nikodemus@random-state.net>
Sun, 28 Mar 2010 10:51:51 +0000 (10:51 +0000)
commitae7270bf456d2b46d46d104baba1cd3ad7a3962b
tree3f2931caf928e8ae4d30beb4e31c2cce0e268127
parentb5368af8c66b7bc92af74a884a31eabb2b1e7e16
1.0.37.4: robuster page table pickup

 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.
NEWS
src/runtime/gencgc.c
version.lisp-expr