Hi Jiang,
https://patchwork.kernel.org/patch/1781291/
You said that the bootmem allocator doesn't touch *highmem pages*,
so highmem zones' managed_pages is set to the accurate value
"spanned_pages - absent_pages" in function free_area_init_core() and
won't be updated anymore. Why it doesn't touch *highmem pages*?
Could you point out where you figure out this?