Skip to contentSkip to conversation

powerpc: fix pgtable pmd cache init

PATCH Applied Nicholas Piggin 3 participants 5 messages Jan 3, 2017 – Jan 18, 2017 PowerPC

lore
Share & tools
lore

Nicholas Piggin

author reviewer
#0 lore raw

PATCH 1/1 powerpc: fix pgtable pmd cache init

Commit 9b081e10805cd ("powerpc: port 64 bits pgtable_cache to 32 bits") mixed up PMD_INDEX_SIZE and PMD_CACHE_INDEX a couple of times. This resulted in 64s/hash/4k configs to panic at boot with a false positive error check.

Fix that and simplify error handling by moving the check to the caller.

Fixes 9b081e10805cd ("powerpc: port 64 bits pgtable_cache to 32 bits")
Cc Christophe Leroy <[email protected]>
Cc Aneesh Kumar K.V <[email protected]>
Cc Scott Wood <[email protected]>
---
 arch/powerpc/mm/hugetlbpage.c |  6 +-----
 arch/powerpc/mm/init-common.c | 11 +++--------
 2 files changed, 4 insertions(+), 13 deletions(-)
arch/powerpc/mm/hugetlbpage.c +1 -5
index 289df38fb7e0..f21f6b907d99 100644
@@ -810,12 +810,8 @@ static int __init hugetlbpage_init(void)
 		 * if we have pdshift and shift value same, we don't
 		 * use pgt cache for hugepd.
 		 */
-		if (pdshift > shift) {
+		if (pdshift > shift)
 			pgtable_cache_add(pdshift - shift, NULL);
-			if (!PGT_CACHE(pdshift - shift))
-				panic("hugetlbpage_init(): could not create "
-				      "pgtable cache for %d bit pagesize\n", shift);
-		}
 #if defined(CONFIG_PPC_FSL_BOOK3E) || defined(CONFIG_PPC_8xx)
 		else if (!hugepte_cache) {
 			/*
arch/powerpc/mm/init-common.c +3 -8
index a175cd82ae8c..1a3be5ae1d07 100644
@@ -80,6 +80,8 @@ void pgtable_cache_add(unsigned shift, void (*ctor)(void *))
 	new = kmem_cache_create(name, table_size, align, 0, ctor);
 	kfree(name);
 	pgtable_cache[shift - 1] = new;
+	if (!new)
+		panic("Could not allocate pgtable cache for order %d", shift);
 	pr_debug("Allocated pgtable cache for order %d\n", shift);
 }
 
@@ -88,7 +90,7 @@ void pgtable_cache_init(void)
 {
 	pgtable_cache_add(PGD_INDEX_SIZE, pgd_ctor);
 
-	if (PMD_INDEX_SIZE && !PGT_CACHE(PMD_INDEX_SIZE))
+	if (PMD_CACHE_INDEX && !PGT_CACHE(PMD_CACHE_INDEX))
 		pgtable_cache_add(PMD_CACHE_INDEX, pmd_ctor);
 	/*
 	 * In all current configs, when the PUD index exists it's the
@@ -97,11 +99,4 @@ void pgtable_cache_init(void)
 	 */
 	if (PUD_INDEX_SIZE && !PGT_CACHE(PUD_INDEX_SIZE))
 		pgtable_cache_add(PUD_INDEX_SIZE, pud_ctor);
-
-	if (!PGT_CACHE(PGD_INDEX_SIZE))
-		panic("Couldn't allocate pgd cache");
-	if (PMD_INDEX_SIZE && !PGT_CACHE(PMD_INDEX_SIZE))
-		panic("Couldn't allocate pmd pgtable caches");
-	if (PUD_INDEX_SIZE && !PGT_CACHE(PUD_INDEX_SIZE))
-		panic("Couldn't allocate pud pgtable caches");
 }
Signature · 1 line
2.11.0
Reviewed-by on v1 1/1
#1 lore raw
Quoted 5 lines · Nicholas Piggin

Commit 9b081e10805cd ("powerpc: port 64 bits pgtable_cache to 32 bits") mixed up PMD_INDEX_SIZE and PMD_CACHE_INDEX a couple of times. This resulted in 64s/hash/4k configs to panic at boot with a false positive error check.

