mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
mm: highmem: don't treat PKMAP_ADDR(LAST_PKMAP) as a highmem address
commit 498c228021
upstream.
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@arm.com>
Cc: Mel Gorman <mgorman@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Yijing Wang <wangyijing@huawei.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
85faa17c6a
commit
4db251fa78
1 changed files with 1 additions and 1 deletions
|
@ -98,7 +98,7 @@ struct page *kmap_to_page(void *vaddr)
|
||||||
{
|
{
|
||||||
unsigned long addr = (unsigned long)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;
|
int i = (addr - PKMAP_ADDR(0)) >> PAGE_SHIFT;
|
||||||
return pte_page(pkmap_page_table[i]);
|
return pte_page(pkmap_page_table[i]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue