[RFC] powerpc/mm: Enable gigantic HugeTLB page support for powernv

Subsystems: linux for powerpc (32-bit and 64-bit), the rest

3 messages, 2 authors, 2017-07-05 · open the first message on its own page

[RFC] powerpc/mm: Enable gigantic HugeTLB page support for powernv

From: Anshuman Khandual <hidden>
Date: 2017-07-04 10:46:21

All the functionality for memblock allocation during boot was
already present in Book3e and embeded platforms. This change
just moves around some code under config conditions to make
the function happen on powernv platforms.

Signed-off-by: Anshuman Khandual <redacted>
---
Tested lightly on both powernv and pseries platforms with two
16GB pages. Will appreciate comments and suggestions on the
approach.

On PowerNV while asking for 16GB pages through kernel command
line, we need to be careful not to starve the system of memory
which can make it unable to boot.

 arch/powerpc/include/asm/hugetlb.h |  2 +-
 arch/powerpc/mm/hash_utils_64.c    |  8 ++---
 arch/powerpc/mm/hugetlbpage.c      | 66 ++++++++++++++++++++------------------
 3 files changed, 39 insertions(+), 37 deletions(-)
diff --git a/arch/powerpc/include/asm/hugetlb.h b/arch/powerpc/include/asm/hugetlb.h
index 7f4025a..b0c1464 100644
--- a/arch/powerpc/include/asm/hugetlb.h
+++ b/arch/powerpc/include/asm/hugetlb.h
@@ -224,7 +224,7 @@ static inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr,
  * the .dts as on IBM platforms.
  */
 #if defined(CONFIG_HUGETLB_PAGE) && (defined(CONFIG_PPC_FSL_BOOK3E) || \
-    defined(CONFIG_PPC_8xx))
+    defined(CONFIG_PPC_8xx) || defined(CONFIG_PPC_POWERNV))
 extern void __init reserve_hugetlb_gpages(void);
 #else
 static inline void reserve_hugetlb_gpages(void)
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c
index a3f1e7d..7862fdb 100644
--- a/arch/powerpc/mm/hash_utils_64.c
+++ b/arch/powerpc/mm/hash_utils_64.c
@@ -473,7 +473,7 @@ static int __init htab_dt_scan_page_sizes(unsigned long node,
 	return 1;
 }
 
-#ifdef CONFIG_HUGETLB_PAGE
+#if defined(CONFIG_HUGETLB_PAGE) && !defined(CONFIG_PPC_POWERNV)
 /* Scan for 16G memory blocks that have been set aside for huge pages
  * and reserve those blocks for 16G huge pages.
  */
@@ -513,7 +513,7 @@ static int __init htab_dt_scan_hugepage_blocks(unsigned long node,
 	}
 	return 0;
 }
-#endif /* CONFIG_HUGETLB_PAGE */
+#endif /* CONFIG_HUGETLB_PAGE && !CONFIG_PPC_POWERNV*/
 
 static void mmu_psize_set_default_penc(void)
 {
@@ -566,10 +566,10 @@ static void __init htab_scan_page_sizes(void)
 		       sizeof(mmu_psize_defaults_gp));
 	}
 
-#ifdef CONFIG_HUGETLB_PAGE
+#if defined(CONFIG_HUGETLB_PAGE) && !defined(CONFIG_PPC_POWERNV)
 	/* Reserve 16G huge page memory sections for huge pages */
 	of_scan_flat_dt(htab_dt_scan_hugepage_blocks, NULL);
