Commit e5868a37 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] vmalloc address offset fix

From: Anton Blanchard <anton@samba.org>

Paul wrote a patch to use some of the rmap infrastructure to flush TLB
entries on ppc64.  When testing it we found a problem in vmalloc where it
sets up the pte -> address mapping incorrectly.  We clear the top bits of
the address but then forget to pass in the full address to
pte_alloc_kernel.  The end result is the address in page->index is
truncated.

I fixed it in a similar way to how zeromap_pmd_range etc does it.  I'm
guessing no one uses the rmap hooks on vmalloc pages yet, so havent seen
this problem.
parent 0c2d1195
...@@ -114,15 +114,16 @@ static int map_area_pmd(pmd_t *pmd, unsigned long address, ...@@ -114,15 +114,16 @@ static int map_area_pmd(pmd_t *pmd, unsigned long address,
unsigned long size, pgprot_t prot, unsigned long size, pgprot_t prot,
struct page ***pages) struct page ***pages)
{ {
unsigned long end; unsigned long base, end;
base = address & PGDIR_MASK;
address &= ~PGDIR_MASK; address &= ~PGDIR_MASK;
end = address + size; end = address + size;
if (end > PGDIR_SIZE) if (end > PGDIR_SIZE)
end = PGDIR_SIZE; end = PGDIR_SIZE;
do { do {
pte_t * pte = pte_alloc_kernel(&init_mm, pmd, address); pte_t * pte = pte_alloc_kernel(&init_mm, pmd, base + address);
if (!pte) if (!pte)
return -ENOMEM; return -ENOMEM;
if (map_area_pte(pte, address, end - address, prot, pages)) if (map_area_pte(pte, address, end - address, prot, pages))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment