Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752417AbaFJIFh (ORCPT ); Tue, 10 Jun 2014 04:05:37 -0400 Received: from szxga03-in.huawei.com ([119.145.14.66]:1864 "EHLO szxga03-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750742AbaFJIFc (ORCPT ); Tue, 10 Jun 2014 04:05:32 -0400 Message-ID: <5396BC25.7040500@huawei.com> Date: Tue, 10 Jun 2014 16:04:53 +0800 From: Yijing Wang User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Thunderbird/24.0.1 MIME-Version: 1.0 To: Hugh Dickins , Greg Kroah-Hartman CC: , , Mel Gorman , Rik van Riel , Andrew Morton , Ben Hutchings , Will Deacon Subject: Re: [PATCH 3.4 47/88] mm: add kmap_to_page() References: <20140610002424.500996570@linuxfoundation.org> <20140610002426.089246636@linuxfoundation.org> In-Reply-To: Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.177.27.212] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org >> +struct page *kmap_to_page(void *vaddr) >> +{ >> + unsigned long addr = (unsigned long)vaddr; >> + >> + if (addr >= PKMAP_ADDR(0) && addr <= PKMAP_ADDR(LAST_PKMAP)) { >> + int i = (addr - PKMAP_ADDR(0)) >> PAGE_SHIFT; >> + return pte_page(pkmap_page_table[i]); >> + } >> + >> + return virt_to_page(addr); >> +} >> + >> static void flush_all_zero_pkmaps(void) >> { >> int i; > > I think this needs the following on top: > > commit 498c2280212327858e521e9d21345d4cc2637f54 > Author: Will Deacon > Date: Fri Nov 16 14:15:00 2012 -0800 > Thanks Hugh. Hi Greg, please pick up this fix patch, Thanks a lot! Yijing. > mm: highmem: don't treat PKMAP_ADDR(LAST_PKMAP) as a highmem address > > kmap_to_page returns the corresponding struct page for a virtual address > of an arbitrary mapping. This works by checking whether the address > falls in the pkmap region and using the pkmap page tables instead of the > linear mapping if appropriate. > > Unfortunately, the bounds checking means that PKMAP_ADDR(LAST_PKMAP) is > incorrectly treated as a highmem address and we can end up walking off > the end of pkmap_page_table and subsequently passing junk to pte_page. > > This patch fixes the bound check to stay within the pkmap tables. > > Signed-off-by: Will Deacon > Cc: Mel Gorman > Signed-off-by: Andrew Morton > Signed-off-by: Linus Torvalds > > diff --git a/mm/highmem.c b/mm/highmem.c > index d517cd16a6eb..2da13a5c50e2 100644 > --- a/mm/highmem.c > +++ b/mm/highmem.c > @@ -98,7 +98,7 @@ struct page *kmap_to_page(void *vaddr) > { > unsigned long addr = (unsigned long)vaddr; > > - if (addr >= PKMAP_ADDR(0) && addr <= PKMAP_ADDR(LAST_PKMAP)) { > + if (addr >= PKMAP_ADDR(0) && addr < PKMAP_ADDR(LAST_PKMAP)) { > int i = (addr - PKMAP_ADDR(0)) >> PAGE_SHIFT; > return pte_page(pkmap_page_table[i]); > } > > > . > -- Thanks! Yijing -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/