On Mon 15-10-18 13:27:09, Alexander Duyck wrote:If I recall most of the gains are due to better cache locality. Instead of running through all of memory once for init, and once for freeing this patch has us doing it in MAX_ORDER_NR_PAGES sized chunks. So the advantage is that we can keep most of the pages structs in the L2 cache at least on x86 processors to avoid having to go to memory as much.
This patch introduces a new iterator for_each_free_mem_pfn_range_in_zone.
This iterator will take care of making sure a given memory range provided
is in fact contained within a zone. It takes are of all the bounds checking
we were doing in deferred_grow_zone, and deferred_init_memmap. In addition
it should help to speed up the search a bit by iterating until the end of a
range is greater than the start of the zone pfn range, and will exit
completely if the start is beyond the end of the zone.
This patch adds yet another iterator called
for_each_free_mem_range_in_zone_from and then uses it to support
initializing and freeing pages in groups no larger than MAX_ORDER_NR_PAGES.
By doing this we can greatly improve the cache locality of the pages while
we do several loops over them in the init and freeing process.
We are able to tighten the loops as a result since we only really need the
checks for first_init_pfn in our first iteration and after that we can
assume that all future values will be greater than this. So I have added a
function called deferred_init_mem_pfn_range_in_zone that primes the
iterators and if it fails we can just exit.
Besides that, this adds a lot of code and I am not convinced the result
is so much better to justify that.