Commit c19c03fc749147f565e807fa65f1729066800571

Authored by Benjamin Herrenschmidt
Committed by Paul Mackerras
1 parent 3c8c90ab88

[POWERPC] unmap_vm_area becomes unmap_kernel_range for the public

This makes unmap_vm_area static and a wrapper around a new
exported unmap_kernel_range that takes an explicit range instead
of a vm_area struct.

This makes it more versatile for code that wants to play with kernel
page tables outside of the standard vmalloc area.

(One example is some rework of the PowerPC PCI IO space mapping
code that depends on that patch and removes some code duplication
and horrible abuse of forged struct vm_struct).

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>

Showing 5 changed files with 14 additions and 8 deletions Side-by-side Diff

Documentation/cachetlb.txt
... ... @@ -253,7 +253,7 @@
253 253  
254 254 The first of these two routines is invoked after map_vm_area()
255 255 has installed the page table entries. The second is invoked
256   - before unmap_vm_area() deletes the page table entries.
  256 + before unmap_kernel_range() deletes the page table entries.
257 257  
258 258 There exists another whole class of cpu cache issues which currently
259 259 require a whole different set of interfaces to handle properly.
arch/powerpc/mm/imalloc.c
... ... @@ -301,7 +301,8 @@
301 301 for (p = &imlist ; (tmp = *p) ; p = &tmp->next) {
302 302 if (tmp->addr == addr) {
303 303 *p = tmp->next;
304   - unmap_vm_area(tmp);
  304 + unmap_kernel_range((unsigned long)tmp->addr,
  305 + tmp->size);
305 306 kfree(tmp);
306 307 mutex_unlock(&imlist_mutex);
307 308 return;
arch/powerpc/mm/pgtable_64.c
... ... @@ -240,7 +240,6 @@
240 240 /*
241 241 * Unmap an IO region and remove it from imalloc'd list.
242 242 * Access to IO memory should be serialized by driver.
243   - * This code is modeled after vmalloc code - unmap_vm_area()
244 243 *
245 244 * XXX what about calls before mem_init_done (ie python_countermeasures())
246 245 */
include/linux/vmalloc.h
... ... @@ -65,9 +65,10 @@
65 65 unsigned long flags, int node,
66 66 gfp_t gfp_mask);
67 67 extern struct vm_struct *remove_vm_area(void *addr);
  68 +
68 69 extern int map_vm_area(struct vm_struct *area, pgprot_t prot,
69 70 struct page ***pages);
70   -extern void unmap_vm_area(struct vm_struct *area);
  71 +extern void unmap_kernel_range(unsigned long addr, unsigned long size);
71 72  
72 73 /*
73 74 * Internals. Dont't use..
... ... @@ -68,12 +68,12 @@
68 68 } while (pud++, addr = next, addr != end);
69 69 }
70 70  
71   -void unmap_vm_area(struct vm_struct *area)
  71 +void unmap_kernel_range(unsigned long addr, unsigned long size)
72 72 {
73 73 pgd_t *pgd;
74 74 unsigned long next;
75   - unsigned long addr = (unsigned long) area->addr;
76   - unsigned long end = addr + area->size;
  75 + unsigned long start = addr;
  76 + unsigned long end = addr + size;
77 77  
78 78 BUG_ON(addr >= end);
79 79 pgd = pgd_offset_k(addr);
... ... @@ -84,7 +84,12 @@
84 84 continue;
85 85 vunmap_pud_range(pgd, addr, next);
86 86 } while (pgd++, addr = next, addr != end);
87   - flush_tlb_kernel_range((unsigned long) area->addr, end);
  87 + flush_tlb_kernel_range(start, end);
  88 +}
  89 +
  90 +static void unmap_vm_area(struct vm_struct *area)
  91 +{
  92 + unmap_kernel_range((unsigned long)area->addr, area->size);
88 93 }
89 94  
90 95 static int vmap_pte_range(pmd_t *pmd, unsigned long addr,