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
On the other hand... well, GC related code and tail-end of the freeze.
Commit message from the patch below for convenience:
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.
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!
gencgc_pickup_dynamic() needs to be careful about pages marked free
if partial pickup has already been done from the core.
Nikodemus Siivola <nikodemus@...> 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.