On 1/12/22 11:43 AM, Kirill A. Shutemov wrote: > On Tue, Jan 11, 2022 at 11:10:40AM -0800, Dave Hansen wrote: >> On 1/11/22 03:33, Kirill A. Shutemov wrote: >>> Unaccepted memory bitmap is allocated during decompression stage and >>> handed over to main kernel image via boot_params. The bitmap is used to >>> track if memory has been accepted. >>> >>> Reserve unaccepted memory bitmap has to prevent reallocating memory for >>> other means. >> >> I'm having a hard time parsing that changelog, especially the second >> paragraph. Could you give it another shot? > > What about this: > > Unaccepted memory bitmap is allocated during decompression stage and > handed over to main kernel image via boot_params. > > Kernel tracks what memory has been accepted in the bitmap. > > Reserve memory where the bitmap is placed to prevent memblock from > re-allocating the memory for other needs. > > ? Ahh, I get what you're trying to say now. But, it still really lacks a coherent problem statement. How about this? == Problem == A given page of memory can only be accepted once. The kernel has a need to accept memory both in the early decompression stage and during normal runtime. == Solution == Use a bitmap to communicate the acceptance state of each page between the decompression stage and normal runtime. This eliminates the possibility of attempting to double-accept a page. == Details == Allocate the bitmap during decompression stage and hand it over to the main kernel image via boot_params. In the runtime kernel, reserve the bitmap's memory to ensure nothing overwrites it. >>> + /* Mark unaccepted memory bitmap reserved */ >>> + if (boot_params.unaccepted_memory) { >>> + unsigned long size; >>> + >>> + /* One bit per 2MB */ >>> + size = DIV_ROUND_UP(e820__end_of_ram_pfn() * PAGE_SIZE, >>> + PMD_SIZE * BITS_PER_BYTE); >>> + memblock_reserve(boot_params.unaccepted_memory, size); >>> + } >> >> Is it OK that the size of the bitmap is inferred from >> e820__end_of_ram_pfn()? Is this OK in the presence of mem= and other things >> that muck with the e820? > > Good question. I think we are fine. If kernel is not able to allocate > memory from a part of physical address space we don't need the bitmap for > it either. That's a good point. If the e820 range does a one-way shrink it's probably fine. The only problem would be if the bitmap had space for for stuff past e820__end_of_ram_pfn() *and* it later needed to be accepted. Would it be worth recording the size of the reservation and then double-checking against it in the bitmap operations?