Quoted 8 lines

Fix that and simplify error handling by moving the check to the caller.

Fixes 9b081e10805cd ("powerpc: port 64 bits pgtable_cache to 32 bits")
Cc Christophe Leroy <[email protected]>
Cc Aneesh Kumar K.V <[email protected]>
Cc Scott Wood <[email protected]>

I did another fix here.

https://lkml.kernel.org/r/[email protected]

But this patch makes it much simpler. Hence.

There is this hunk in the patch I did.

arch/powerpc/include/asm/book3s/64/hash.h +0 -0
@@ -33,9 +33,9 @@

H_PUD_INDEX_SIZE + H_PGD_INDEX_SIZE + PAGE_SHIFT)
#define H_PGTABLE_RANGE (ASM_CONST(1) << H_PGTABLE_EADDR_SIZE)

-#ifdef CONFIG_TRANSPARENT_HUGEPAGE
+#if defined(CONFIG_TRANSPARENT_HUGEPAGE) && defined(CONFIG_PPC_64K_PAGES)
/*
- * only with hash we need to use the second half of pmd page table
+ * only with hash 64k we need to use the second half of pmd page table
* to store pointer to deposited pgtable_t
*/
#define H_PMD_CACHE_INDEX (H_PMD_INDEX_SIZE + 1)

Quoted 59 lines
---
 arch/powerpc/mm/hugetlbpage.c |  6 +-----
 arch/powerpc/mm/init-common.c | 11 +++--------
 2 files changed, 4 insertions(+), 13 deletions(-)
arch/powerpc/mm/hugetlbpage.c +1 -5
index 289df38fb7e0..f21f6b907d99 100644
@@ -810,12 +810,8 @@ static int __init hugetlbpage_init(void)
 		 * if we have pdshift and shift value same, we don't
 		 * use pgt cache for hugepd.
 		 */
-		if (pdshift > shift) {
+		if (pdshift > shift)
 			pgtable_cache_add(pdshift - shift, NULL);
-			if (!PGT_CACHE(pdshift - shift))
-				panic("hugetlbpage_init(): could not create "
-				      "pgtable cache for %d bit pagesize\n", shift);
-		}
 #if defined(CONFIG_PPC_FSL_BOOK3E) || defined(CONFIG_PPC_8xx)
 		else if (!hugepte_cache) {
 			/*
arch/powerpc/mm/init-common.c +3 -8
index a175cd82ae8c..1a3be5ae1d07 100644
@@ -80,6 +80,8 @@ void pgtable_cache_add(unsigned shift, void (*ctor)(void *))
 	new = kmem_cache_create(name, table_size, align, 0, ctor);
 	kfree(name);
 	pgtable_cache[shift - 1] = new;
+	if (!new)
+		panic("Could not allocate pgtable cache for order %d", shift);
 	pr_debug("Allocated pgtable cache for order %d\n", shift);
 }
 
@@ -88,7 +90,7 @@ void pgtable_cache_init(void)
 {
 	pgtable_cache_add(PGD_INDEX_SIZE, pgd_ctor);
 
-	if (PMD_INDEX_SIZE && !PGT_CACHE(PMD_INDEX_SIZE))
+	if (PMD_CACHE_INDEX && !PGT_CACHE(PMD_CACHE_INDEX))
 		pgtable_cache_add(PMD_CACHE_INDEX, pmd_ctor);
 	/*
 	 * In all current configs, when the PUD index exists it's the
@@ -97,11 +99,4 @@ void pgtable_cache_init(void)
 	 */
 	if (PUD_INDEX_SIZE && !PGT_CACHE(PUD_INDEX_SIZE))
 		pgtable_cache_add(PUD_INDEX_SIZE, pud_ctor);
-
-	if (!PGT_CACHE(PGD_INDEX_SIZE))
-		panic("Couldn't allocate pgd cache");
-	if (PMD_INDEX_SIZE && !PGT_CACHE(PMD_INDEX_SIZE))
-		panic("Couldn't allocate pmd pgtable caches");
-	if (PUD_INDEX_SIZE && !PGT_CACHE(PUD_INDEX_SIZE))
-		panic("Couldn't allocate pud pgtable caches");
 }