-#endif /* CONFIG_HUGETLB_PAGE */
+#endif /* CONFIG_HUGETLB_PAGE && !CONFIG_PPC_POWERNV */
 }
 
 /*
diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c
index a4f33de..be0be5d 100644
--- a/arch/powerpc/mm/hugetlbpage.c
+++ b/arch/powerpc/mm/hugetlbpage.c
@@ -258,6 +258,40 @@ int alloc_bootmem_huge_page(struct hstate *hstate)
 
 	return 1;
 }
+#else /* !PPC_FSL_BOOK3E */
+
+/* Build list of addresses of gigantic pages.  This function is used in early
+ * boot before the buddy allocator is setup.
+ */
+void add_gpage(u64 addr, u64 page_size, unsigned long number_of_pages)
+{
+	if (!addr)
+		return;
+	while (number_of_pages > 0) {
+		gpage_freearray[nr_gpages] = addr;
+		nr_gpages++;
+		number_of_pages--;
+		addr += page_size;
+	}
+}
+
+/* Moves the gigantic page addresses from the temporary list to the
+ * huge_boot_pages list.
+ */
+int alloc_bootmem_huge_page(struct hstate *hstate)
+{
+	struct huge_bootmem_page *m;
+	if (nr_gpages == 0)
+		return 0;
+	m = phys_to_virt(gpage_freearray[--nr_gpages]);
+	gpage_freearray[nr_gpages] = 0;
+	list_add(&m->list, &huge_boot_pages);
+	m->hstate = hstate;
+	return 1;
+}
+#endif
+
+#if defined(CONFIG_PPC_FSL_BOOK3E) || defined(CONFIG_PPC_8xx) || defined(CONFIG_PPC_POWERNV)
 /*
  * Scan the command line hugepagesz= options for gigantic pages; store those in
  * a list that we use to allocate the memory once all options are parsed.
@@ -339,38 +373,6 @@ void __init reserve_hugetlb_gpages(void)
 		add_gpage(base, size, gpage_npages[i]);
 	}
 }
-
-#else /* !PPC_FSL_BOOK3E */
-
-/* Build list of addresses of gigantic pages.  This function is used in early
- * boot before the buddy allocator is setup.
- */
-void add_gpage(u64 addr, u64 page_size, unsigned long number_of_pages)
-{
-	if (!addr)
-		return;
-	while (number_of_pages > 0) {
-		gpage_freearray[nr_gpages] = addr;
-		nr_gpages++;
-		number_of_pages--;
-		addr += page_size;
-	}
-}
-
-/* Moves the gigantic page addresses from the temporary list to the
- * huge_boot_pages list.
- */
-int alloc_bootmem_huge_page(struct hstate *hstate)
-{
-	struct huge_bootmem_page *m;
-	if (nr_gpages == 0)
-		return 0;
-	m = phys_to_virt(gpage_freearray[--nr_gpages]);
-	gpage_freearray[nr_gpages] = 0;
-	list_add(&m->list, &huge_boot_pages);
-	m->hstate = hstate;
-	return 1;
-}
 #endif
 
 #if defined(CONFIG_PPC_FSL_BOOK3E) || defined(CONFIG_PPC_8xx)
-- 
1.8.5.6

Re: [RFC] powerpc/mm: Enable gigantic HugeTLB page support for powernv

From: Aneesh Kumar K.V <hidden>
Date: 2017-07-05 03:42:24


On Tuesday 04 July 2017 04:16 PM, Anshuman Khandual wrote:
All the functionality for memblock allocation during boot was
already present in Book3e and embeded platforms. This change
just moves around some code under config conditions to make
the function happen on powernv platforms.

Signed-off-by: Anshuman Khandual <redacted>
---
Tested lightly on both powernv and pseries platforms with two
16GB pages. Will appreciate comments and suggestions on the
approach.

On PowerNV while asking for 16GB pages through kernel command
line, we need to be careful not to starve the system of memory
which can make it unable to boot.
I have a patch series that does this here. How is this different ?

http://mid.gmane.org/1496327441-7368-1-git-send-email- 
aneesh.kumar@linux.vnet.ibm.com



quoted hunk
  arch/powerpc/include/asm/hugetlb.h |  2 +-
  arch/powerpc/mm/hash_utils_64.c    |  8 ++---
  arch/powerpc/mm/hugetlbpage.c      | 66 ++++++++++++++++++++------------------
  3 files changed, 39 insertions(+), 37 deletions(-)
diff --git a/arch/powerpc/include/asm/hugetlb.h b/arch/powerpc/include/asm/hugetlb.h
index 7f4025a..b0c1464 100644
--- a/arch/powerpc/include/asm/hugetlb.h
+++ b/arch/powerpc/include/asm/hugetlb.h
@@ -224,7 +224,7 @@ static inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr,
   * the .dts as on IBM platforms.
   */
  #if defined(CONFIG_HUGETLB_PAGE) && (defined(CONFIG_PPC_FSL_BOOK3E) || \
-    defined(CONFIG_PPC_8xx))
+    defined(CONFIG_PPC_8xx) || defined(CONFIG_PPC_POWERNV))
  extern void __init reserve_hugetlb_gpages(void);
  #else
  static inline void reserve_hugetlb_gpages(void)
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c
index a3f1e7d..7862fdb 100644
--- a/arch/powerpc/mm/hash_utils_64.c
+++ b/arch/powerpc/mm/hash_utils_64.c
@@ -473,7 +473,7 @@ static int __init htab_dt_scan_page_sizes(unsigned long node,
  	return 1;
  }

-#ifdef CONFIG_HUGETLB_PAGE
+#if defined(CONFIG_HUGETLB_PAGE) && !defined(CONFIG_PPC_POWERNV)
  /* Scan for 16G memory blocks that have been set aside for huge pages
   * and reserve those blocks for 16G huge pages.
   */
@@ -513,7 +513,7 @@ static int __init htab_dt_scan_hugepage_blocks(unsigned long node,
  	}
  	return 0;
  }
