Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2230ebf6 authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Michael Ellerman
Browse files

powerpc/mm: Handle page table allocation failures



This fixes kernel crash that arises due to not handling page table allocation
failures while allocating hugetlb page table.

Fixes: e2b3d202 ("powerpc: Switch 16GB and 16MB explicit hugepages to a different page table format")
Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 57caddae
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -130,6 +130,8 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr, unsigned long sz
	} else {
	} else {
		pdshift = PUD_SHIFT;
		pdshift = PUD_SHIFT;
		pu = pud_alloc(mm, pg, addr);
		pu = pud_alloc(mm, pg, addr);
		if (!pu)
			return NULL;
		if (pshift == PUD_SHIFT)
		if (pshift == PUD_SHIFT)
			return (pte_t *)pu;
			return (pte_t *)pu;
		else if (pshift > PMD_SHIFT) {
		else if (pshift > PMD_SHIFT) {
@@ -138,6 +140,8 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr, unsigned long sz
		} else {
		} else {
			pdshift = PMD_SHIFT;
			pdshift = PMD_SHIFT;
			pm = pmd_alloc(mm, pu, addr);
			pm = pmd_alloc(mm, pu, addr);
			if (!pm)
				return NULL;
			if (pshift == PMD_SHIFT)
			if (pshift == PMD_SHIFT)
				/* 16MB hugepage */
				/* 16MB hugepage */
				return (pte_t *)pm;
				return (pte_t *)pm;
@@ -154,12 +158,16 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr, unsigned long sz
	} else {
	} else {
		pdshift = PUD_SHIFT;
		pdshift = PUD_SHIFT;
		pu = pud_alloc(mm, pg, addr);
		pu = pud_alloc(mm, pg, addr);
		if (!pu)
			return NULL;
		if (pshift >= PUD_SHIFT) {
		if (pshift >= PUD_SHIFT) {
			ptl = pud_lockptr(mm, pu);
			ptl = pud_lockptr(mm, pu);
			hpdp = (hugepd_t *)pu;
			hpdp = (hugepd_t *)pu;
		} else {
		} else {
			pdshift = PMD_SHIFT;
			pdshift = PMD_SHIFT;
			pm = pmd_alloc(mm, pu, addr);
			pm = pmd_alloc(mm, pu, addr);
			if (!pm)
				return NULL;
			ptl = pmd_lockptr(mm, pm);
			ptl = pmd_lockptr(mm, pm);
			hpdp = (hugepd_t *)pm;
			hpdp = (hugepd_t *)pm;
		}
		}