Signature · 1 line
2.11.0
author reviewer
#2 lore raw
Quoted 18 lines · On Wed, 04 Jan 2017 07:34:41 +0530 "Aneesh Kumar K.V"…
Quoted 5 lines · Nicholas Piggin

Commit 9b081e10805cd ("powerpc: port 64 bits pgtable_cache to 32 bits") mixed up PMD_INDEX_SIZE and PMD_CACHE_INDEX a couple of times. This resulted in 64s/hash/4k configs to panic at boot with a false positive error check.

Quoted 8 lines

Fix that and simplify error handling by moving the check to the caller.

Fixes 9b081e10805cd ("powerpc: port 64 bits pgtable_cache to 32 bits")
Cc Christophe Leroy <[email protected]>
Cc Aneesh Kumar K.V <[email protected]>
Cc Scott Wood <[email protected]>

I did another fix here.

Quoted 7 lines

https://lkml.kernel.org/r/[email protected]

But this patch makes it much simpler. Hence.

There is this hunk in the patch I did.

Ah, I missed that. My patch just fixes the 9b081e10805cd bug, but this hunk looks like it should still go in as another patch. Will you resend it?

Thanks,
Nick

Quoted 16 lines
arch/powerpc/include/asm/book3s/64/hash.h +2 -2
@@ -33,9 +33,9 @@
 				 H_PUD_INDEX_SIZE + H_PGD_INDEX_SIZE + PAGE_SHIFT)
 #define H_PGTABLE_RANGE		(ASM_CONST(1) << H_PGTABLE_EADDR_SIZE)
 
-#ifdef CONFIG_TRANSPARENT_HUGEPAGE
+#if defined(CONFIG_TRANSPARENT_HUGEPAGE) &&  defined(CONFIG_PPC_64K_PAGES)
 /*
- * only with hash we need to use the second half of pmd page table
+ * only with hash 64k we need to use the second half of pmd page table
  * to store pointer to deposited pgtable_t
  */
 #define H_PMD_CACHE_INDEX	(H_PMD_INDEX_SIZE + 1)
#3 lore raw
Quoted 25 lines · Nicholas Piggin
Quoted 22 lines · On Wed, 04 Jan 2017 07:34:41 +0530 "Aneesh Kumar K.V"…
Quoted 5 lines · Nicholas Piggin

Commit 9b081e10805cd ("powerpc: port 64 bits pgtable_cache to 32 bits") mixed up PMD_INDEX_SIZE and PMD_CACHE_INDEX a couple of times. This resulted in 64s/hash/4k configs to panic at boot with a false positive error check.

Quoted 8 lines

Fix that and simplify error handling by moving the check to the caller.

Fixes 9b081e10805cd ("powerpc: port 64 bits pgtable_cache to 32 bits")
Cc Christophe Leroy <[email protected]>
Cc Aneesh Kumar K.V <[email protected]>
Cc Scott Wood <[email protected]>

I did another fix here.

https://lkml.kernel.org/r/[email protected]

But this patch makes it much simpler. Hence.

Quoted 8 lines
Quoted 3 lines

There is this hunk in the patch I did.

Ah, I missed that. My patch just fixes the 9b081e10805cd bug, but this hunk looks like it should still go in as another patch. Will you resend it?

ok will do that.

-aneesh

#4 lore raw
In reply to Nicholas Piggin
Quoted 5 lines · Nicholas Piggin

Commit 9b081e10805cd ("powerpc: port 64 bits pgtable_cache to 32 bits") mixed up PMD_INDEX_SIZE and PMD_CACHE_INDEX a couple of times. This resulted in 64s/hash/4k configs to panic at boot with a false positive error check.

Quoted 8 lines

Fix that and simplify error handling by moving the check to the caller.

Fixes 9b081e10805cd ("powerpc: port 64 bits pgtable_cache to 32 bits")
Cc Christophe Leroy <[email protected]>
Cc Aneesh Kumar K.V <[email protected]>
Cc Scott Wood <[email protected]>

Applied to powerpc fixes, thanks.

https://git.kernel.org/powerpc/c/bf5ca68dd2eef59a936969e802d811

cheers