Commit f5164797 authored by Donet Tom's avatar Donet Tom Committed by Madhavan Srinivasan
Browse files

book3s64/radix : Optimize vmemmap start alignment



If we always align the vmemmap start to PAGE_SIZE, there is a
chance that we may end up allocating page-sized vmemmap backing
pages in RAM in the altmap not present case, because a PAGE_SIZE
aligned address is not PMD_SIZE-aligned.

In this patch, we are aligning the vmemmap start address to
PMD_SIZE if altmap is not present. This ensures that a PMD_SIZE
page is always allocated for the vmemmap mapping if altmap is
not present.

If altmap is present, Make sure we align the start vmemmap addr to
PAGE_SIZE so that we calculate the correct start_pfn in altmap
boundary check to decide whether we should use altmap or RAM based
backing memory allocation. Also the address need to be aligned for
set_pte operation. If the start addr is already PMD_SIZE aligned
and with in the altmap boundary then we will try to use a pmd size
altmap mapping else we go for page size  mapping.

So if altmap is present, we try to use the maximum number of
altmap pages; otherwise, we allocate a PMD_SIZE RAM page.

Signed-off-by: default avatarDonet Tom <donettom@linux.ibm.com>
Signed-off-by: default avatarMadhavan Srinivasan <maddy@linux.ibm.com>
Link: https://patch.msgid.link/895c4afd912c85d344a2065e348fac90529ed48f.1750593372.git.donettom@linux.ibm.com
parent 58450938
Loading
Loading
Loading
Loading
+18 −11
Original line number Diff line number Diff line
@@ -1122,18 +1122,25 @@ int __meminit radix__vmemmap_populate(unsigned long start, unsigned long end, in
	pte_t *pte;

	/*
	 * Make sure we align the start vmemmap addr so that we calculate
	 * the correct start_pfn in altmap boundary check to decided whether
	 * we should use altmap or RAM based backing memory allocation. Also
	 * the address need to be aligned for set_pte operation.

	 * If the start addr is already PMD_SIZE aligned we will try to use
	 * a pmd mapping. We don't want to be too aggressive here beacause
	 * that will cause more allocations in RAM. So only if the namespace
	 * vmemmap start addr is PMD_SIZE aligned we will use PMD mapping.
	 * If altmap is present, Make sure we align the start vmemmap addr
	 * to PAGE_SIZE so that we calculate the correct start_pfn in
	 * altmap boundary check to decide whether we should use altmap or
	 * RAM based backing memory allocation. Also the address need to be
	 * aligned for set_pte operation. If the start addr is already
	 * PMD_SIZE aligned and with in the altmap boundary then we will
	 * try to use a pmd size altmap mapping else we go for page size
	 * mapping.
	 *
	 * If altmap is not present, align the vmemmap addr to PMD_SIZE and
	 * always allocate a PMD size page for vmemmap backing.
	 *
	 */

	if (altmap)
		start = ALIGN_DOWN(start, PAGE_SIZE);
	else
		start = ALIGN_DOWN(start, PMD_SIZE);

	for (addr = start; addr < end; addr = next) {
		next = pmd_addr_end(addr, end);

@@ -1159,7 +1166,7 @@ int __meminit radix__vmemmap_populate(unsigned long start, unsigned long end, in
			 * in altmap block allocation failures, in which case
			 * we fallback to RAM for vmemmap allocation.
			 */
			if (!IS_ALIGNED(addr, PMD_SIZE) || (altmap &&
			if (altmap && (!IS_ALIGNED(addr, PMD_SIZE) ||
			    altmap_cross_boundary(altmap, addr, PMD_SIZE))) {
				/*
				 * make sure we don't create altmap mappings