Re: [v6 05/15] mm: don't accessed uninitialized struct pages

Pasha Tatashin
2017-08-14T13:52:36Z

>> mem_init()
>> free_all_bootmem()
>> free_low_memory_core_early()
>> for_each_reserved_mem_region()
>> reserve_bootmem_region()
>> init_reserved_page() <- if this is deferred reserved page
>> __init_single_pfn()
>> __init_single_page()
>>
>> So, currently, we are using the value of page->flags to figure out if this
>> page has been initialized while being part of deferred page, but this is not
>> going to work for this project, as we do not zero the memory that is backing
>> the struct pages, and size the value of page->flags can be anything.
>
> True, this is the initialization part I've missed in one of the previous
> patches already. Would it be possible to only iterate over !reserved
> memory blocks instead? Now that we discard all the metadata later it
> should be quite easy to do for_each_memblock_type, no?

Hi Michal,

Clever suggestion to add a new iterator to go through unreserved
existing memory, I do not think there is this iterator available, so it
would need to be implemented, using similar approach to what I have done
with a call back.

However, there is a different reason, why I took this current approach.

Daniel Jordan is working on a ktask support:
https://lkml.org/lkml/2017/7/14/666

He and I discussed on how to multi-thread struct pages initialization
within memory nodes using ktasks. Having this callback interface makes
that multi-threading quiet easy, improving the boot performance further,
with his prototype we saw x4-6 improvements (using 4-8 threads per
node). Reducing the total time it takes to initialize all struct pages
on machines with terabytes of memory to less than one second.

Pasha