-#endif /* CONFIG_HUGETLB_PAGE */
+#endif /* CONFIG_HUGETLB_PAGE && !CONFIG_PPC_POWERNV*/

  static void mmu_psize_set_default_penc(void)
  {
@@ -566,10 +566,10 @@ static void __init htab_scan_page_sizes(void)
  		       sizeof(mmu_psize_defaults_gp));
  	}

-#ifdef CONFIG_HUGETLB_PAGE
+#if defined(CONFIG_HUGETLB_PAGE) && !defined(CONFIG_PPC_POWERNV)
  	/* Reserve 16G huge page memory sections for huge pages */
  	of_scan_flat_dt(htab_dt_scan_hugepage_blocks, NULL);
-#endif /* CONFIG_HUGETLB_PAGE */
+#endif /* CONFIG_HUGETLB_PAGE && !CONFIG_PPC_POWERNV */
  }

  /*
diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c
index a4f33de..be0be5d 100644
--- a/arch/powerpc/mm/hugetlbpage.c
+++ b/arch/powerpc/mm/hugetlbpage.c
@@ -258,6 +258,40 @@ int alloc_bootmem_huge_page(struct hstate *hstate)

  	return 1;
  }
+#else /* !PPC_FSL_BOOK3E */
+
+/* Build list of addresses of gigantic pages.  This function is used in early
+ * boot before the buddy allocator is setup.
+ */
+void add_gpage(u64 addr, u64 page_size, unsigned long number_of_pages)
+{
+	if (!addr)
+		return;
+	while (number_of_pages > 0) {
+		gpage_freearray[nr_gpages] = addr;
+		nr_gpages++;
+		number_of_pages--;
+		addr += page_size;
+	}
+}
+
+/* Moves the gigantic page addresses from the temporary list to the
+ * huge_boot_pages list.
+ */
+int alloc_bootmem_huge_page(struct hstate *hstate)
+{
+	struct huge_bootmem_page *m;
+	if (nr_gpages == 0)
+		return 0;
+	m = phys_to_virt(gpage_freearray[--nr_gpages]);
+	gpage_freearray[nr_gpages] = 0;
+	list_add(&m->list, &huge_boot_pages);
+	m->hstate = hstate;
+	return 1;
+}
+#endif
+
+#if defined(CONFIG_PPC_FSL_BOOK3E) || defined(CONFIG_PPC_8xx) || defined(CONFIG_PPC_POWERNV)
  /*
   * Scan the command line hugepagesz= options for gigantic pages; store those in
   * a list that we use to allocate the memory once all options are parsed.
@@ -339,38 +373,6 @@ void __init reserve_hugetlb_gpages(void)
  		add_gpage(base, size, gpage_npages[i]);
  	}
  }
-
-#else /* !PPC_FSL_BOOK3E */
-
-/* Build list of addresses of gigantic pages.  This function is used in early
- * boot before the buddy allocator is setup.
- */
-void add_gpage(u64 addr, u64 page_size, unsigned long number_of_pages)
-{
-	if (!addr)
-		return;
-	while (number_of_pages > 0) {
-		gpage_freearray[nr_gpages] = addr;
-		nr_gpages++;
-		number_of_pages--;
-		addr += page_size;
-	}
-}
-
-/* Moves the gigantic page addresses from the temporary list to the
- * huge_boot_pages list.
- */
-int alloc_bootmem_huge_page(struct hstate *hstate)
-{
-	struct huge_bootmem_page *m;
-	if (nr_gpages == 0)
-		return 0;
-	m = phys_to_virt(gpage_freearray[--nr_gpages]);
-	gpage_freearray[nr_gpages] = 0;
-	list_add(&m->list, &huge_boot_pages);
-	m->hstate = hstate;
-	return 1;
-}
  #endif

  #if defined(CONFIG_PPC_FSL_BOOK3E) || defined(CONFIG_PPC_8xx)

Re: [RFC] powerpc/mm: Enable gigantic HugeTLB page support for powernv

From: Anshuman Khandual <hidden>
Date: 2017-07-05 03:49:43

On 07/05/2017 09:12 AM, Aneesh Kumar K.V wrote:

On Tuesday 04 July 2017 04:16 PM, Anshuman Khandual wrote:
quoted
All the functionality for memblock allocation during boot was
already present in Book3e and embeded platforms. This change
just moves around some code under config conditions to make
the function happen on powernv platforms.

Signed-off-by: Anshuman Khandual <redacted>
---
Tested lightly on both powernv and pseries platforms with two
16GB pages. Will appreciate comments and suggestions on the
approach.

On PowerNV while asking for 16GB pages through kernel command
line, we need to be careful not to starve the system of memory
which can make it unable to boot.
I have a patch series that does this here. How is this different ?

http://mid.gmane.org/1496327441-7368-1-git-send-email-
aneesh.kumar@linux.vnet.ibm.com
Hmm, did not know you have attempted this before. The link does
not open for me. Could you give the subject line for the patch
series.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help