Hmmm. I _think_ you're just trying to do some things at runtime that I
didn't intend. In the patch I pointed to in the last mail, look at what
I did in hot_add_zone_init(). It does some of what
free_area_init_core() does, but only the most minimal bits. Basically:
zone_wait_table_init(zone, size_pages);
init_currently_empty_zone(zone, phys_start_pfn, size_pages);
zone_pcp_init(zone);
Your way may also be valid, but I broke out init_currently_empty_zone()
for a reason, and I think this was it. I don't think we want to be
calling free_area_init_core() itself at runtime.