>> +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 <will.deacon@xxxxxxx> > 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 <will.deacon@xxxxxxx> > Cc: Mel Gorman <mgorman@xxxxxxx> > Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> > Signed-off-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> > > 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 stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html