lib/alloc_page: complete rewrite of the page allocator
This is a complete rewrite of the page allocator. This will bring a few improvements: * no need to specify the size when freeing * allocate small areas with a large alignment without wasting memory * ability to initialize and use multiple memory areas (e.g. DMA) * more sanity checks A few things have changed: * initialization cannot be done with free_pages like before, page_alloc_init_area has to be used instead Arch-specific changes: * s390x now uses the area below 2GiB for SMP lowcore initialization. Details: Each memory area has metadata at the very beginning. The metadata is a byte array with one entry per usable page (so, excluding the metadata itself). Each entry indicates if the page is special (unused for now), if it is allocated, and the order of the block. Both free and allocated pages are part of larger blocks. Some more fixed size metadata is present in a fixed-size static array. This metadata contains start and end page frame numbers, the pointer to the metadata array, and the array of freelists. The array of freelists has an entry for each possible order (indicated by the macro NLISTS, defined as BITS_PER_LONG - PAGE_SHIFT). On allocation, if the free list for the needed size is empty, larger blocks are split. When a small allocation with a large alignment is requested, an appropriately large block is split, to guarantee the alignment. When a block is freed, an attempt will be made to merge it into the neighbour, iterating the process as long as possible. Signed-off-by:Claudio Imbrenda <imbrenda@linux.ibm.com> Message-Id: <20201002154420.292134-5-imbrenda@linux.ibm.com> Signed-off-by:
Paolo Bonzini <pbonzini@redhat.com>
Loading