From e5868a37452774d6a6f03173d994244d5cd4027c Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Tue, 3 Feb 2004 18:41:50 -0800 Subject: [PATCH] [PATCH] vmalloc address offset fix From: Anton Blanchard 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. --- mm/vmalloc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 2d3022d2c8599..c7f7018278b43 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -114,15 +114,16 @@ static int map_area_pmd(pmd_t *pmd, unsigned long address, unsigned long size, pgprot_t prot, struct page ***pages) { - unsigned long end; + unsigned long base, end; + base = address & PGDIR_MASK; address &= ~PGDIR_MASK; end = address + size; if (end > PGDIR_SIZE) end = PGDIR_SIZE; do { - pte_t * pte = pte_alloc_kernel(&init_mm, pmd, address); + pte_t * pte = pte_alloc_kernel(&init_mm, pmd, base + address); if (!pte) return -ENOMEM; if (map_area_pte(pte, address, end - address, prot, pages)) -- 2.53.0