[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1492469211-228826-1-git-send-email-nitin.m.gupta@oracle.com>
Date: Mon, 17 Apr 2017 15:46:41 -0700
From: Nitin Gupta <nitin.m.gupta@...cle.com>
To: "David S. Miller" <davem@...emloft.net>
Cc: Nitin Gupta <nitin.m.gupta@...cle.com>,
"David S. Miller" <davem@...emloft.net>,
Mike Kravetz <mike.kravetz@...cle.com>,
Ingo Molnar <mingo@...nel.org>, sparclinux@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: [PATCH] sparc64: Fix hugepage page table free
Make sure the start adderess is aligned to PMD_SIZE
boundary when freeing page table backing a hugepage
region. The issue was causing segfaults when a region
backed by 64K pages was unmapped since such a region
is in general not PMD_SIZE aligned.
Signed-off-by: Nitin Gupta <nitin.m.gupta@...cle.com>
---
arch/sparc/mm/hugetlbpage.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c
index ee5273a..7c29d38 100644
--- a/arch/sparc/mm/hugetlbpage.c
+++ b/arch/sparc/mm/hugetlbpage.c
@@ -461,6 +461,22 @@ void hugetlb_free_pgd_range(struct mmu_gather *tlb,
pgd_t *pgd;
unsigned long next;
+ addr &= PMD_MASK;
+ if (addr < floor) {
+ addr += PMD_SIZE;
+ if (!addr)
+ return;
+ }
+ if (ceiling) {
+ ceiling &= PMD_MASK;
+ if (!ceiling)
+ return;
+ }
+ if (end - 1 > ceiling - 1)
+ end -= PMD_SIZE;
+ if (addr > end - 1)
+ return;
+
pgd = pgd_offset(tlb->mm, addr);
do {
next = pgd_addr_end(addr, end);
--
2.9.2
Powered by blists - more mailing lists