Followup on r302393 by cperciva. Always calculate amount of pages that
are required to allocate UMA zones, not only if size of a zone is larger
than page size.
- Introduce another stage of UMA startup, which is entered after vm_page_startup() finishes. After this stage we don't yet enable buckets, Keep count not only of zone structures,but we can ask VM for pages. but also of kegs,Rename
slabs and hashestages to meaningful names while here. New list of stages: BOOT_COLD, BOOT_STRAPPED, BOOT_PAGEALLOC, BOOT_BUCKETS, BOOT_RUNNING. Enabling page alloc earlier, allows us to dramatically reduce number of boot page allocation. What is more important it becomes consistent across different machines. Now only UMA internal zones actually need to use startup_alloc().
- Introduce uma_startup_count() function, to avoid code duplication. It calculates sizes of zone zone and keg zone, and calculates how many pages UMA need to bootstrap. AcKeep count for other memory allocations done during bootstrap
of early VMnot only of zone structures, but also of kegs, and document every bit in comments.
slabs and hashes. Remove the hardcoded vm.boot_pages completely.
- Hide uma_startup_foo() declarations from public file.
- Provide several DIAGNOSTIC printfs on boot_pages use.
- Bugfix: when calculating zone of zones size use (mp_maxid + 1) instead of mp_ncpus. Use resulting number not only in the size argument to zone_ctor() but also as args.size.