From patchwork Thu Aug 9 15:02:59 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [v2,2/6] mm: make clear_huge_page tolerate non aligned address Date: Thu, 09 Aug 2012 05:02:59 -0000 From: "Kirill A. Shutemov" X-Patchwork-Id: 176181 Message-Id: <1344524583-1096-3-git-send-email-kirill.shutemov@linux.intel.com> To: linux-mm@kvack.org Cc: linux-mips@linux-mips.org, linux-sh@vger.kernel.org, Jan Beulich , "H. Peter Anvin" , sparclinux@vger.kernel.org, Andrea Arcangeli , Andi Kleen , Robert Richter , x86@kernel.org, Hugh Dickins , Ingo Molnar , Mel Gorman , Alex Shi , Thomas Gleixner , KAMEZAWA Hiroyuki , Tim Chen , linux-kernel@vger.kernel.org, Andy Lutomirski , Johannes Weiner , Andrew Morton , linuxppc-dev@lists.ozlabs.org, "Kirill A. Shutemov" From: Andi Kleen hugetlb does not necessarily pass in an aligned address, so the low level address computation is wrong. This will fix architectures that actually use the address for flushing the cleared address (very few, like xtensa/sparc/...?) Signed-off-by: Andi Kleen Signed-off-by: Kirill A. Shutemov --- mm/memory.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mm/memory.c b/mm/memory.c index 5736170..b47199a 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3987,16 +3987,17 @@ void clear_huge_page(struct page *page, unsigned long addr, unsigned int pages_per_huge_page) { int i; + unsigned long haddr = addr & HPAGE_PMD_MASK; if (unlikely(pages_per_huge_page > MAX_ORDER_NR_PAGES)) { - clear_gigantic_page(page, addr, pages_per_huge_page); + clear_gigantic_page(page, haddr, pages_per_huge_page); return; } might_sleep(); for (i = 0; i < pages_per_huge_page; i++) { cond_resched(); - clear_user_highpage(page + i, addr + i * PAGE_SIZE); + clear_user_highpage(page + i, haddr + i * PAGE_SIZE); } }