aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordavem <davem>2001-12-21 04:56:14 +0000
committerdavem <davem>2001-12-21 04:56:14 +0000
commit4ee49e4f91287acb8738fbcb02e8b8e7a9d3893a (patch)
tree1dab87c0766f0eb870ead33e77d7f34aaef32938
parent47a8a4d4fcd4ca3144da4d92a9f53f97de27113b (diff)
downloadnetdev-vger-cvs-4ee49e4f91287acb8738fbcb02e8b8e7a9d3893a.tar.gz
Make flush_{tlb,cache}_range() take a
vm_area_struct instead of an mm_struct. Update all callers and documentation. On sparc64, when we are unmapping a SHARED+WRITABLE mapping call flush_dcache_page on all cpus for dirty pages mapped into that area.
-rw-r--r--Documentation/cachetlb.txt22
-rw-r--r--arch/alpha/kernel/smp.c4
-rw-r--r--arch/arm/kernel/ecard.c8
-rw-r--r--arch/cris/mm/tlb.c3
-rw-r--r--arch/i386/kernel/pci-i386.c2
-rw-r--r--arch/ia64/kernel/pci.c2
-rw-r--r--arch/ia64/kernel/perfmon.c32
-rw-r--r--arch/ia64/mm/tlb.c3
-rw-r--r--arch/mips/mm/andes.c4
-rw-r--r--arch/mips/mm/loadmmu.c2
-rw-r--r--arch/mips/mm/mips32.c11
-rw-r--r--arch/mips/mm/r2300.c12
-rw-r--r--arch/mips/mm/r4xx0.c49
-rw-r--r--arch/mips/mm/r5432.c4
-rw-r--r--arch/mips/mm/rm7k.c2
-rw-r--r--arch/mips/mm/sb1.c2
-rw-r--r--arch/mips/mm/umap.c12
-rw-r--r--arch/mips64/kernel/smp.c6
-rw-r--r--arch/mips64/mm/andes.c4
-rw-r--r--arch/mips64/mm/loadmmu.c4
-rw-r--r--arch/mips64/mm/r4xx0.c61
-rw-r--r--arch/mips64/mm/umap.c12
-rw-r--r--arch/parisc/mm/kmap.c4
-rw-r--r--arch/parisc/mm/pa11.c6
-rw-r--r--arch/parisc/mm/pa20.c6
-rw-r--r--arch/ppc/kernel/pci.c2
-rw-r--r--arch/ppc/mm/tlb.c19
-rw-r--r--arch/sh/mm/cache-sh4.c2
-rw-r--r--arch/sh/mm/fault.c4
-rw-r--r--arch/sparc/kernel/smp.c20
-rw-r--r--arch/sparc/mm/generic.c10
-rw-r--r--arch/sparc/mm/hypersparc.S4
-rw-r--r--arch/sparc/mm/srmmu.c34
-rw-r--r--arch/sparc/mm/sun4c.c14
-rw-r--r--arch/sparc/mm/swift.S5
-rw-r--r--arch/sparc/mm/tsunami.S7
-rw-r--r--arch/sparc/mm/viking.S6
-rw-r--r--arch/sparc64/kernel/pci.c6
-rw-r--r--arch/sparc64/kernel/smp.c37
-rw-r--r--arch/sparc64/kernel/sparc64_ksyms.c4
-rw-r--r--arch/sparc64/kernel/sys_sparc.c20
-rw-r--r--arch/sparc64/mm/generic.c10
-rw-r--r--arch/sparc64/mm/init.c78
-rw-r--r--drivers/char/agp/agpgart_fe.c4
-rw-r--r--drivers/char/drm/drm_vm.h4
-rw-r--r--drivers/char/drm/i810_dma.c2
-rw-r--r--drivers/char/ftape/lowlevel/ftape-ctl.c2
-rw-r--r--drivers/char/mem.c8
-rw-r--r--drivers/ieee1394/video1394.c6
-rw-r--r--drivers/media/video/bttv-driver.c8
-rw-r--r--drivers/media/video/cpia.c4
-rw-r--r--drivers/media/video/meye.c4
-rw-r--r--drivers/media/video/planb.c4
-rw-r--r--drivers/media/video/videodev.c2
-rw-r--r--drivers/media/video/zr36067.c10
-rw-r--r--drivers/media/video/zr36120.c4
-rw-r--r--drivers/pcmcia/hd64465_ss.c4
-rw-r--r--drivers/sbus/char/flash.c4
-rw-r--r--drivers/sbus/char/vfc_dev.c2
-rw-r--r--drivers/sgi/char/graphics.c4
-rw-r--r--drivers/sgi/char/shmiq.c2
-rw-r--r--drivers/sound/cmpci.c2
-rw-r--r--drivers/sound/cs4281/cs4281m.c2
-rw-r--r--drivers/sound/cs46xx.c2
-rw-r--r--drivers/sound/es1370.c4
-rw-r--r--drivers/sound/es1371.c4
-rw-r--r--drivers/sound/esssolo1.c2
-rw-r--r--drivers/sound/i810_audio.c2
-rw-r--r--drivers/sound/ite8172.c2
-rw-r--r--drivers/sound/maestro.c2
-rw-r--r--drivers/sound/maestro3.c2
-rw-r--r--drivers/sound/rme96xx.c4
-rw-r--r--drivers/sound/sonicvibes.c2
-rw-r--r--drivers/sound/soundcard.c2
-rw-r--r--drivers/sound/trident.c2
-rw-r--r--drivers/sound/ymfpci.c2
-rw-r--r--drivers/usb/audio.c6
-rw-r--r--drivers/usb/ov511.c4
-rw-r--r--drivers/usb/pwc-if.c6
-rw-r--r--drivers/usb/se401.c4
-rw-r--r--drivers/usb/usbvideo.c4
-rw-r--r--drivers/usb/usbvideo.h2
-rw-r--r--drivers/video/acornfb.c2
-rw-r--r--drivers/video/aty/atyfb_base.c2
-rw-r--r--drivers/video/controlfb.c2
-rw-r--r--drivers/video/fbmem.c4
-rw-r--r--drivers/video/igafb.c2
-rw-r--r--drivers/video/sbusfb.c2
-rw-r--r--drivers/video/sgivwfb.c2
-rw-r--r--drivers/video/sis/sis_main.c2
-rw-r--r--include/asm-alpha/pgalloc.h8
-rw-r--r--include/asm-alpha/pgtable.h4
-rw-r--r--include/asm-arm/io.h4
-rw-r--r--include/asm-arm/proc-armo/cache.h8
-rw-r--r--include/asm-arm/proc-armv/cache.h10
-rw-r--r--include/asm-cris/pgtable.h6
-rw-r--r--include/asm-generic/tlb.h17
-rw-r--r--include/asm-i386/pgalloc.h10
-rw-r--r--include/asm-i386/pgtable.h2
-rw-r--r--include/asm-ia64/pgalloc.h11
-rw-r--r--include/asm-m68k/motorola_pgalloc.h4
-rw-r--r--include/asm-m68k/pgalloc.h4
-rw-r--r--include/asm-m68k/sun3_pgalloc.h3
-rw-r--r--include/asm-mips/gfx.h4
-rw-r--r--include/asm-mips/pgalloc.h6
-rw-r--r--include/asm-mips/pgtable.h6
-rw-r--r--include/asm-mips/umap.h2
-rw-r--r--include/asm-mips64/gfx.h4
-rw-r--r--include/asm-mips64/pgalloc.h10
-rw-r--r--include/asm-mips64/pgtable.h8
-rw-r--r--include/asm-parisc/pgalloc.h6
-rw-r--r--include/asm-parisc/pgtable.h4
-rw-r--r--include/asm-ppc/pgtable.h8
-rw-r--r--include/asm-s390/pgalloc.h8
-rw-r--r--include/asm-s390/pgtable.h2
-rw-r--r--include/asm-s390x/pgalloc.h8
-rw-r--r--include/asm-s390x/pgtable.h2
-rw-r--r--include/asm-sh/pgalloc.h4
-rw-r--r--include/asm-sh/pgtable.h6
-rw-r--r--include/asm-sparc/pgalloc.h22
-rw-r--r--include/asm-sparc/pgtable.h4
-rw-r--r--include/asm-sparc64/pgalloc.h29
-rw-r--r--include/asm-sparc64/pgtable.h4
-rw-r--r--include/linux/mm.h6
-rw-r--r--include/linux/videodev.h3
-rw-r--r--mm/filemap.c6
-rw-r--r--mm/memory.c28
-rw-r--r--mm/mmap.c6
-rw-r--r--mm/mprotect.c8
-rw-r--r--mm/mremap.c13
-rw-r--r--net/packet/af_packet.c4
131 files changed, 600 insertions, 429 deletions
diff --git a/Documentation/cachetlb.txt b/Documentation/cachetlb.txt
index 3e6d60be9..8852c5449 100644
--- a/Documentation/cachetlb.txt
+++ b/Documentation/cachetlb.txt
@@ -49,17 +49,18 @@ changes occur:
page table operations such as what happens during
fork, and exec.
-3) void flush_tlb_range(struct mm_struct *mm,
+3) void flush_tlb_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end)
Here we are flushing a specific range of (user) virtual
address translations from the TLB. After running, this
interface must make sure that any previous page table
- modifications for the address space 'mm' in the range 'start'
- to 'end' will be visible to the cpu. That is, after running,
- there will be no entries in the TLB for 'mm' for virtual
- addresses in the range 'start' to 'end'.
+ modifications for the address space 'vma->vm_mm' in the range
+ 'start' to 'end' will be visible to the cpu. That is, after
+ running, here will be no entries in the TLB for 'mm' for
+ virtual addresses in the range 'start' to 'end'.
+ The "vma" is the backing store being used for the region.
Primarily, this is used for munmap() type operations.
The interface is provided in hopes that the port can find
@@ -130,9 +131,9 @@ the sequence will be in one of the following forms:
change_all_page_tables_of(mm);
flush_tlb_mm(mm);
- 2) flush_cache_range(mm, start, end);
+ 2) flush_cache_range(vma, start, end);
change_range_of_page_tables(mm, start, end);
- flush_tlb_range(mm, start, end);
+ flush_tlb_range(vma, start, end);
3) flush_cache_page(vma, page);
set_pte(pte_pointer, new_pte_val);
@@ -173,14 +174,15 @@ Here are the routines, one by one:
page table operations such as what happens during
fork, exit, and exec.
-3) void flush_cache_range(struct mm_struct *mm,
+3) void flush_cache_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end)
Here we are flushing a specific range of (user) virtual
addresses from the cache. After running, there will be no
- entries in the cache for 'mm' for virtual addresses in the
- range 'start' to 'end'.
+ entries in the cache for 'vma->vm_mm' for virtual addresses in
+ the range 'start' to 'end'.
+ The "vma" is the backing store being used for the region.
Primarily, this is used for munmap() type operations.
The interface is provided in hopes that the port can find
diff --git a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c
index 803397aaa..33348595e 100644
--- a/arch/alpha/kernel/smp.c
+++ b/arch/alpha/kernel/smp.c
@@ -1048,10 +1048,10 @@ flush_tlb_page(struct vm_area_struct *vma, unsigned long addr)
}
void
-flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end)
+flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
{
/* On the Alpha we always flush the whole user tlb. */
- flush_tlb_mm(mm);
+ flush_tlb_mm(vma->vm_mm);
}
static void
diff --git a/arch/arm/kernel/ecard.c b/arch/arm/kernel/ecard.c
index 614118d3d..c60ca78c6 100644
--- a/arch/arm/kernel/ecard.c
+++ b/arch/arm/kernel/ecard.c
@@ -243,6 +243,8 @@ static DECLARE_COMPLETION(ecard_completion);
*/
static void ecard_init_pgtables(struct mm_struct *mm)
{
+ struct vm_area_struct vma;
+
/* We want to set up the page tables for the following mapping:
* Virtual Physical
* 0x03000000 0x03000000
@@ -274,8 +276,10 @@ static void ecard_init_pgtables(struct mm_struct *mm)
dst_addr += PGDIR_SIZE;
}
- flush_tlb_range(mm, IO_START, IO_START + IO_SIZE);
- flush_tlb_range(mm, EASI_START, EASI_START + EASI_SIZE);
+ vma.vm_mm = mm;
+
+ flush_tlb_range(&vma, IO_START, IO_START + IO_SIZE);
+ flush_tlb_range(&vma, EASI_START, EASI_START + EASI_SIZE);
}
static int ecard_init_mm(void)
diff --git a/arch/cris/mm/tlb.c b/arch/cris/mm/tlb.c
index 846b5571a..9d5e588d8 100644
--- a/arch/cris/mm/tlb.c
+++ b/arch/cris/mm/tlb.c
@@ -159,10 +159,11 @@ flush_tlb_page(struct vm_area_struct *vma,
/* invalidate a page range */
void
-flush_tlb_range(struct mm_struct *mm,
+flush_tlb_range(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
int page_id = mm->context;
int i;
unsigned long flags;
diff --git a/arch/i386/kernel/pci-i386.c b/arch/i386/kernel/pci-i386.c
index 389c2d0cb..91c001e80 100644
--- a/arch/i386/kernel/pci-i386.c
+++ b/arch/i386/kernel/pci-i386.c
@@ -375,7 +375,7 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
/* Write-combine setting is ignored, it is changed via the mtrr
* interfaces on this platform.
*/
- if (remap_page_range(vma->vm_start, vma->vm_pgoff << PAGE_SHIFT,
+ if (remap_page_range(vma, vma->vm_start, vma->vm_pgoff << PAGE_SHIFT,
vma->vm_end - vma->vm_start,
vma->vm_page_prot))
return -EAGAIN;
diff --git a/arch/ia64/kernel/pci.c b/arch/ia64/kernel/pci.c
index fb2434023..7f44f62f4 100644
--- a/arch/ia64/kernel/pci.c
+++ b/arch/ia64/kernel/pci.c
@@ -232,7 +232,7 @@ pci_mmap_page_range (struct pci_dev *dev, struct vm_area_struct *vma,
else
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
- if (remap_page_range(vma->vm_start, vma->vm_pgoff << PAGE_SHIFT,
+ if (remap_page_range(vma, vma->vm_start, vma->vm_pgoff << PAGE_SHIFT,
vma->vm_end - vma->vm_start,
vma->vm_page_prot))
return -EAGAIN;
diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c
index 272d4a164..08bb6b7c6 100644
--- a/arch/ia64/kernel/perfmon.c
+++ b/arch/ia64/kernel/perfmon.c
@@ -430,14 +430,14 @@ pfm_context_free(pfm_context_t *pfc)
}
static int
-pfm_remap_buffer(unsigned long buf, unsigned long addr, unsigned long size)
+pfm_remap_buffer(struct vm_area_struct *vma, unsigned long buf, unsigned long addr, unsigned long size)
{
unsigned long page;
while (size > 0) {
page = kvirt_to_pa(buf);
- if (remap_page_range(addr, page, PAGE_SIZE, PAGE_SHARED)) return -ENOMEM;
+ if (remap_page_range(vma, addr, page, PAGE_SIZE, PAGE_SHARED)) return -ENOMEM;
addr += PAGE_SIZE;
buf += PAGE_SIZE;
@@ -502,13 +502,26 @@ pfm_smpl_buffer_alloc(pfm_context_t *ctx, unsigned long which_pmds, unsigned lon
vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
if (!vma) goto no_vma;
+ /*
+ * initialize the vma for the sampling buffer
+ */
+ vma->vm_mm = mm;
+ vma->vm_start = addr;
+ vma->vm_end = addr + size;
+ vma->vm_flags = VM_READ|VM_MAYREAD;
+ vma->vm_page_prot = PAGE_READONLY; /* XXX may need to change */
+ vma->vm_ops = NULL;
+ vma->vm_pgoff = 0;
+ vma->vm_file = NULL;
+ vma->vm_raend = 0;
+
/* XXX: see rvmalloc() for page alignment problem */
smpl_buf = rvmalloc(size);
if (smpl_buf == NULL) goto no_buffer;
DBprintk((" smpl_buf @%p\n", smpl_buf));
- if (pfm_remap_buffer((unsigned long)smpl_buf, addr, size)) goto cant_remap;
+ if (pfm_remap_buffer(vma, (unsigned long)smpl_buf, addr, size)) goto cant_remap;
/* allocate sampling buffer descriptor now */
psb = vmalloc(sizeof(*psb));
@@ -540,19 +553,6 @@ pfm_smpl_buffer_alloc(pfm_context_t *ctx, unsigned long which_pmds, unsigned lon
/* link to perfmon context */
ctx->ctx_smpl_buf = psb;
- /*
- * initialize the vma for the sampling buffer
- */
- vma->vm_mm = mm;
- vma->vm_start = addr;
- vma->vm_end = addr + size;
- vma->vm_flags = VM_READ|VM_MAYREAD;
- vma->vm_page_prot = PAGE_READONLY; /* XXX may need to change */
- vma->vm_ops = NULL;
- vma->vm_pgoff = 0;
- vma->vm_file = NULL;
- vma->vm_raend = 0;
-
vma->vm_private_data = ctx; /* link to pfm_context(not yet used) */
/*
diff --git a/arch/ia64/mm/tlb.c b/arch/ia64/mm/tlb.c
index d6e042017..3a3169cab 100644
--- a/arch/ia64/mm/tlb.c
+++ b/arch/ia64/mm/tlb.c
@@ -125,8 +125,9 @@ __flush_tlb_all (void)
}
void
-flush_tlb_range (struct mm_struct *mm, unsigned long start, unsigned long end)
+flush_tlb_range (struct vm_area_struct *vma, unsigned long start, unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
unsigned long size = end - start;
unsigned long nbits;
diff --git a/arch/mips/mm/andes.c b/arch/mips/mm/andes.c
index f2e70bce6..65725ef4f 100644
--- a/arch/mips/mm/andes.c
+++ b/arch/mips/mm/andes.c
@@ -101,7 +101,7 @@ static void andes_flush_cache_mm(struct mm_struct *mm)
/* XXX */
}
-static void andes_flush_cache_range(struct mm_struct *mm,
+static void andes_flush_cache_range(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
@@ -147,7 +147,7 @@ void flush_tlb_mm(struct mm_struct *mm)
/* XXX */
}
-void flush_tlb_range(struct mm_struct *mm, unsigned long start,
+void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end)
{
/* XXX */
diff --git a/arch/mips/mm/loadmmu.c b/arch/mips/mm/loadmmu.c
index 0a754c46d..c0b3d080c 100644
--- a/arch/mips/mm/loadmmu.c
+++ b/arch/mips/mm/loadmmu.c
@@ -25,7 +25,7 @@ void (*_copy_page)(void * to, void * from);
void (*_flush_cache_all)(void);
void (*___flush_cache_all)(void);
void (*_flush_cache_mm)(struct mm_struct *mm);
-void (*_flush_cache_range)(struct mm_struct *mm, unsigned long start,
+void (*_flush_cache_range)(struct vm_area_struct *vma, unsigned long start,
unsigned long end);
void (*_flush_cache_page)(struct vm_area_struct *vma, unsigned long page);
void (*_flush_cache_sigtramp)(unsigned long addr);
diff --git a/arch/mips/mm/mips32.c b/arch/mips/mm/mips32.c
index 4e16f4b4a..ba4e5dc12 100644
--- a/arch/mips/mm/mips32.c
+++ b/arch/mips/mm/mips32.c
@@ -176,11 +176,11 @@ static inline void mips32_flush_cache_all_pc(void)
}
static void
-mips32_flush_cache_range_sc(struct mm_struct *mm,
+mips32_flush_cache_range_sc(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
- struct vm_area_struct *vma;
+ struct mm_struct *mm = vma->vm_mm;
unsigned long flags;
if(mm->context == 0)
@@ -190,8 +190,7 @@ mips32_flush_cache_range_sc(struct mm_struct *mm,
#ifdef DEBUG_CACHE
printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
#endif
- vma = find_vma(mm, start);
- if(vma) {
+ if (vma) {
if(mm->context != current->mm->context) {
mips32_flush_cache_all_sc();
} else {
@@ -214,10 +213,12 @@ mips32_flush_cache_range_sc(struct mm_struct *mm,
}
}
-static void mips32_flush_cache_range_pc(struct mm_struct *mm,
+static void mips32_flush_cache_range_pc(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
+
if(mm->context != 0) {
unsigned long flags;
diff --git a/arch/mips/mm/r2300.c b/arch/mips/mm/r2300.c
index f1244c655..055a86a8b 100644
--- a/arch/mips/mm/r2300.c
+++ b/arch/mips/mm/r2300.c
@@ -336,10 +336,10 @@ static void r3k_flush_cache_mm(struct mm_struct *mm)
}
}
-static void r3k_flush_cache_range(struct mm_struct *mm, unsigned long start,
+static void r3k_flush_cache_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end)
{
- struct vm_area_struct *vma;
+ struct mm_struct *mm = vma->vm_mm;
if (mm->context == 0)
return;
@@ -348,10 +348,6 @@ static void r3k_flush_cache_range(struct mm_struct *mm, unsigned long start,
#ifdef DEBUG_CACHE
printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
#endif
- vma = find_vma(mm, start);
- if (!vma)
- return;
-
if (mm->context != current->active_mm->context) {
flush_cache_all();
} else {
@@ -485,9 +481,11 @@ void flush_tlb_mm(struct mm_struct *mm)
}
}
-void flush_tlb_range(struct mm_struct *mm, unsigned long start,
+void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
+
if (mm->context != 0) {
unsigned long flags;
int size;
diff --git a/arch/mips/mm/r4xx0.c b/arch/mips/mm/r4xx0.c
index 30f94d6e5..4976b0351 100644
--- a/arch/mips/mm/r4xx0.c
+++ b/arch/mips/mm/r4xx0.c
@@ -989,11 +989,11 @@ static inline void r4k_flush_cache_all_d32i32(void)
}
static void
-r4k_flush_cache_range_s16d16i16(struct mm_struct *mm,
+r4k_flush_cache_range_s16d16i16(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
- struct vm_area_struct *vma;
+ struct mm_struct *mm = vma->vm_mm;
unsigned long flags;
if (mm->context == 0)
@@ -1003,7 +1003,6 @@ r4k_flush_cache_range_s16d16i16(struct mm_struct *mm,
#ifdef DEBUG_CACHE
printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
#endif
- vma = find_vma(mm, start);
if (vma) {
if (mm->context != current->active_mm->context) {
r4k_flush_cache_all_s16d16i16();
@@ -1028,11 +1027,11 @@ r4k_flush_cache_range_s16d16i16(struct mm_struct *mm,
}
static void
-r4k_flush_cache_range_s32d16i16(struct mm_struct *mm,
+r4k_flush_cache_range_s32d16i16(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
- struct vm_area_struct *vma;
+ struct mm_struct *mm = vma->vm_mm;
unsigned long flags;
if (mm->context == 0)
@@ -1042,7 +1041,6 @@ r4k_flush_cache_range_s32d16i16(struct mm_struct *mm,
#ifdef DEBUG_CACHE
printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
#endif
- vma = find_vma(mm, start);
if (vma) {
if (mm->context != current->active_mm->context) {
r4k_flush_cache_all_s32d16i16();
@@ -1066,11 +1064,11 @@ r4k_flush_cache_range_s32d16i16(struct mm_struct *mm,
}
}
-static void r4k_flush_cache_range_s64d16i16(struct mm_struct *mm,
+static void r4k_flush_cache_range_s64d16i16(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
- struct vm_area_struct *vma;
+ struct mm_struct *mm = vma->vm_mm;
unsigned long flags;
if (mm->context == 0)
@@ -1080,7 +1078,6 @@ static void r4k_flush_cache_range_s64d16i16(struct mm_struct *mm,
#ifdef DEBUG_CACHE
printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
#endif
- vma = find_vma(mm, start);
if(vma) {
if (mm->context != current->active_mm->context) {
r4k_flush_cache_all_s64d16i16();
@@ -1104,11 +1101,11 @@ static void r4k_flush_cache_range_s64d16i16(struct mm_struct *mm,
}
}
-static void r4k_flush_cache_range_s128d16i16(struct mm_struct *mm,
+static void r4k_flush_cache_range_s128d16i16(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
- struct vm_area_struct *vma;
+ struct mm_struct *mm = vma->vm_mm;
unsigned long flags;
if (mm->context == 0)
@@ -1118,7 +1115,6 @@ static void r4k_flush_cache_range_s128d16i16(struct mm_struct *mm,
#ifdef DEBUG_CACHE
printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
#endif
- vma = find_vma(mm, start);
if (vma) {
if (mm->context != current->active_mm->context) {
r4k_flush_cache_all_s128d16i16();
@@ -1142,11 +1138,11 @@ static void r4k_flush_cache_range_s128d16i16(struct mm_struct *mm,
}
}
-static void r4k_flush_cache_range_s32d32i32(struct mm_struct *mm,
+static void r4k_flush_cache_range_s32d32i32(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
- struct vm_area_struct *vma;
+ struct mm_struct *mm = vma->vm_mm;
unsigned long flags;
if (mm->context == 0)
@@ -1156,7 +1152,6 @@ static void r4k_flush_cache_range_s32d32i32(struct mm_struct *mm,
#ifdef DEBUG_CACHE
printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
#endif
- vma = find_vma(mm, start);
if (vma) {
if (mm->context != current->active_mm->context) {
r4k_flush_cache_all_s32d32i32();
@@ -1180,11 +1175,11 @@ static void r4k_flush_cache_range_s32d32i32(struct mm_struct *mm,
}
}
-static void r4k_flush_cache_range_s64d32i32(struct mm_struct *mm,
+static void r4k_flush_cache_range_s64d32i32(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
- struct vm_area_struct *vma;
+ struct mm_struct *mm = vma->vm_mm;
unsigned long flags;
if (mm->context == 0)
@@ -1194,7 +1189,6 @@ static void r4k_flush_cache_range_s64d32i32(struct mm_struct *mm,
#ifdef DEBUG_CACHE
printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
#endif
- vma = find_vma(mm, start);
if (vma) {
if (mm->context != current->active_mm->context) {
r4k_flush_cache_all_s64d32i32();
@@ -1218,11 +1212,11 @@ static void r4k_flush_cache_range_s64d32i32(struct mm_struct *mm,
}
}
-static void r4k_flush_cache_range_s128d32i32(struct mm_struct *mm,
+static void r4k_flush_cache_range_s128d32i32(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
- struct vm_area_struct *vma;
+ struct mm_struct *mm = vma->vm_mm;
unsigned long flags;
if (mm->context == 0)
@@ -1232,7 +1226,6 @@ static void r4k_flush_cache_range_s128d32i32(struct mm_struct *mm,
#ifdef DEBUG_CACHE
printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
#endif
- vma = find_vma(mm, start);
if (vma) {
if (mm->context != current->active_mm->context) {
r4k_flush_cache_all_s128d32i32();
@@ -1256,10 +1249,12 @@ static void r4k_flush_cache_range_s128d32i32(struct mm_struct *mm,
}
}
-static void r4k_flush_cache_range_d16i16(struct mm_struct *mm,
+static void r4k_flush_cache_range_d16i16(struct mm_struct *vma,
unsigned long start,
unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
+
if (mm->context != 0) {
unsigned long flags;
@@ -1272,10 +1267,12 @@ static void r4k_flush_cache_range_d16i16(struct mm_struct *mm,
}
}
-static void r4k_flush_cache_range_d32i32(struct mm_struct *mm,
+static void r4k_flush_cache_range_d32i32(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
+
if (mm->context != 0) {
unsigned long flags;
@@ -2160,10 +2157,12 @@ void flush_tlb_mm(struct mm_struct *mm)
}
}
-void flush_tlb_range(struct mm_struct *mm, unsigned long start,
+void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end)
{
- if(mm->context != 0) {
+ struct mm_struct *mm = vma->vm_mm;
+
+ if (mm->context != 0) {
unsigned long flags;
int size;
diff --git a/arch/mips/mm/r5432.c b/arch/mips/mm/r5432.c
index b380ac3d5..d687ae987 100644
--- a/arch/mips/mm/r5432.c
+++ b/arch/mips/mm/r5432.c
@@ -366,10 +366,12 @@ static inline void r5432_flush_cache_all_d32i32(void)
blast_dcache32(); blast_icache32();
}
-static void r5432_flush_cache_range_d32i32(struct mm_struct *mm,
+static void r5432_flush_cache_range_d32i32(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
+
if (mm->context != 0) {
#ifdef DEBUG_CACHE
printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
diff --git a/arch/mips/mm/rm7k.c b/arch/mips/mm/rm7k.c
index 407e8a592..76b368d23 100644
--- a/arch/mips/mm/rm7k.c
+++ b/arch/mips/mm/rm7k.c
@@ -171,7 +171,7 @@ static inline void rm7k_flush_cache_all_d32i32(void)
/* Yes! Caches that don't suck ... */
}
-static void rm7k_flush_cache_range_d32i32(struct mm_struct *mm,
+static void rm7k_flush_cache_range_d32i32(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
diff --git a/arch/mips/mm/sb1.c b/arch/mips/mm/sb1.c
index a5df1956f..34bef7ba9 100644
--- a/arch/mips/mm/sb1.c
+++ b/arch/mips/mm/sb1.c
@@ -264,7 +264,7 @@ static void sb1_flush_cache_mm(struct mm_struct *mm)
/* Don't need to do this, as the dcache is physically tagged */
}
-static void sb1_flush_cache_range(struct mm_struct *mm,
+static void sb1_flush_cache_range(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
diff --git a/arch/mips/mm/umap.c b/arch/mips/mm/umap.c
index 100cb148d..8b9a4cac7 100644
--- a/arch/mips/mm/umap.c
+++ b/arch/mips/mm/umap.c
@@ -88,20 +88,20 @@ remove_mapping_pmd_range (pgd_t *pgd, unsigned long address, unsigned long size)
* range of active mappings at this point
*/
void
-remove_mapping (struct task_struct *task, unsigned long start, unsigned long end)
+remove_mapping (struct vm_area_struct *vma, struct task_struct *task, unsigned long start, unsigned long end)
{
unsigned long beg = start;
pgd_t *dir;
down_write (&task->mm->mmap_sem);
dir = pgd_offset (task->mm, start);
- flush_cache_range (task->mm, beg, end);
+ flush_cache_range (vma, beg, end);
while (start < end){
remove_mapping_pmd_range (dir, start, end - start);
start = (start + PGDIR_SIZE) & PGDIR_MASK;
dir++;
}
- flush_tlb_range (task->mm, beg, end);
+ flush_tlb_range (vma, beg, end);
up_write (&task->mm->mmap_sem);
}
@@ -192,7 +192,7 @@ vmap_pmd_range (pmd_t *pmd, unsigned long address, unsigned long size, unsigned
}
int
-vmap_page_range (unsigned long from, unsigned long size, unsigned long vaddr)
+vmap_page_range (struct vm_area_struct *vma, unsigned long from, unsigned long size, unsigned long vaddr)
{
int error = 0;
pgd_t * dir;
@@ -201,7 +201,7 @@ vmap_page_range (unsigned long from, unsigned long size, unsigned long vaddr)
vaddr -= from;
dir = pgd_offset(current->mm, from);
- flush_cache_range(current->mm, beg, end);
+ flush_cache_range(vma, beg, end);
while (from < end) {
pmd_t *pmd = pmd_alloc(current->mm, dir, from);
error = -ENOMEM;
@@ -213,6 +213,6 @@ vmap_page_range (unsigned long from, unsigned long size, unsigned long vaddr)
from = (from + PGDIR_SIZE) & PGDIR_MASK;
dir++;
}
- flush_tlb_range(current->mm, beg, end);
+ flush_tlb_range(vma, beg, end);
return error;
}
diff --git a/arch/mips64/kernel/smp.c b/arch/mips64/kernel/smp.c
index e18cf01e7..6d1855c8d 100644
--- a/arch/mips64/kernel/smp.c
+++ b/arch/mips64/kernel/smp.c
@@ -242,15 +242,15 @@ static void flush_tlb_range_ipi(void *info)
{
struct flush_tlb_data *fd = (struct flush_tlb_data *)info;
- _flush_tlb_range(fd->mm, fd->addr1, fd->addr2);
+ _flush_tlb_range(fd->vma, fd->addr1, fd->addr2);
}
-void flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end)
+void flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
{
if ((atomic_read(&mm->mm_users) != 1) || (current->mm != mm)) {
struct flush_tlb_data fd;
- fd.mm = mm;
+ fd.vma = vma;
fd.addr1 = start;
fd.addr2 = end;
smp_call_function(flush_tlb_range_ipi, (void *)&fd, 1, 1);
diff --git a/arch/mips64/mm/andes.c b/arch/mips64/mm/andes.c
index f9d3cc2c0..7f65ff0cd 100644
--- a/arch/mips64/mm/andes.c
+++ b/arch/mips64/mm/andes.c
@@ -179,9 +179,11 @@ static void andes_flush_tlb_mm(struct mm_struct *mm)
}
static void
-andes_flush_tlb_range(struct mm_struct *mm, unsigned long start,
+andes_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
+
if (CPU_CONTEXT(smp_processor_id(), mm) != 0) {
unsigned long flags;
int size;
diff --git a/arch/mips64/mm/loadmmu.c b/arch/mips64/mm/loadmmu.c
index 719926c5a..43d94b415 100644
--- a/arch/mips64/mm/loadmmu.c
+++ b/arch/mips64/mm/loadmmu.c
@@ -25,7 +25,7 @@ void (*_copy_page)(void * to, void * from);
/* Cache operations. */
void (*_flush_cache_mm)(struct mm_struct *mm);
-void (*_flush_cache_range)(struct mm_struct *mm, unsigned long start,
+void (*_flush_cache_range)(struct vm_area_struct *vma, unsigned long start,
unsigned long end);
void (*_flush_cache_page)(struct vm_area_struct *vma, unsigned long page);
void (*_flush_page_to_ram)(struct page * page);
@@ -44,7 +44,7 @@ void (*_dma_cache_inv)(unsigned long start, unsigned long size);
/* TLB operations. */
void (*_flush_tlb_all)(void);
void (*_flush_tlb_mm)(struct mm_struct *mm);
-void (*_flush_tlb_range)(struct mm_struct *mm, unsigned long start,
+void (*_flush_tlb_range)(struct vm_area_struct *vma, unsigned long start,
unsigned long end);
void (*_flush_tlb_page)(struct vm_area_struct *vma, unsigned long page);
diff --git a/arch/mips64/mm/r4xx0.c b/arch/mips64/mm/r4xx0.c
index 8338b520c..f5a2e54b8 100644
--- a/arch/mips64/mm/r4xx0.c
+++ b/arch/mips64/mm/r4xx0.c
@@ -776,11 +776,11 @@ static inline void r4k_flush_cache_all_d32i32(void)
__restore_flags(flags);
}
-static void r4k_flush_cache_range_s16d16i16(struct mm_struct *mm,
+static void r4k_flush_cache_range_s16d16i16(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
- struct vm_area_struct *vma;
+ struct mm_struct *mm = vma->vm_mm;
unsigned long flags;
if (CPU_CONTEXT(smp_processor_id(), mm) == 0)
@@ -790,8 +790,7 @@ static void r4k_flush_cache_range_s16d16i16(struct mm_struct *mm,
#ifdef DEBUG_CACHE
printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
#endif
- vma = find_vma(mm, start);
- if(vma) {
+ if (vma) {
if (CPU_CONTEXT(smp_processor_id(), mm) !=
CPU_CONTEXT(smp_processor_id(), current->mm)) {
r4k_flush_cache_all_s16d16i16();
@@ -815,11 +814,11 @@ static void r4k_flush_cache_range_s16d16i16(struct mm_struct *mm,
}
}
-static void r4k_flush_cache_range_s32d16i16(struct mm_struct *mm,
+static void r4k_flush_cache_range_s32d16i16(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
- struct vm_area_struct *vma;
+ struct mm_struct *mm = vma->vm_mm;
unsigned long flags;
if (CPU_CONTEXT(smp_processor_id(), mm) == 0)
@@ -829,8 +828,7 @@ static void r4k_flush_cache_range_s32d16i16(struct mm_struct *mm,
#ifdef DEBUG_CACHE
printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
#endif
- vma = find_vma(mm, start);
- if(vma) {
+ if (vma) {
if (CPU_CONTEXT(smp_processor_id(), mm) !=
CPU_CONTEXT(smp_processor_id(), current->mm)) {
r4k_flush_cache_all_s32d16i16();
@@ -854,11 +852,11 @@ static void r4k_flush_cache_range_s32d16i16(struct mm_struct *mm,
}
}
-static void r4k_flush_cache_range_s64d16i16(struct mm_struct *mm,
+static void r4k_flush_cache_range_s64d16i16(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
- struct vm_area_struct *vma;
+ struct mm_struct *mm = vma->vm_mm;
unsigned long flags;
if (CPU_CONTEXT(smp_processor_id(), mm) == 0)
@@ -868,8 +866,7 @@ static void r4k_flush_cache_range_s64d16i16(struct mm_struct *mm,
#ifdef DEBUG_CACHE
printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
#endif
- vma = find_vma(mm, start);
- if(vma) {
+ if (vma) {
if (CPU_CONTEXT(smp_processor_id(), mm) !=
CPU_CONTEXT(smp_processor_id(), current->mm)) {
r4k_flush_cache_all_s64d16i16();
@@ -893,11 +890,11 @@ static void r4k_flush_cache_range_s64d16i16(struct mm_struct *mm,
}
}
-static void r4k_flush_cache_range_s128d16i16(struct mm_struct *mm,
+static void r4k_flush_cache_range_s128d16i16(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
- struct vm_area_struct *vma;
+ struct mm_struct *mm = vma->vm_mm;
unsigned long flags;
if (CPU_CONTEXT(smp_processor_id(), mm) == 0)
@@ -907,8 +904,7 @@ static void r4k_flush_cache_range_s128d16i16(struct mm_struct *mm,
#ifdef DEBUG_CACHE
printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
#endif
- vma = find_vma(mm, start);
- if(vma) {
+ if (vma) {
if (CPU_CONTEXT(smp_processor_id(), mm) !=
CPU_CONTEXT(smp_processor_id(), current->mm)) {
r4k_flush_cache_all_s128d16i16();
@@ -932,11 +928,11 @@ static void r4k_flush_cache_range_s128d16i16(struct mm_struct *mm,
}
}
-static void r4k_flush_cache_range_s32d32i32(struct mm_struct *mm,
+static void r4k_flush_cache_range_s32d32i32(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
- struct vm_area_struct *vma;
+ struct mm_struct *mm = vma->vm_mm;
unsigned long flags;
if (CPU_CONTEXT(smp_processor_id(), mm) == 0)
@@ -946,8 +942,7 @@ static void r4k_flush_cache_range_s32d32i32(struct mm_struct *mm,
#ifdef DEBUG_CACHE
printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
#endif
- vma = find_vma(mm, start);
- if(vma) {
+ if (vma) {
if (CPU_CONTEXT(smp_processor_id(), mm) !=
CPU_CONTEXT(smp_processor_id(), current->mm)) {
r4k_flush_cache_all_s32d32i32();
@@ -971,11 +966,11 @@ static void r4k_flush_cache_range_s32d32i32(struct mm_struct *mm,
}
}
-static void r4k_flush_cache_range_s64d32i32(struct mm_struct *mm,
+static void r4k_flush_cache_range_s64d32i32(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
- struct vm_area_struct *vma;
+ struct mm_struct *mm = vma->vm_mm;
unsigned long flags;
if (CPU_CONTEXT(smp_processor_id(), mm) == 0)
@@ -985,8 +980,7 @@ static void r4k_flush_cache_range_s64d32i32(struct mm_struct *mm,
#ifdef DEBUG_CACHE
printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
#endif
- vma = find_vma(mm, start);
- if(vma) {
+ if (vma) {
if (CPU_CONTEXT(smp_processor_id(), mm) !=
CPU_CONTEXT(smp_processor_id(), current->mm)) {
r4k_flush_cache_all_s64d32i32();
@@ -1010,11 +1004,11 @@ static void r4k_flush_cache_range_s64d32i32(struct mm_struct *mm,
}
}
-static void r4k_flush_cache_range_s128d32i32(struct mm_struct *mm,
+static void r4k_flush_cache_range_s128d32i32(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
- struct vm_area_struct *vma;
+ struct mm_struct *mm = vma->vm_mm;
unsigned long flags;
if (CPU_CONTEXT(smp_processor_id(), mm) != 0)
@@ -1024,8 +1018,7 @@ static void r4k_flush_cache_range_s128d32i32(struct mm_struct *mm,
#ifdef DEBUG_CACHE
printk("crange[%d,%08lx,%08lx]", (int)mm->context, start, end);
#endif
- vma = find_vma(mm, start);
- if(vma) {
+ if (vma) {
if (CPU_CONTEXT(smp_processor_id(), mm) !=
CPU_CONTEXT(smp_processor_id(), current->mm)) {
r4k_flush_cache_all_s128d32i32();
@@ -1049,10 +1042,12 @@ static void r4k_flush_cache_range_s128d32i32(struct mm_struct *mm,
}
}
-static void r4k_flush_cache_range_d16i16(struct mm_struct *mm,
+static void r4k_flush_cache_range_d16i16(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
+
if (CPU_CONTEXT(smp_processor_id(), mm) != 0) {
unsigned long flags;
@@ -1065,10 +1060,12 @@ static void r4k_flush_cache_range_d16i16(struct mm_struct *mm,
}
}
-static void r4k_flush_cache_range_d32i32(struct mm_struct *mm,
+static void r4k_flush_cache_range_d32i32(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
+
if (CPU_CONTEXT(smp_processor_id(), mm) != 0) {
unsigned long flags;
@@ -1913,9 +1910,11 @@ static void r4k_flush_tlb_mm(struct mm_struct *mm)
}
}
-static void r4k_flush_tlb_range(struct mm_struct *mm, unsigned long start,
+static void r4k_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
+
if (CPU_CONTEXT(smp_processor_id(), mm) != 0) {
unsigned long flags;
int size;
diff --git a/arch/mips64/mm/umap.c b/arch/mips64/mm/umap.c
index 83106e800..4fdd3d240 100644
--- a/arch/mips64/mm/umap.c
+++ b/arch/mips64/mm/umap.c
@@ -86,7 +86,7 @@ static inline void remove_mapping_pmd_range (pgd_t *pgd, unsigned long address,
* This routine is called from the page fault handler to remove a
* range of active mappings at this point
*/
-void remove_mapping (struct task_struct *task, unsigned long start,
+void remove_mapping (struct vm_area_struct *vma, struct task_struct *task, unsigned long start,
unsigned long end)
{
unsigned long beg = start;
@@ -94,13 +94,13 @@ void remove_mapping (struct task_struct *task, unsigned long start,
down_write (&task->mm->mmap_sem);
dir = pgd_offset (task->mm, start);
- flush_cache_range (task->mm, beg, end);
+ flush_cache_range (vma, beg, end);
while (start < end){
remove_mapping_pmd_range (dir, start, end - start);
start = (start + PGDIR_SIZE) & PGDIR_MASK;
dir++;
}
- flush_tlb_range (task->mm, beg, end);
+ flush_tlb_range (vma, beg, end);
up_write (&task->mm->mmap_sem);
}
@@ -190,7 +190,7 @@ static inline int vmap_pmd_range (pmd_t *pmd, unsigned long address,
return 0;
}
-int vmap_page_range (unsigned long from, unsigned long size,
+int vmap_page_range (struct vm_area_struct *vma, unsigned long from, unsigned long size,
unsigned long vaddr)
{
int error = 0;
@@ -200,7 +200,7 @@ int vmap_page_range (unsigned long from, unsigned long size,
vaddr -= from;
dir = pgd_offset(current->mm, from);
- flush_cache_range(current->mm, beg, end);
+ flush_cache_range(vma, beg, end);
while (from < end) {
pmd_t *pmd = pmd_alloc(current->mm, dir, from);
error = -ENOMEM;
@@ -212,6 +212,6 @@ int vmap_page_range (unsigned long from, unsigned long size,
from = (from + PGDIR_SIZE) & PGDIR_MASK;
dir++;
}
- flush_tlb_range(current->mm, beg, end);
+ flush_tlb_range(vma, beg, end);
return error;
}
diff --git a/arch/parisc/mm/kmap.c b/arch/parisc/mm/kmap.c
index 4bd5dd4b4..b4da595b6 100644
--- a/arch/parisc/mm/kmap.c
+++ b/arch/parisc/mm/kmap.c
@@ -128,11 +128,11 @@ kernel_set_cachemode(unsigned long vaddr, unsigned long size, int what)
switch (what) {
case IOMAP_FULL_CACHING:
iterate_pages(vaddr, size, set_cached, 0);
- flush_tlb_range(&init_mm, vaddr, size);
+ flush_tlb_range(NULL, vaddr, size);
break;
case IOMAP_NOCACHE_SER:
iterate_pages(vaddr, size, set_uncached, 0);
- flush_tlb_range(&init_mm, vaddr, size);
+ flush_tlb_range(NULL, vaddr, size);
break;
default:
printk(KERN_CRIT
diff --git a/arch/parisc/mm/pa11.c b/arch/parisc/mm/pa11.c
index 0b2db6674..707a2405b 100644
--- a/arch/parisc/mm/pa11.c
+++ b/arch/parisc/mm/pa11.c
@@ -28,7 +28,7 @@ static void pa11_copy_page(unsigned long to, unsigned long from)
/* Cache operations. */
static inline void pa11_flush_cache_all(void) { }
static void pa11_flush_cache_mm(struct mm_struct *mm) { }
-static void pa11_flush_cache_range(struct mm_struct *mm,
+static void pa11_flush_cache_range(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
@@ -65,10 +65,10 @@ static void pa11_flush_tlb_mm(struct mm_struct *mm)
pa11_flush_tlb_all();
}
-static void pa11_flush_tlb_range(struct mm_struct *mm, unsigned long start,
+static void pa11_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end)
{
- if(mm == current->mm)
+ if (vma == NULL || vma->vm_mm == current->mm)
pa11_flush_tlb_all();
}
diff --git a/arch/parisc/mm/pa20.c b/arch/parisc/mm/pa20.c
index 069c916ca..1fd401ac1 100644
--- a/arch/parisc/mm/pa20.c
+++ b/arch/parisc/mm/pa20.c
@@ -28,7 +28,7 @@ static void pa20_copy_page(unsigned long to, unsigned long from)
/* Cache operations. */
static inline void pa20_flush_cache_all(void) { }
static void pa20_flush_cache_mm(struct mm_struct *mm) { }
-static void pa20_flush_cache_range(struct mm_struct *mm,
+static void pa20_flush_cache_range(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
@@ -65,10 +65,10 @@ static void pa20_flush_tlb_mm(struct mm_struct *mm)
pa20_flush_tlb_all();
}
-static void pa20_flush_tlb_range(struct mm_struct *mm, unsigned long start,
+static void pa20_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end)
{
- if(mm == current->mm)
+ if (vma == NULL || vma->vm_mm == current->mm)
pa20_flush_tlb_all();
}
diff --git a/arch/ppc/kernel/pci.c b/arch/ppc/kernel/pci.c
index 141fa9131..57c4223a4 100644
--- a/arch/ppc/kernel/pci.c
+++ b/arch/ppc/kernel/pci.c
@@ -1068,7 +1068,7 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
__pci_mmap_set_flags(dev, vma, mmap_state);
__pci_mmap_set_pgprot(dev, vma, mmap_state, write_combine);
- ret = remap_page_range(vma->vm_start, vma->vm_pgoff << PAGE_SHIFT,
+ ret = remap_page_range(vma, vma->vm_start, vma->vm_pgoff << PAGE_SHIFT,
vma->vm_end - vma->vm_start, vma->vm_page_prot);
return ret;
diff --git a/arch/ppc/mm/tlb.c b/arch/ppc/mm/tlb.c
index 229f95df4..fed74ef24 100644
--- a/arch/ppc/mm/tlb.c
+++ b/arch/ppc/mm/tlb.c
@@ -39,7 +39,7 @@
* - flush_tlb_all() flushes all processes TLBs
* - flush_tlb_mm(mm) flushes the specified mm context TLB's
* - flush_tlb_page(vma, vmaddr) flushes one page
- * - flush_tlb_range(mm, start, end) flushes a range of pages
+ * - flush_tlb_range(vma, start, end) flushes a range of pages
*
* since the hardware hash table functions as an extension of the
* tlb as far as the linux tables are concerned, flush it too.
@@ -53,6 +53,8 @@
void
local_flush_tlb_all(void)
{
+ struct vm_area_struct vma;
+
/* aargh!!! */
/*
* Just flush the kernel part of the address space, that's
@@ -61,7 +63,8 @@ local_flush_tlb_all(void)
* we can and should dispense with flush_tlb_all().
* -- paulus.
*/
- local_flush_tlb_range(&init_mm, TASK_SIZE, ~0UL);
+ vma.vm_mm = &init_mm;
+ local_flush_tlb_range(&vma, TASK_SIZE, ~0UL);
#ifdef CONFIG_SMP
smp_send_tlb_invalidate(0);
@@ -84,9 +87,12 @@ local_flush_tlb_mm(struct mm_struct *mm)
if (mm->map_count) {
struct vm_area_struct *mp;
for (mp = mm->mmap; mp != NULL; mp = mp->vm_next)
- local_flush_tlb_range(mm, mp->vm_start, mp->vm_end);
- } else
- local_flush_tlb_range(mm, 0, TASK_SIZE);
+ local_flush_tlb_range(mp, mp->vm_start, mp->vm_end);
+ } else {
+ struct vm_area_struct vma;
+ vma.vm_mm = mm;
+ local_flush_tlb_range(&vma, 0, TASK_SIZE);
+ }
#ifdef CONFIG_SMP
smp_send_tlb_invalidate(0);
@@ -123,8 +129,9 @@ local_flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr)
* the corresponding HPTE.
*/
void
-local_flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end)
+local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
pmd_t *pmd;
pte_t *pte;
unsigned long pmd_end;
diff --git a/arch/sh/mm/cache-sh4.c b/arch/sh/mm/cache-sh4.c
index fb0f32a52..4bc44fea4 100644
--- a/arch/sh/mm/cache-sh4.c
+++ b/arch/sh/mm/cache-sh4.c
@@ -295,7 +295,7 @@ void flush_cache_mm(struct mm_struct *mm)
* Flushing the cache lines for U0 only isn't enough.
* We need to flush for P1 too, which may contain aliases.
*/
-void flush_cache_range(struct mm_struct *mm, unsigned long start,
+void flush_cache_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end)
{
/*
diff --git a/arch/sh/mm/fault.c b/arch/sh/mm/fault.c
index 038736e0d..f26eb07a0 100644
--- a/arch/sh/mm/fault.c
+++ b/arch/sh/mm/fault.c
@@ -374,9 +374,11 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
}
}
-void flush_tlb_range(struct mm_struct *mm, unsigned long start,
+void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
+
if (mm->context != NO_CONTEXT) {
unsigned long flags;
int size;
diff --git a/arch/sparc/kernel/smp.c b/arch/sparc/kernel/smp.c
index bbe832d86..949bb208b 100644
--- a/arch/sparc/kernel/smp.c
+++ b/arch/sparc/kernel/smp.c
@@ -177,23 +177,27 @@ void smp_flush_tlb_mm(struct mm_struct *mm)
}
}
-void smp_flush_cache_range(struct mm_struct *mm, unsigned long start,
+void smp_flush_cache_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end)
{
- if(mm->context != NO_CONTEXT) {
+ struct mm_struct *mm = vma->vm_mm;
+
+ if (mm->context != NO_CONTEXT) {
if(mm->cpu_vm_mask != (1 << smp_processor_id()))
- xc3((smpfunc_t) BTFIXUP_CALL(local_flush_cache_range), (unsigned long) mm, start, end);
- local_flush_cache_range(mm, start, end);
+ xc3((smpfunc_t) BTFIXUP_CALL(local_flush_cache_range), (unsigned long) , start, end);
+ local_flush_cache_range(vma, start, end);
}
}
-void smp_flush_tlb_range(struct mm_struct *mm, unsigned long start,
+void smp_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end)
{
- if(mm->context != NO_CONTEXT) {
+ struct mm_struct *mm = vma->vm_mm;
+
+ if (mm->context != NO_CONTEXT) {
if(mm->cpu_vm_mask != (1 << smp_processor_id()))
- xc3((smpfunc_t) BTFIXUP_CALL(local_flush_tlb_range), (unsigned long) mm, start, end);
- local_flush_tlb_range(mm, start, end);
+ xc3((smpfunc_t) BTFIXUP_CALL(local_flush_tlb_range), (unsigned long) vma, start, end);
+ local_flush_tlb_range(vma, start, end);
}
}
diff --git a/arch/sparc/mm/generic.c b/arch/sparc/mm/generic.c
index d332ec769..a2bdd3262 100644
--- a/arch/sparc/mm/generic.c
+++ b/arch/sparc/mm/generic.c
@@ -1,4 +1,4 @@
-/* $Id: generic.c,v 1.13 2001-07-17 16:17:33 anton Exp $
+/* $Id: generic.c,v 1.14 2001-12-21 04:56:15 davem Exp $
* generic.c: Generic Sparc mm routines that are not dependent upon
* MMU type but are Sparc specific.
*
@@ -75,18 +75,18 @@ static inline int io_remap_pmd_range(pmd_t * pmd, unsigned long address, unsigne
return 0;
}
-int io_remap_page_range(unsigned long from, unsigned long offset, unsigned long size, pgprot_t prot, int space)
+int io_remap_page_range(struct vm_area_struct *vma, unsigned long from, unsigned long offset, unsigned long size, pgprot_t prot, int space)
{
int error = 0;
pgd_t * dir;
unsigned long beg = from;
unsigned long end = from + size;
- struct mm_struct *mm = current->mm;
+ struct mm_struct *mm = vma->vm_mm;
prot = __pgprot(pg_iobits);
offset -= from;
dir = pgd_offset(mm, from);
- flush_cache_range(mm, beg, end);
+ flush_cache_range(vma, beg, end);
spin_lock(&mm->page_table_lock);
while (from < end) {
@@ -102,6 +102,6 @@ int io_remap_page_range(unsigned long from, unsigned long offset, unsigned long
}
spin_unlock(&mm->page_table_lock);
- flush_tlb_range(current->mm, beg, end);
+ flush_tlb_range(vma, beg, end);
return error;
}
diff --git a/arch/sparc/mm/hypersparc.S b/arch/sparc/mm/hypersparc.S
index 7aa5ad048..d97210f03 100644
--- a/arch/sparc/mm/hypersparc.S
+++ b/arch/sparc/mm/hypersparc.S
@@ -1,4 +1,4 @@
-/* $Id: hypersparc.S,v 1.17 2000-07-16 21:48:52 anton Exp $
+/* $Id: hypersparc.S,v 1.18 2001-12-21 04:56:15 davem Exp $
* hypersparc.S: High speed Hypersparc mmu/cache operations.
*
* Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
@@ -74,6 +74,7 @@ hypersparc_flush_cache_mm_out:
/* The things we do for performance... */
hypersparc_flush_cache_range:
+ ld [%o0 + 0x0], %o0 /* XXX vma->vm_mm, GROSS XXX */
#ifndef CONFIG_SMP
ld [%o0 + AOFF_mm_context], %g1
cmp %g1, -1
@@ -283,6 +284,7 @@ hypersparc_flush_tlb_mm_out:
sta %g5, [%g1] ASI_M_MMUREGS
hypersparc_flush_tlb_range:
+ ld [%o0 + 0x00], %o0 /* XXX vma->vm_mm GROSS XXX */
mov SRMMU_CTX_REG, %g1
ld [%o0 + AOFF_mm_context], %o3
lda [%g1] ASI_M_MMUREGS, %g5
diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c
index f8583cb52..3cdac1049 100644
--- a/arch/sparc/mm/srmmu.c
+++ b/arch/sparc/mm/srmmu.c
@@ -1,4 +1,4 @@
-/* $Id: srmmu.c,v 1.233 2001-11-13 00:49:27 davem Exp $
+/* $Id: srmmu.c,v 1.234 2001-12-21 04:56:15 davem Exp $
* srmmu.c: SRMMU specific routines for memory management.
*
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
@@ -536,14 +536,14 @@ static void srmmu_get_task_struct(struct task_struct *tsk)
/* tsunami.S */
extern void tsunami_flush_cache_all(void);
extern void tsunami_flush_cache_mm(struct mm_struct *mm);
-extern void tsunami_flush_cache_range(struct mm_struct *mm, unsigned long start, unsigned long end);
+extern void tsunami_flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end);
extern void tsunami_flush_cache_page(struct vm_area_struct *vma, unsigned long page);
extern void tsunami_flush_page_to_ram(unsigned long page);
extern void tsunami_flush_page_for_dma(unsigned long page);
extern void tsunami_flush_sig_insns(struct mm_struct *mm, unsigned long insn_addr);
extern void tsunami_flush_tlb_all(void);
extern void tsunami_flush_tlb_mm(struct mm_struct *mm);
-extern void tsunami_flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end);
+extern void tsunami_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end);
extern void tsunami_flush_tlb_page(struct vm_area_struct *vma, unsigned long page);
extern void tsunami_setup_blockops(void);
@@ -582,7 +582,7 @@ static void swift_update_mmu_cache(struct vm_area_struct * vma, unsigned long ad
/* swift.S */
extern void swift_flush_cache_all(void);
extern void swift_flush_cache_mm(struct mm_struct *mm);
-extern void swift_flush_cache_range(struct mm_struct *mm,
+extern void swift_flush_cache_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end);
extern void swift_flush_cache_page(struct vm_area_struct *vma, unsigned long page);
extern void swift_flush_page_to_ram(unsigned long page);
@@ -590,7 +590,7 @@ extern void swift_flush_page_for_dma(unsigned long page);
extern void swift_flush_sig_insns(struct mm_struct *mm, unsigned long insn_addr);
extern void swift_flush_tlb_all(void);
extern void swift_flush_tlb_mm(struct mm_struct *mm);
-extern void swift_flush_tlb_range(struct mm_struct *mm,
+extern void swift_flush_tlb_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end);
extern void swift_flush_tlb_page(struct vm_area_struct *vma, unsigned long page);
@@ -686,8 +686,9 @@ static void cypress_flush_cache_mm(struct mm_struct *mm)
FLUSH_END
}
-static void cypress_flush_cache_range(struct mm_struct *mm, unsigned long start, unsigned long end)
+static void cypress_flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
register unsigned long a, b, c, d, e, f, g;
unsigned long flags, faddr;
int octx;
@@ -827,8 +828,9 @@ static void cypress_flush_tlb_mm(struct mm_struct *mm)
FLUSH_END
}
-static void cypress_flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end)
+static void cypress_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
unsigned long size;
FLUSH_BEGIN(mm)
@@ -870,7 +872,7 @@ static void cypress_flush_tlb_page(struct vm_area_struct *vma, unsigned long pag
/* viking.S */
extern void viking_flush_cache_all(void);
extern void viking_flush_cache_mm(struct mm_struct *mm);
-extern void viking_flush_cache_range(struct mm_struct *mm, unsigned long start,
+extern void viking_flush_cache_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end);
extern void viking_flush_cache_page(struct vm_area_struct *vma,
unsigned long page);
@@ -881,13 +883,13 @@ extern void viking_flush_page(unsigned long page);
extern void viking_mxcc_flush_page(unsigned long page);
extern void viking_flush_tlb_all(void);
extern void viking_flush_tlb_mm(struct mm_struct *mm);
-extern void viking_flush_tlb_range(struct mm_struct *mm, unsigned long start,
+extern void viking_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end);
extern void viking_flush_tlb_page(struct vm_area_struct *vma,
unsigned long page);
extern void sun4dsmp_flush_tlb_all(void);
extern void sun4dsmp_flush_tlb_mm(struct mm_struct *mm);
-extern void sun4dsmp_flush_tlb_range(struct mm_struct *mm, unsigned long start,
+extern void sun4dsmp_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end);
extern void sun4dsmp_flush_tlb_page(struct vm_area_struct *vma,
unsigned long page);
@@ -895,14 +897,14 @@ extern void sun4dsmp_flush_tlb_page(struct vm_area_struct *vma,
/* hypersparc.S */
extern void hypersparc_flush_cache_all(void);
extern void hypersparc_flush_cache_mm(struct mm_struct *mm);
-extern void hypersparc_flush_cache_range(struct mm_struct *mm, unsigned long start, unsigned long end);
+extern void hypersparc_flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end);
extern void hypersparc_flush_cache_page(struct vm_area_struct *vma, unsigned long page);
extern void hypersparc_flush_page_to_ram(unsigned long page);
extern void hypersparc_flush_page_for_dma(unsigned long page);
extern void hypersparc_flush_sig_insns(struct mm_struct *mm, unsigned long insn_addr);
extern void hypersparc_flush_tlb_all(void);
extern void hypersparc_flush_tlb_mm(struct mm_struct *mm);
-extern void hypersparc_flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end);
+extern void hypersparc_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end);
extern void hypersparc_flush_tlb_page(struct vm_area_struct *vma, unsigned long page);
extern void hypersparc_setup_blockops(void);
@@ -1559,8 +1561,10 @@ static void turbosparc_flush_cache_mm(struct mm_struct *mm)
FLUSH_END
}
-static void turbosparc_flush_cache_range(struct mm_struct *mm, unsigned long start, unsigned long end)
+static void turbosparc_flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
+
FLUSH_BEGIN(mm)
flush_user_windows();
turbosparc_idflash_clear();
@@ -1610,8 +1614,10 @@ static void turbosparc_flush_tlb_mm(struct mm_struct *mm)
FLUSH_END
}
-static void turbosparc_flush_tlb_range(struct mm_struct *mm, unsigned long start, unsigned long end)
+static void turbosparc_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
+
FLUSH_BEGIN(mm)
srmmu_flush_whole_tlb();
FLUSH_END
diff --git a/arch/sparc/mm/sun4c.c b/arch/sparc/mm/sun4c.c
index 0673df648..ca8f8f6b6 100644
--- a/arch/sparc/mm/sun4c.c
+++ b/arch/sparc/mm/sun4c.c
@@ -1,4 +1,4 @@
-/* $Id: sun4c.c,v 1.211 2001-12-17 07:05:09 davem Exp $
+/* $Id: sun4c.c,v 1.212 2001-12-21 04:56:15 davem Exp $
* sun4c.c: Doing in software what should be done in hardware.
*
* Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
@@ -1484,8 +1484,9 @@ static void sun4c_flush_cache_mm_hw(struct mm_struct *mm)
}
}
-static void sun4c_flush_cache_range_hw(struct mm_struct *mm, unsigned long start, unsigned long end)
+static void sun4c_flush_cache_range_hw(struct vm_area_struct *vma, unsigned long start, unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
int new_ctx = mm->context;
if (new_ctx != NO_CONTEXT) {
@@ -1608,8 +1609,9 @@ static void sun4c_flush_cache_mm_sw(struct mm_struct *mm)
}
}
-static void sun4c_flush_cache_range_sw(struct mm_struct *mm, unsigned long start, unsigned long end)
+static void sun4c_flush_cache_range_sw(struct vm_area_struct *vma, unsigned long start, unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
int new_ctx = mm->context;
if (new_ctx != NO_CONTEXT) {
@@ -1765,8 +1767,9 @@ static void sun4c_flush_tlb_mm_hw(struct mm_struct *mm)
}
}
-static void sun4c_flush_tlb_range_hw(struct mm_struct *mm, unsigned long start, unsigned long end)
+static void sun4c_flush_tlb_range_hw(struct vm_area_struct *vma, unsigned long start, unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
int new_ctx = mm->context;
if (new_ctx != NO_CONTEXT) {
@@ -1848,8 +1851,9 @@ static void sun4c_flush_tlb_mm_sw(struct mm_struct *mm)
}
}
-static void sun4c_flush_tlb_range_sw(struct mm_struct *mm, unsigned long start, unsigned long end)
+static void sun4c_flush_tlb_range_sw(struct vm_area_struct *vma, unsigned long start, unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
int new_ctx = mm->context;
if (new_ctx != NO_CONTEXT) {
diff --git a/arch/sparc/mm/swift.S b/arch/sparc/mm/swift.S
index 66db8188f..3722d429c 100644
--- a/arch/sparc/mm/swift.S
+++ b/arch/sparc/mm/swift.S
@@ -1,4 +1,4 @@
-/* $Id: swift.S,v 1.7 2000-07-16 21:48:52 anton Exp $
+/* $Id: swift.S,v 1.8 2001-12-21 04:56:15 davem Exp $
* swift.S: MicroSparc-II mmu/cache operations.
*
* Copyright (C) 1999 David S. Miller (davem@redhat.com)
@@ -222,8 +222,9 @@ swift_flush_sig_insns:
.globl swift_flush_tlb_mm
.globl swift_flush_tlb_range
.globl swift_flush_tlb_all
-swift_flush_tlb_mm:
swift_flush_tlb_range:
+ ld [%o0 + 0x00], %o0 /* XXX vma->vm_mm GROSS XXX */
+swift_flush_tlb_mm:
#ifndef CONFIG_SMP
ld [%o0 + AOFF_mm_context], %g2
cmp %g2, -1
diff --git a/arch/sparc/mm/tsunami.S b/arch/sparc/mm/tsunami.S
index 31c1a9d9d..feff869cb 100644
--- a/arch/sparc/mm/tsunami.S
+++ b/arch/sparc/mm/tsunami.S
@@ -1,4 +1,4 @@
-/* $Id: tsunami.S,v 1.6 2000-07-16 21:48:52 anton Exp $
+/* $Id: tsunami.S,v 1.7 2001-12-21 04:56:15 davem Exp $
* tsunami.S: High speed MicroSparc-I mmu/cache operations.
*
* Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
@@ -23,9 +23,9 @@
/* Sliiick... */
tsunami_flush_cache_page:
+tsunami_flush_cache_range:
ld [%o0 + 0x0], %o0 /* XXX vma->vm_mm, GROSS XXX */
tsunami_flush_cache_mm:
-tsunami_flush_cache_range:
ld [%o0 + AOFF_mm_context], %g2
#ifndef CONFIG_SMP
cmp %g2, -1
@@ -47,8 +47,9 @@ tsunami_flush_sig_insns:
flush %o1 + 4
/* More slick stuff... */
-tsunami_flush_tlb_mm:
tsunami_flush_tlb_range:
+ ld [%o0 + 0x00], %o0 /* XXX vma->vm_mm GROSS XXX */
+tsunami_flush_tlb_mm:
#ifndef CONFIG_SMP
ld [%o0 + AOFF_mm_context], %g2
cmp %g2, -1
diff --git a/arch/sparc/mm/viking.S b/arch/sparc/mm/viking.S
index 0ffa4c87d..18dba2a9f 100644
--- a/arch/sparc/mm/viking.S
+++ b/arch/sparc/mm/viking.S
@@ -1,4 +1,4 @@
-/* $Id: viking.S,v 1.18 2000-07-16 21:48:52 anton Exp $
+/* $Id: viking.S,v 1.19 2001-12-21 04:56:15 davem Exp $
* viking.S: High speed Viking cache/mmu operations
*
* Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be)
@@ -108,11 +108,11 @@ viking_mxcc_flush_page:
nop
viking_flush_cache_page:
+viking_flush_cache_range:
#ifndef CONFIG_SMP
ld [%o0 + 0x0], %o0 /* XXX vma->vm_mm, GROSS XXX */
#endif
viking_flush_cache_mm:
-viking_flush_cache_range:
#ifndef CONFIG_SMP
ld [%o0 + AOFF_mm_context], %g1
cmp %g1, -1
@@ -150,6 +150,7 @@ viking_flush_tlb_mm:
#endif
viking_flush_tlb_range:
+ ld [%o0 + 0x00], %o0 /* XXX vma->vm_mm GROSS XXX */
mov SRMMU_CTX_REG, %g1
ld [%o0 + AOFF_mm_context], %o3
lda [%g1] ASI_M_MMUREGS, %g5
@@ -240,6 +241,7 @@ sun4dsmp_flush_tlb_range:
tst %g5
bne 3f
mov SRMMU_CTX_REG, %g1
+ ld [%o0 + 0x00], %o0 /* XXX vma->vm_mm GROSS XXX */
ld [%o0 + AOFF_mm_context], %o3
lda [%g1] ASI_M_MMUREGS, %g5
sethi %hi(~((1 << SRMMU_PGDIR_SHIFT) - 1)), %o4
diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c
index 477d889a0..6938e1fe4 100644
--- a/arch/sparc64/kernel/pci.c
+++ b/arch/sparc64/kernel/pci.c
@@ -1,4 +1,4 @@
-/* $Id: pci.c,v 1.37 2001-12-18 20:41:06 davem Exp $
+/* $Id: pci.c,v 1.38 2001-12-21 04:56:15 davem Exp $
* pci.c: UltraSparc PCI controller support.
*
* Copyright (C) 1997, 1998, 1999 David S. Miller (davem@redhat.com)
@@ -485,7 +485,7 @@ static void __pci_mmap_set_pgprot(struct pci_dev *dev, struct vm_area_struct *vm
/* Our io_remap_page_range takes care of this, do nothing. */
}
-extern int io_remap_page_range(unsigned long from, unsigned long offset,
+extern int io_remap_page_range(struct vm_area_struct *vma, unsigned long from, unsigned long offset,
unsigned long size, pgprot_t prot, int space);
/* Perform the actual remap of the pages for a PCI device mapping, as appropriate
@@ -509,7 +509,7 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
__pci_mmap_set_flags(dev, vma, mmap_state);
__pci_mmap_set_pgprot(dev, vma, mmap_state);
- ret = io_remap_page_range(vma->vm_start,
+ ret = io_remap_page_range(vma, vma->vm_start,
(vma->vm_pgoff << PAGE_SHIFT |
(write_combine ? 0x1UL : 0x0UL)),
vma->vm_end - vma->vm_start, vma->vm_page_prot, 0);
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c
index 90cbdf108..6ac61ab80 100644
--- a/arch/sparc64/kernel/smp.c
+++ b/arch/sparc64/kernel/smp.c
@@ -679,6 +679,39 @@ void smp_flush_dcache_page_impl(struct page *page, int cpu)
}
}
+void flush_dcache_page_all(struct mm_struct *mm, struct page *page)
+{
+ if (smp_processors_ready) {
+ unsigned long mask = cpu_present_map & ~(1UL << smp_processor_id());
+ u64 data0;
+
+#ifdef CONFIG_DEBUG_DCFLUSH
+ atomic_inc(&dcpage_flushes);
+#endif
+ if (mask == 0UL)
+ goto flush_self;
+ if (tlb_type == spitfire) {
+ data0 = ((u64)&xcall_flush_dcache_page_spitfire);
+ if (page->mapping != NULL)
+ data0 |= ((u64)1 << 32);
+ spitfire_xcall_deliver(data0,
+ __pa(page->virtual),
+ (u64) page->virtual,
+ mask);
+ } else {
+ data0 = ((u64)&xcall_flush_dcache_page_cheetah);
+ cheetah_xcall_deliver(data0,
+ __pa(page->virtual),
+ 0, mask);
+ }
+#ifdef CONFIG_DEBUG_DCFLUSH
+ atomic_inc(&dcpage_flushes_xcall);
+#endif
+ flush_self:
+ __local_flush_dcache_page(page);
+ }
+}
+
void smp_receive_signal(int cpu)
{
if (smp_processors_ready) {
@@ -788,9 +821,11 @@ void smp_flush_tlb_mm(struct mm_struct *mm)
}
}
-void smp_flush_tlb_range(struct mm_struct *mm, unsigned long start,
+void smp_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
+
{
u32 ctx = CTX_HWBITS(mm->context);
int cpu = smp_processor_id();
diff --git a/arch/sparc64/kernel/sparc64_ksyms.c b/arch/sparc64/kernel/sparc64_ksyms.c
index 913239657..7e833f120 100644
--- a/arch/sparc64/kernel/sparc64_ksyms.c
+++ b/arch/sparc64/kernel/sparc64_ksyms.c
@@ -1,4 +1,4 @@
-/* $Id: sparc64_ksyms.c,v 1.119 2001-11-30 01:04:10 davem Exp $
+/* $Id: sparc64_ksyms.c,v 1.120 2001-12-21 04:56:15 davem Exp $
* arch/sparc64/kernel/sparc64_ksyms.c: Sparc64 specific ksyms support.
*
* Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
@@ -88,7 +88,7 @@ extern int (*handle_mathemu)(struct pt_regs *, struct fpustate *);
extern long sparc32_open(const char * filename, int flags, int mode);
extern int register_ioctl32_conversion(unsigned int cmd, int (*handler)(unsigned int, unsigned int, unsigned long, struct file *));
extern int unregister_ioctl32_conversion(unsigned int cmd);
-extern int io_remap_page_range(unsigned long from, unsigned long offset, unsigned long size, pgprot_t prot, int space);
+extern int io_remap_page_range(struct vm_area_struct *vma, unsigned long from, unsigned long offset, unsigned long size, pgprot_t prot, int space);
extern int __ashrdi3(int, int);
diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c
index 1e63e7194..90852ef93 100644
--- a/arch/sparc64/kernel/sys_sparc.c
+++ b/arch/sparc64/kernel/sys_sparc.c
@@ -1,4 +1,4 @@
-/* $Id: sys_sparc.c,v 1.55 2001-11-29 22:52:03 davem Exp $
+/* $Id: sys_sparc.c,v 1.56 2001-12-21 04:56:15 davem Exp $
* linux/arch/sparc64/kernel/sys_sparc.c
*
* This file contains various random system calls that
@@ -40,12 +40,15 @@ asmlinkage unsigned long sys_getpagesize(void)
return PAGE_SIZE;
}
-#define COLOUR_ALIGN(addr) (((addr)+SHMLBA-1)&~(SHMLBA-1))
+#define COLOUR_ALIGN(addr,pgoff) \
+ ((((addr)+SHMLBA-1)&~(SHMLBA-1)) + \
+ (((pgoff)<<PAGE_SHIFT) & (SHMLBA-1)))
unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags)
{
struct vm_area_struct * vmm;
unsigned long task_size = TASK_SIZE;
+ int do_color_align;
if (flags & MAP_FIXED) {
/* We do not accept a shared mapping if it would violate
@@ -63,11 +66,14 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi
if (!addr)
addr = TASK_UNMAPPED_BASE;
- if (flags & MAP_SHARED)
- addr = COLOUR_ALIGN(addr);
+ do_color_align = 0;
+ if (filp || (flags & MAP_SHARED))
+ do_color_align = 1;
+
+ if (do_color_align)
+ addr = COLOUR_ALIGN(addr, pgoff);
else
addr = PAGE_ALIGN(addr);
-
task_size -= len;
for (vmm = find_vma(current->mm, addr); ; vmm = vmm->vm_next) {
@@ -81,8 +87,8 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi
if (!vmm || addr + len <= vmm->vm_start)
return addr;
addr = vmm->vm_end;
- if (flags & MAP_SHARED)
- addr = COLOUR_ALIGN(addr);
+ if (do_color_align)
+ addr = COLOUR_ALIGN(addr, pgoff);
}
}
diff --git a/arch/sparc64/mm/generic.c b/arch/sparc64/mm/generic.c
index ee9b524b8..f35b0a0b6 100644
--- a/arch/sparc64/mm/generic.c
+++ b/arch/sparc64/mm/generic.c
@@ -1,4 +1,4 @@
-/* $Id: generic.c,v 1.17 2001-04-09 04:08:06 davem Exp $
+/* $Id: generic.c,v 1.18 2001-12-21 04:56:15 davem Exp $
* generic.c: Generic Sparc mm routines that are not dependent upon
* MMU type but are Sparc specific.
*
@@ -111,18 +111,18 @@ static inline int io_remap_pmd_range(pmd_t * pmd, unsigned long address, unsigne
return 0;
}
-int io_remap_page_range(unsigned long from, unsigned long offset, unsigned long size, pgprot_t prot, int space)
+int io_remap_page_range(struct vm_area_struct *vma, unsigned long from, unsigned long offset, unsigned long size, pgprot_t prot, int space)
{
int error = 0;
pgd_t * dir;
unsigned long beg = from;
unsigned long end = from + size;
- struct mm_struct *mm = current->mm;
+ struct mm_struct *mm = vma->vm_mm;
prot = __pgprot(pg_iobits);
offset -= from;
dir = pgd_offset(mm, from);
- flush_cache_range(mm, beg, end);
+ flush_cache_range(vma, beg, end);
spin_lock(&mm->page_table_lock);
while (from < end) {
@@ -138,6 +138,6 @@ int io_remap_page_range(unsigned long from, unsigned long offset, unsigned long
}
spin_unlock(&mm->page_table_lock);
- flush_tlb_range(current->mm, beg, end);
+ flush_tlb_range(vma, beg, end);
return error;
}
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c
index ada1e8950..beef48f3f 100644
--- a/arch/sparc64/mm/init.c
+++ b/arch/sparc64/mm/init.c
@@ -1,4 +1,4 @@
-/* $Id: init.c,v 1.207 2001-11-30 06:55:39 davem Exp $
+/* $Id: init.c,v 1.208 2001-12-21 04:56:15 davem Exp $
* arch/sparc64/mm/init.c
*
* Copyright (C) 1996-1999 David S. Miller (davem@caip.rutgers.edu)
@@ -228,6 +228,82 @@ void flush_dcache_page(struct page *page)
}
}
+/* When shared+writable mmaps of files go away, we lose all dirty
+ * page state, so we have to deal with D-cache aliasing here.
+ *
+ * This code relies on the fact that flush_cache_range() is always
+ * called for an area composed by a single VMA. It also assumes that
+ * the MM's page_table_lock is held.
+ */
+static inline void flush_cache_pte_range(struct mm_struct *mm, pmd_t *pmd, unsigned long address, unsigned long size)
+{
+ unsigned long offset;
+ pte_t *ptep;
+
+ if (pmd_none(*pmd))
+ return;
+ ptep = pte_offset(pmd, address);
+ offset = address & ~PMD_MASK;
+ if (offset + size > PMD_SIZE)
+ size = PMD_SIZE - offset;
+ size &= PAGE_MASK;
+ for (offset = 0; offset < size; ptep++, offset += PAGE_SIZE) {
+ pte_t pte = *ptep;
+
+ if (pte_none(pte))
+ continue;
+
+ if (pte_present(pte) && pte_dirty(pte)) {
+ struct page *page = pte_page(pte);
+ unsigned long pgaddr, uaddr;
+
+ if (!VALID_PAGE(page) || PageReserved(page) || !page->mapping)
+ continue;
+ pgaddr = (unsigned long) page_address(page);
+ uaddr = address + offset;
+ if ((pgaddr ^ uaddr) & (1 << 13))
+ flush_dcache_page_all(mm, page);
+ }
+ }
+}
+
+static inline void flush_cache_pmd_range(struct mm_struct *mm, pgd_t *dir, unsigned long address, unsigned long size)
+{
+ pmd_t *pmd;
+ unsigned long end;
+
+ if (pgd_none(*dir))
+ return;
+ pmd = pmd_offset(dir, address);
+ end = address + size;
+ if (end > ((address + PGDIR_SIZE) & PGDIR_MASK))
+ end = ((address + PGDIR_SIZE) & PGDIR_MASK);
+ do {
+ flush_cache_pte_range(mm, pmd, address, end - address);
+ address = (address + PMD_SIZE) & PMD_MASK;
+ pmd++;
+ } while (address < end);
+}
+
+void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
+{
+ struct mm_struct *mm = vma->vm_mm;
+ pgd_t *dir = pgd_offset(mm, start);
+
+ if (mm == current->mm)
+ flushw_user();
+
+ if (vma->vm_file == NULL ||
+ ((vma->vm_flags & (VM_SHARED|VM_WRITE)) != (VM_SHARED|VM_WRITE)))
+ return;
+
+ do {
+ flush_cache_pmd_range(mm, dir, start, end - start);
+ start = (start + PGDIR_SIZE) & PGDIR_MASK;
+ dir++;
+ } while (start && (start < end));
+}
+
void flush_icache_range(unsigned long start, unsigned long end)
{
/* Cheetah has coherent I-cache. */
diff --git a/drivers/char/agp/agpgart_fe.c b/drivers/char/agp/agpgart_fe.c
index 2e6a7f63e..44eb6b755 100644
--- a/drivers/char/agp/agpgart_fe.c
+++ b/drivers/char/agp/agpgart_fe.c
@@ -638,7 +638,7 @@ static int agp_mmap(struct file *file, struct vm_area_struct *vma)
AGP_UNLOCK();
return -EINVAL;
}
- if (remap_page_range(vma->vm_start,
+ if (remap_page_range(vma, vma->vm_start,
(kerninfo.aper_base + offset),
size, vma->vm_page_prot)) {
AGP_UNLOCK();
@@ -652,7 +652,7 @@ static int agp_mmap(struct file *file, struct vm_area_struct *vma)
AGP_UNLOCK();
return -EINVAL;
}
- if (remap_page_range(vma->vm_start, kerninfo.aper_base,
+ if (remap_page_range(vma, vma->vm_start, kerninfo.aper_base,
size, vma->vm_page_prot)) {
AGP_UNLOCK();
return -EAGAIN;
diff --git a/drivers/char/drm/drm_vm.h b/drivers/char/drm/drm_vm.h
index 5be629298..3cdbe57dc 100644
--- a/drivers/char/drm/drm_vm.h
+++ b/drivers/char/drm/drm_vm.h
@@ -532,12 +532,12 @@ int DRM(mmap)(struct file *filp, struct vm_area_struct *vma)
}
offset = DRIVER_GET_REG_OFS();
#ifdef __sparc__
- if (io_remap_page_range(vma->vm_start,
+ if (io_remap_page_range(vma, vma->vm_start,
VM_OFFSET(vma) + offset,
vma->vm_end - vma->vm_start,
vma->vm_page_prot, 0))
#else
- if (remap_page_range(vma->vm_start,
+ if (remap_page_range(vma, vma->vm_start,
VM_OFFSET(vma) + offset,
vma->vm_end - vma->vm_start,
vma->vm_page_prot))
diff --git a/drivers/char/drm/i810_dma.c b/drivers/char/drm/i810_dma.c
index d6933d576..42c769e50 100644
--- a/drivers/char/drm/i810_dma.c
+++ b/drivers/char/drm/i810_dma.c
@@ -163,7 +163,7 @@ int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
buf_priv->currently_mapped = I810_BUF_MAPPED;
unlock_kernel();
- if (remap_page_range(vma->vm_start,
+ if (remap_page_range(vma, vma->vm_start,
VM_OFFSET(vma),
vma->vm_end - vma->vm_start,
vma->vm_page_prot)) return -EAGAIN;
diff --git a/drivers/char/ftape/lowlevel/ftape-ctl.c b/drivers/char/ftape/lowlevel/ftape-ctl.c
index 6c1ef5235..469b16ee5 100644
--- a/drivers/char/ftape/lowlevel/ftape-ctl.c
+++ b/drivers/char/ftape/lowlevel/ftape-ctl.c
@@ -731,7 +731,7 @@ int ftape_mmap(struct vm_area_struct *vma)
ftape_reset_buffer();
}
for (i = 0; i < num_buffers; i++) {
- TRACE_CATCH(remap_page_range(vma->vm_start +
+ TRACE_CATCH(remap_page_range(vma, vma->vm_start +
i * FT_BUFF_SIZE,
virt_to_phys(ft_buffer[i]->address),
FT_BUFF_SIZE,
diff --git a/drivers/char/mem.c b/drivers/char/mem.c
index 4f303001c..7ff82d118 100644
--- a/drivers/char/mem.c
+++ b/drivers/char/mem.c
@@ -203,7 +203,7 @@ static int mmap_mem(struct file * file, struct vm_area_struct * vma)
if (offset >= __pa(high_memory) || (file->f_flags & O_SYNC))
vma->vm_flags |= VM_IO;
- if (remap_page_range(vma->vm_start, offset, vma->vm_end-vma->vm_start,
+ if (remap_page_range(vma, vma->vm_start, offset, vma->vm_end-vma->vm_start,
vma->vm_page_prot))
return -EAGAIN;
return 0;
@@ -400,8 +400,8 @@ static inline size_t read_zero_pagealigned(char * buf, size_t size)
if (count > size)
count = size;
- zap_page_range(mm, addr, count);
- zeromap_page_range(addr, count, PAGE_COPY);
+ zap_page_range(vma, addr, count);
+ zeromap_page_range(vma, addr, count, PAGE_COPY);
size -= count;
buf += count;
@@ -471,7 +471,7 @@ static int mmap_zero(struct file * file, struct vm_area_struct * vma)
{
if (vma->vm_flags & VM_SHARED)
return shmem_zero_setup(vma);
- if (zeromap_page_range(vma->vm_start, vma->vm_end - vma->vm_start, vma->vm_page_prot))
+ if (zeromap_page_range(vma, vma->vm_start, vma->vm_end - vma->vm_start, vma->vm_page_prot))
return -EAGAIN;
return 0;
}
diff --git a/drivers/ieee1394/video1394.c b/drivers/ieee1394/video1394.c
index f104ac404..72f0fe00c 100644
--- a/drivers/ieee1394/video1394.c
+++ b/drivers/ieee1394/video1394.c
@@ -822,7 +822,7 @@ static void initialize_dma_it_ctx(struct dma_iso_ctx *d, int sync_tag,
reg_write(ohci, OHCI1394_IsoXmitIntMaskSet, 1<<d->ctx);
}
-static int do_iso_mmap(struct ti_ohci *ohci, struct dma_iso_ctx *d,
+static int do_iso_mmap(struct vm_area_struct *vma, struct ti_ohci *ohci, struct dma_iso_ctx *d,
const char *adr, unsigned long size)
{
unsigned long start=(unsigned long) adr;
@@ -843,7 +843,7 @@ static int do_iso_mmap(struct ti_ohci *ohci, struct dma_iso_ctx *d,
pos=(unsigned long) d->buf;
while (size > 0) {
page = kvirt_to_pa(pos);
- if (remap_page_range(start, page, PAGE_SIZE, PAGE_SHARED))
+ if (remap_page_range(vma, start, page, PAGE_SIZE, PAGE_SHARED))
return -EAGAIN;
start+=PAGE_SIZE;
pos+=PAGE_SIZE;
@@ -1388,7 +1388,7 @@ int video1394_mmap(struct file *file, struct vm_area_struct *vma)
if (video->current_ctx == NULL) {
PRINT(KERN_ERR, ohci->id, "Current iso context not set");
} else
- res = do_iso_mmap(ohci, video->current_ctx,
+ res = do_iso_mmap(vma, ohci, video->current_ctx,
(char *)vma->vm_start,
(unsigned long)(vma->vm_end-vma->vm_start));
unlock_kernel();
diff --git a/drivers/media/video/bttv-driver.c b/drivers/media/video/bttv-driver.c
index b04a03a87..1b9cd7124 100644
--- a/drivers/media/video/bttv-driver.c
+++ b/drivers/media/video/bttv-driver.c
@@ -2038,7 +2038,7 @@ static int bttv_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
* But e.g. pte_alloc() does not work in modules ... :-(
*/
-static int do_bttv_mmap(struct bttv *btv, const char *adr, unsigned long size)
+static int do_bttv_mmap(struct vm_area_struct *vma, struct bttv *btv, const char *adr, unsigned long size)
{
unsigned long start=(unsigned long) adr;
unsigned long page,pos;
@@ -2052,7 +2052,7 @@ static int do_bttv_mmap(struct bttv *btv, const char *adr, unsigned long size)
pos=(unsigned long) btv->fbuffer;
while (size > 0) {
page = kvirt_to_pa(pos);
- if (remap_page_range(start, page, PAGE_SIZE, PAGE_SHARED))
+ if (remap_page_range(vma, start, page, PAGE_SIZE, PAGE_SHARED))
return -EAGAIN;
start+=PAGE_SIZE;
pos+=PAGE_SIZE;
@@ -2061,13 +2061,13 @@ static int do_bttv_mmap(struct bttv *btv, const char *adr, unsigned long size)
return 0;
}
-static int bttv_mmap(struct video_device *dev, const char *adr, unsigned long size)
+static int bttv_mmap(struct vm_area_struct *vma, struct video_device *dev, const char *adr, unsigned long size)
{
struct bttv *btv=(struct bttv *)dev;
int r;
down(&btv->lock);
- r=do_bttv_mmap(btv, adr, size);
+ r=do_bttv_mmap(vma, btv, adr, size);
up(&btv->lock);
return r;
}
diff --git a/drivers/media/video/cpia.c b/drivers/media/video/cpia.c
index 85bd3c2cf..e3eee0c76 100644
--- a/drivers/media/video/cpia.c
+++ b/drivers/media/video/cpia.c
@@ -2972,7 +2972,7 @@ static int cpia_ioctl(struct video_device *dev, unsigned int ioctlnr, void *arg)
}
/* FIXME */
-static int cpia_mmap(struct video_device *dev, const char *adr,
+static int cpia_mmap(struct vm_area_struct *vma, struct video_device *dev, const char *adr,
unsigned long size)
{
unsigned long start = (unsigned long)adr;
@@ -3005,7 +3005,7 @@ static int cpia_mmap(struct video_device *dev, const char *adr,
pos = (unsigned long)(cam->frame_buf);
while (size > 0) {
page = kvirt_to_pa(pos);
- if (remap_page_range(start, page, PAGE_SIZE, PAGE_SHARED)) {
+ if (remap_page_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) {
up(&cam->busy_lock);
return -EAGAIN;
}
diff --git a/drivers/media/video/meye.c b/drivers/media/video/meye.c
index 7ad5618f0..2eedc6b79 100644
--- a/drivers/media/video/meye.c
+++ b/drivers/media/video/meye.c
@@ -1240,7 +1240,7 @@ static int meye_ioctl(struct video_device *dev, unsigned int cmd, void *arg) {
return 0;
}
-static int meye_mmap(struct video_device *dev, const char *adr,
+static int meye_mmap(struct vm_area_struct *vma, struct video_device *dev, const char *adr,
unsigned long size) {
unsigned long start=(unsigned long) adr;
unsigned long page,pos;
@@ -1263,7 +1263,7 @@ static int meye_mmap(struct video_device *dev, const char *adr,
while (size > 0) {
page = kvirt_to_pa(pos);
- if (remap_page_range(start, page, PAGE_SIZE, PAGE_SHARED)) {
+ if (remap_page_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) {
up(&meye.lock);
return -EAGAIN;
}
diff --git a/drivers/media/video/planb.c b/drivers/media/video/planb.c
index 0641e1be4..cbd0b4b8d 100644
--- a/drivers/media/video/planb.c
+++ b/drivers/media/video/planb.c
@@ -1994,7 +1994,7 @@ unimplemented:
return 0;
}
-static int planb_mmap(struct video_device *dev, const char *adr, unsigned long size)
+static int planb_mmap(struct vm_area_struct *vma, struct video_device *dev, const char *adr, unsigned long size)
{
int i;
struct planb *pb = (struct planb *)dev;
@@ -2008,7 +2008,7 @@ static int planb_mmap(struct video_device *dev, const char *adr, unsigned long s
return err;
}
for (i = 0; i < pb->rawbuf_size; i++) {
- if (remap_page_range(start, virt_to_phys((void *)pb->rawbuf[i]),
+ if (remap_page_range(vma, start, virt_to_phys((void *)pb->rawbuf[i]),
PAGE_SIZE, PAGE_SHARED))
return -EAGAIN;
start += PAGE_SIZE;
diff --git a/drivers/media/video/videodev.c b/drivers/media/video/videodev.c
index c6b0e1868..b73e38110 100644
--- a/drivers/media/video/videodev.c
+++ b/drivers/media/video/videodev.c
@@ -206,7 +206,7 @@ int video_mmap(struct file *file, struct vm_area_struct *vma)
struct video_device *vfl=video_device[MINOR(file->f_dentry->d_inode->i_rdev)];
if(vfl->mmap) {
lock_kernel();
- ret = vfl->mmap(vfl, (char *)vma->vm_start,
+ ret = vfl->mmap(vma, vfl, (char *)vma->vm_start,
(unsigned long)(vma->vm_end-vma->vm_start));
unlock_kernel();
}
diff --git a/drivers/media/video/zr36067.c b/drivers/media/video/zr36067.c
index 0317ef7aa..0cc3ea25a 100644
--- a/drivers/media/video/zr36067.c
+++ b/drivers/media/video/zr36067.c
@@ -4275,7 +4275,7 @@ static int zoran_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
*
*/
-static int do_zoran_mmap(struct zoran *zr, const char *adr,
+static int do_zoran_mmap(struct vm_area_struct *vma, struct zoran *zr, const char *adr,
unsigned long size)
{
unsigned long start = (unsigned long) adr;
@@ -4322,7 +4322,7 @@ static int do_zoran_mmap(struct zoran *zr, const char *adr,
frag_tab[2 * j];
page = virt_to_phys(bus_to_virt(pos)); /* should just be pos on i386 */
if (remap_page_range
- (start, page, todo, PAGE_SHARED)) {
+ (vma, start, page, todo, PAGE_SHARED)) {
printk(KERN_ERR
"%s: zoran_mmap(V4L): remap_page_range failed\n",
zr->name);
@@ -4363,7 +4363,7 @@ static int do_zoran_mmap(struct zoran *zr, const char *adr,
("V4L remap page range %d 0x%lx %ld to 0x%lx\n",
i, page, todo, start));
if (remap_page_range
- (start, page, todo, PAGE_SHARED)) {
+ (vma, start, page, todo, PAGE_SHARED)) {
printk(KERN_ERR
"%s: zoran_mmap(V4L): remap_page_range failed\n",
zr->name);
@@ -4378,14 +4378,14 @@ static int do_zoran_mmap(struct zoran *zr, const char *adr,
return 0;
}
-static int zoran_mmap(struct video_device *dev, const char *adr,
+static int zoran_mmap(struct vm_area_struct *vma, struct video_device *dev, const char *adr,
unsigned long size)
{
int err;
struct zoran *zr = (struct zoran *) dev;
down(&zr->sem);
- err = do_zoran_mmap(zr, adr, size);
+ err = do_zoran_mmap(vma, zr, adr, size);
up(&zr->sem);
return err;
diff --git a/drivers/media/video/zr36120.c b/drivers/media/video/zr36120.c
index 609cf285b..6e57ebf6c 100644
--- a/drivers/media/video/zr36120.c
+++ b/drivers/media/video/zr36120.c
@@ -1468,7 +1468,7 @@ int zoran_ioctl(struct video_device* dev, unsigned int cmd, void *arg)
}
static
-int zoran_mmap(struct video_device* dev, const char* adr, unsigned long size)
+int zoran_mmap(struct vm_area_struct *vma, struct video_device* dev, const char* adr, unsigned long size)
{
struct zoran* ztv = (struct zoran*)dev;
unsigned long start = (unsigned long)adr;
@@ -1484,7 +1484,7 @@ int zoran_mmap(struct video_device* dev, const char* adr, unsigned long size)
pos = (unsigned long)ztv->fbuffer;
while (size>0) {
unsigned long page = virt_to_phys((void*)pos);
- if (remap_page_range(start, page, PAGE_SIZE, PAGE_SHARED))
+ if (remap_page_range(vma, start, page, PAGE_SIZE, PAGE_SHARED))
return -EAGAIN;
start += PAGE_SIZE;
pos += PAGE_SIZE;
diff --git a/drivers/pcmcia/hd64465_ss.c b/drivers/pcmcia/hd64465_ss.c
index ab876da8d..71db13ebb 100644
--- a/drivers/pcmcia/hd64465_ss.c
+++ b/drivers/pcmcia/hd64465_ss.c
@@ -673,6 +673,10 @@ static int hs_set_io_map(unsigned int sock, struct pccard_io_map *io)
*/
DPRINTK("remap_page_range(vaddr=0x%08lx, paddr=0x%08lx, size=0x%08lxx)\n",
vaddrbase + pstart, paddrbase + pstart, psize);
+#error This does not work. Firstly remap_page_range() uses current->mm for
+#error the address space, which is wrong for kernel mappings. remap_page_range
+#error also does flush_{cache,tlb}_range() which ONLY works for user mappings.
+#error Next, remap_page_range() now wants to take a vm_area_struct arg.
remap_page_range(vaddrbase + pstart, paddrbase + pstart, psize, prot);
/*
diff --git a/drivers/sbus/char/flash.c b/drivers/sbus/char/flash.c
index 69f94fab7..7ec1dfa3a 100644
--- a/drivers/sbus/char/flash.c
+++ b/drivers/sbus/char/flash.c
@@ -1,4 +1,4 @@
-/* $Id: flash.c,v 1.24 2001-10-08 22:19:51 davem Exp $
+/* $Id: flash.c,v 1.25 2001-12-21 04:56:16 davem Exp $
* flash.c: Allow mmap access to the OBP Flash, for OBP updates.
*
* Copyright (C) 1997 Eddie C. Dost (ecd@skynet.be)
@@ -74,7 +74,7 @@ flash_mmap(struct file *file, struct vm_area_struct *vma)
pgprot_val(vma->vm_page_prot) |= _PAGE_E;
vma->vm_flags |= (VM_SHM | VM_LOCKED);
- if (remap_page_range(vma->vm_start, addr, size, vma->vm_page_prot))
+ if (remap_page_range(vma, vma->vm_start, addr, size, vma->vm_page_prot))
return -EAGAIN;
return 0;
diff --git a/drivers/sbus/char/vfc_dev.c b/drivers/sbus/char/vfc_dev.c
index 2f65bc367..ea3894bd2 100644
--- a/drivers/sbus/char/vfc_dev.c
+++ b/drivers/sbus/char/vfc_dev.c
@@ -632,7 +632,7 @@ static int vfc_mmap(struct inode *inode, struct file *file,
vma->vm_flags |=
(VM_SHM | VM_LOCKED | VM_IO | VM_MAYREAD | VM_MAYWRITE | VM_MAYSHARE);
map_offset = (unsigned int) (long)dev->phys_regs;
- ret = io_remap_page_range(vma->vm_start, map_offset, map_size,
+ ret = io_remap_page_range(vma, vma->vm_start, map_offset, map_size,
vma->vm_page_prot, dev->which_io);
if(ret)
diff --git a/drivers/sgi/char/graphics.c b/drivers/sgi/char/graphics.c
index 9a413f217..234c702b5 100644
--- a/drivers/sgi/char/graphics.c
+++ b/drivers/sgi/char/graphics.c
@@ -231,7 +231,7 @@ sgi_graphics_nopage (struct vm_area_struct *vma, unsigned long address, int
/* FIXME: save graphics context here, dump it to rendering
* node? */
- remove_mapping(cards[board].g_user, vma->vm_start, vma->vm_end);
+ remove_mapping(vma, cards[board].g_user, vma->vm_start, vma->vm_end);
}
cards [board].g_user = current;
@@ -241,7 +241,7 @@ sgi_graphics_nopage (struct vm_area_struct *vma, unsigned long address, int
virt_add = address & PAGE_MASK;
phys_add = cards[board].g_regs + virt_add - vma->vm_start;
- remap_page_range(virt_add, phys_add, PAGE_SIZE, vma->vm_page_prot);
+ remap_page_range(vma, virt_add, phys_add, PAGE_SIZE, vma->vm_page_prot);
pgd = pgd_offset(current->mm, address);
pmd = pmd_offset(pgd, address);
diff --git a/drivers/sgi/char/shmiq.c b/drivers/sgi/char/shmiq.c
index ec698d968..0533e7c64 100644
--- a/drivers/sgi/char/shmiq.c
+++ b/drivers/sgi/char/shmiq.c
@@ -348,7 +348,7 @@ shmiq_qcntl_mmap (struct file *file, struct vm_area_struct *vma)
/* Init the shared memory input queue */
spin_unlock( &shmiqs [minor].shmiq_lock );
memset (shmiqs [minor].shmiq_vaddr, 0, size);
- error = vmap_page_range (vma->vm_start, size, mem);
+ error = vmap_page_range (vma, vma->vm_start, size, mem);
return error;
}
diff --git a/drivers/sound/cmpci.c b/drivers/sound/cmpci.c
index a7af154a2..35574d752 100644
--- a/drivers/sound/cmpci.c
+++ b/drivers/sound/cmpci.c
@@ -1752,7 +1752,7 @@ static int cm_mmap(struct file *file, struct vm_area_struct *vma)
if (size > (PAGE_SIZE << db->buforder))
goto out;
ret = -EINVAL;
- if (remap_page_range(vma->vm_start, virt_to_phys(db->rawbuf), size, vma->vm_page_prot))
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(db->rawbuf), size, vma->vm_page_prot))
goto out;
db->mapped = 1;
ret = 0;
diff --git a/drivers/sound/cs4281/cs4281m.c b/drivers/sound/cs4281/cs4281m.c
index 1035eb618..f1ee130a0 100644
--- a/drivers/sound/cs4281/cs4281m.c
+++ b/drivers/sound/cs4281/cs4281m.c
@@ -3145,7 +3145,7 @@ static int cs4281_mmap(struct file *file, struct vm_area_struct *vma)
if (size > (PAGE_SIZE << db->buforder))
return -EINVAL;
if (remap_page_range
- (vma->vm_start, virt_to_phys(db->rawbuf), size,
+ (vma, vma->vm_start, virt_to_phys(db->rawbuf), size,
vma->vm_page_prot)) return -EAGAIN;
db->mapped = 1;
diff --git a/drivers/sound/cs46xx.c b/drivers/sound/cs46xx.c
index 067ea4352..362ede371 100644
--- a/drivers/sound/cs46xx.c
+++ b/drivers/sound/cs46xx.c
@@ -2467,7 +2467,7 @@ static int cs_mmap(struct file *file, struct vm_area_struct *vma)
ret = -EINVAL;
goto out;
}
- if (remap_page_range(vma->vm_start, virt_to_phys(dmabuf->rawbuf),
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(dmabuf->rawbuf),
size, vma->vm_page_prot))
{
ret = -EAGAIN;
diff --git a/drivers/sound/es1370.c b/drivers/sound/es1370.c
index 3da841bb0..93afb7a4d 100644
--- a/drivers/sound/es1370.c
+++ b/drivers/sound/es1370.c
@@ -1373,7 +1373,7 @@ static int es1370_mmap(struct file *file, struct vm_area_struct *vma)
ret = -EINVAL;
goto out;
}
- if (remap_page_range(vma->vm_start, virt_to_phys(db->rawbuf), size, vma->vm_page_prot)) {
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(db->rawbuf), size, vma->vm_page_prot)) {
ret = -EAGAIN;
goto out;
}
@@ -1945,7 +1945,7 @@ static int es1370_mmap_dac(struct file *file, struct vm_area_struct *vma)
if (size > (PAGE_SIZE << s->dma_dac1.buforder))
goto out;
ret = -EAGAIN;
- if (remap_page_range(vma->vm_start, virt_to_phys(s->dma_dac1.rawbuf), size, vma->vm_page_prot))
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(s->dma_dac1.rawbuf), size, vma->vm_page_prot))
goto out;
s->dma_dac1.mapped = 1;
ret = 0;
diff --git a/drivers/sound/es1371.c b/drivers/sound/es1371.c
index f685c5b1e..f822ea90a 100644
--- a/drivers/sound/es1371.c
+++ b/drivers/sound/es1371.c
@@ -1562,7 +1562,7 @@ static int es1371_mmap(struct file *file, struct vm_area_struct *vma)
ret = -EINVAL;
goto out;
}
- if (remap_page_range(vma->vm_start, virt_to_phys(db->rawbuf), size, vma->vm_page_prot)) {
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(db->rawbuf), size, vma->vm_page_prot)) {
ret = -EAGAIN;
goto out;
}
@@ -2131,7 +2131,7 @@ static int es1371_mmap_dac(struct file *file, struct vm_area_struct *vma)
if (size > (PAGE_SIZE << s->dma_dac1.buforder))
goto out;
ret = -EAGAIN;
- if (remap_page_range(vma->vm_start, virt_to_phys(s->dma_dac1.rawbuf), size, vma->vm_page_prot))
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(s->dma_dac1.rawbuf), size, vma->vm_page_prot))
goto out;
s->dma_dac1.mapped = 1;
ret = 0;
diff --git a/drivers/sound/esssolo1.c b/drivers/sound/esssolo1.c
index 6db33a2dc..fad9e6a5f 100644
--- a/drivers/sound/esssolo1.c
+++ b/drivers/sound/esssolo1.c
@@ -1245,7 +1245,7 @@ static int solo1_mmap(struct file *file, struct vm_area_struct *vma)
if (size > (PAGE_SIZE << db->buforder))
goto out;
ret = -EAGAIN;
- if (remap_page_range(vma->vm_start, virt_to_phys(db->rawbuf), size, vma->vm_page_prot))
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(db->rawbuf), size, vma->vm_page_prot))
goto out;
db->mapped = 1;
ret = 0;
diff --git a/drivers/sound/i810_audio.c b/drivers/sound/i810_audio.c
index 2662aaead..81397ece5 100644
--- a/drivers/sound/i810_audio.c
+++ b/drivers/sound/i810_audio.c
@@ -1555,7 +1555,7 @@ static int i810_mmap(struct file *file, struct vm_area_struct *vma)
if (size > (PAGE_SIZE << dmabuf->buforder))
goto out;
ret = -EAGAIN;
- if (remap_page_range(vma->vm_start, virt_to_phys(dmabuf->rawbuf),
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(dmabuf->rawbuf),
size, vma->vm_page_prot))
goto out;
dmabuf->mapped = 1;
diff --git a/drivers/sound/ite8172.c b/drivers/sound/ite8172.c
index 591b0abae..22844c9c9 100644
--- a/drivers/sound/ite8172.c
+++ b/drivers/sound/ite8172.c
@@ -1106,7 +1106,7 @@ static int it8172_mmap(struct file *file, struct vm_area_struct *vma)
unlock_kernel();
return -EINVAL;
}
- if (remap_page_range(vma->vm_start, virt_to_phys(db->rawbuf),
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(db->rawbuf),
size, vma->vm_page_prot)) {
unlock_kernel();
return -EAGAIN;
diff --git a/drivers/sound/maestro.c b/drivers/sound/maestro.c
index e72cc4a11..4df9e3b5b 100644
--- a/drivers/sound/maestro.c
+++ b/drivers/sound/maestro.c
@@ -2510,7 +2510,7 @@ static int ess_mmap(struct file *file, struct vm_area_struct *vma)
if (size > (PAGE_SIZE << db->buforder))
goto out;
ret = -EAGAIN;
- if (remap_page_range(vma->vm_start, virt_to_phys(db->rawbuf), size, vma->vm_page_prot))
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(db->rawbuf), size, vma->vm_page_prot))
goto out;
db->mapped = 1;
ret = 0;
diff --git a/drivers/sound/maestro3.c b/drivers/sound/maestro3.c
index b18da793d..64dcea37d 100644
--- a/drivers/sound/maestro3.c
+++ b/drivers/sound/maestro3.c
@@ -1555,7 +1555,7 @@ static int m3_mmap(struct file *file, struct vm_area_struct *vma)
* ask Jeff what the hell I'm doing wrong.
*/
ret = -EAGAIN;
- if (remap_page_range(vma->vm_start, virt_to_phys(db->rawbuf), size, vma->vm_page_prot))
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(db->rawbuf), size, vma->vm_page_prot))
goto out;
db->mapped = 1;
diff --git a/drivers/sound/rme96xx.c b/drivers/sound/rme96xx.c
index 56ab275b9..51ba5697d 100644
--- a/drivers/sound/rme96xx.c
+++ b/drivers/sound/rme96xx.c
@@ -1411,14 +1411,14 @@ static int rm96xx_mmap(struct file *file, struct vm_area_struct *vma) {
if (vma->vm_flags & VM_WRITE) {
if (!s->started) rme96xx_startcard(s,1);
- if (remap_page_range(vma->vm_start, virt_to_phys(s->playbuf + dma->outoffset*RME96xx_DMA_MAX_SIZE), size, vma->vm_page_prot)) {
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(s->playbuf + dma->outoffset*RME96xx_DMA_MAX_SIZE), size, vma->vm_page_prot)) {
unlock_kernel();
return -EAGAIN;
}
}
else if (vma->vm_flags & VM_READ) {
if (!s->started) rme96xx_startcard(s,1);
- if (remap_page_range(vma->vm_start, virt_to_phys(s->playbuf + dma->inoffset*RME96xx_DMA_MAX_SIZE), size, vma->vm_page_prot)) {
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(s->playbuf + dma->inoffset*RME96xx_DMA_MAX_SIZE), size, vma->vm_page_prot)) {
unlock_kernel();
return -EAGAIN;
}
diff --git a/drivers/sound/sonicvibes.c b/drivers/sound/sonicvibes.c
index f3f86b354..f2784bf1f 100644
--- a/drivers/sound/sonicvibes.c
+++ b/drivers/sound/sonicvibes.c
@@ -1549,7 +1549,7 @@ static int sv_mmap(struct file *file, struct vm_area_struct *vma)
if (size > (PAGE_SIZE << db->buforder))
goto out;
ret = -EAGAIN;
- if (remap_page_range(vma->vm_start, virt_to_phys(db->rawbuf), size, vma->vm_page_prot))
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(db->rawbuf), size, vma->vm_page_prot))
goto out;
db->mapped = 1;
ret = 0;
diff --git a/drivers/sound/soundcard.c b/drivers/sound/soundcard.c
index 55a99a5e7..4f9d27b58 100644
--- a/drivers/sound/soundcard.c
+++ b/drivers/sound/soundcard.c
@@ -474,7 +474,7 @@ static int sound_mmap(struct file *file, struct vm_area_struct *vma)
if (size != dmap->bytes_in_use) {
printk(KERN_WARNING "Sound: mmap() size = %ld. Should be %d\n", size, dmap->bytes_in_use);
}
- if (remap_page_range(vma->vm_start, virt_to_phys(dmap->raw_buf),
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(dmap->raw_buf),
vma->vm_end - vma->vm_start,
vma->vm_page_prot)) {
unlock_kernel();
diff --git a/drivers/sound/trident.c b/drivers/sound/trident.c
index c68f78547..c402dfb12 100644
--- a/drivers/sound/trident.c
+++ b/drivers/sound/trident.c
@@ -2074,7 +2074,7 @@ static int trident_mmap(struct file *file, struct vm_area_struct *vma)
if (size > (PAGE_SIZE << dmabuf->buforder))
goto out;
ret = -EAGAIN;
- if (remap_page_range(vma->vm_start, virt_to_phys(dmabuf->rawbuf),
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(dmabuf->rawbuf),
size, vma->vm_page_prot))
goto out;
dmabuf->mapped = 1;
diff --git a/drivers/sound/ymfpci.c b/drivers/sound/ymfpci.c
index 3a0ca9a70..adb7d9dad 100644
--- a/drivers/sound/ymfpci.c
+++ b/drivers/sound/ymfpci.c
@@ -1503,7 +1503,7 @@ static int ymf_mmap(struct file *file, struct vm_area_struct *vma)
size = vma->vm_end - vma->vm_start;
if (size > (PAGE_SIZE << dmabuf->buforder))
return -EINVAL;
- if (remap_page_range(vma->vm_start, virt_to_phys(dmabuf->rawbuf),
+ if (remap_page_range(vma, vma->vm_start, virt_to_phys(dmabuf->rawbuf),
size, vma->vm_page_prot))
return -EAGAIN;
dmabuf->mapped = 1;
diff --git a/drivers/usb/audio.c b/drivers/usb/audio.c
index 593e4671d..d2b88390f 100644
--- a/drivers/usb/audio.c
+++ b/drivers/usb/audio.c
@@ -510,7 +510,7 @@ static int dmabuf_init(struct dmabuf *db)
return 0;
}
-static int dmabuf_mmap(struct dmabuf *db, unsigned long start, unsigned long size, pgprot_t prot)
+static int dmabuf_mmap(struct vm_area_struct *vma, struct dmabuf *db, unsigned long start, unsigned long size, pgprot_t prot)
{
unsigned int nr;
@@ -522,7 +522,7 @@ static int dmabuf_mmap(struct dmabuf *db, unsigned long start, unsigned long siz
return -EINVAL;
db->mapped = 1;
for(nr = 0; nr < size; nr++) {
- if (remap_page_range(start, virt_to_phys(db->sgbuf[nr]), PAGE_SIZE, prot))
+ if (remap_page_range(vma, start, virt_to_phys(db->sgbuf[nr]), PAGE_SIZE, prot))
return -EAGAIN;
start += PAGE_SIZE;
}
@@ -2341,7 +2341,7 @@ static int usb_audio_mmap(struct file *file, struct vm_area_struct *vma)
if (vma->vm_pgoff != 0)
goto out;
- ret = dmabuf_mmap(db, vma->vm_start, vma->vm_end - vma->vm_start, vma->vm_page_prot);
+ ret = dmabuf_mmap(vma, db, vma->vm_start, vma->vm_end - vma->vm_start, vma->vm_page_prot);
out:
unlock_kernel();
return ret;
diff --git a/drivers/usb/ov511.c b/drivers/usb/ov511.c
index a1e20fda8..f6cebd2e7 100644
--- a/drivers/usb/ov511.c
+++ b/drivers/usb/ov511.c
@@ -2751,7 +2751,7 @@ restart:
return count;
}
-static int ov511_mmap(struct video_device *dev, const char *adr,
+static int ov511_mmap(struct vm_area_struct *vma, struct video_device *dev, const char *adr,
unsigned long size)
{
struct usb_ov511 *ov511 = (struct usb_ov511 *)dev;
@@ -2769,7 +2769,7 @@ static int ov511_mmap(struct video_device *dev, const char *adr,
pos = (unsigned long)ov511->fbuf;
while (size > 0) {
page = kvirt_to_pa(pos);
- if (remap_page_range(start, page, PAGE_SIZE, PAGE_SHARED))
+ if (remap_page_range(vma, start, page, PAGE_SIZE, PAGE_SHARED))
return -EAGAIN;
start += PAGE_SIZE;
pos += PAGE_SIZE;
diff --git a/drivers/usb/pwc-if.c b/drivers/usb/pwc-if.c
index 7acd2d2be..9c7e10b98 100644
--- a/drivers/usb/pwc-if.c
+++ b/drivers/usb/pwc-if.c
@@ -120,7 +120,7 @@ static long pwc_video_read(struct video_device *vdev, char *buf, unsigned long c
static long pwc_video_write(struct video_device *vdev, const char *buf, unsigned long count, int noblock);
static unsigned int pwc_video_poll(struct video_device *vdev, struct file *file, poll_table *wait);
static int pwc_video_ioctl(struct video_device *vdev, unsigned int cmd, void *arg);
-static int pwc_video_mmap(struct video_device *dev, const char *adr, unsigned long size);
+static int pwc_video_mmap(struct vm_area_struct *vma, struct video_device *dev, const char *adr, unsigned long size);
static struct video_device pwc_template = {
owner: THIS_MODULE,
@@ -1568,7 +1568,7 @@ static int pwc_video_ioctl(struct video_device *vdev, unsigned int cmd, void *ar
return 0;
}
-static int pwc_video_mmap(struct video_device *vdev, const char *adr, unsigned long size)
+static int pwc_video_mmap(struct vm_area_struct *vma, struct video_device *vdev, const char *adr, unsigned long size)
{
struct pwc_device *pdev;
unsigned long start = (unsigned long)adr;
@@ -1581,7 +1581,7 @@ static int pwc_video_mmap(struct video_device *vdev, const char *adr, unsigned l
pos = (unsigned long)pdev->image_data;
while (size > 0) {
page = kvirt_to_pa(pos);
- if (remap_page_range(start, page, PAGE_SIZE, PAGE_SHARED))
+ if (remap_page_range(vma, start, page, PAGE_SIZE, PAGE_SHARED))
return -EAGAIN;
start += PAGE_SIZE;
diff --git a/drivers/usb/se401.c b/drivers/usb/se401.c
index 91a3dc0a6..c6747eb9c 100644
--- a/drivers/usb/se401.c
+++ b/drivers/usb/se401.c
@@ -1354,7 +1354,7 @@ static long se401_read(struct video_device *dev, char *buf, unsigned long count,
return realcount;
}
-static int se401_mmap(struct video_device *dev, const char *adr,
+static int se401_mmap(struct vm_area_struct *vma, struct video_device *dev, const char *adr,
unsigned long size)
{
struct usb_se401 *se401 = (struct usb_se401 *)dev;
@@ -1374,7 +1374,7 @@ static int se401_mmap(struct video_device *dev, const char *adr,
pos = (unsigned long)se401->fbuf;
while (size > 0) {
page = kvirt_to_pa(pos);
- if (remap_page_range(start, page, PAGE_SIZE, PAGE_SHARED)) {
+ if (remap_page_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) {
up(&se401->lock);
return -EAGAIN;
}
diff --git a/drivers/usb/usbvideo.c b/drivers/usb/usbvideo.c
index c40e6c579..d6094f3b0 100644
--- a/drivers/usb/usbvideo.c
+++ b/drivers/usb/usbvideo.c
@@ -1184,7 +1184,7 @@ long usbvideo_v4l_write(struct video_device *dev, const char *buf,
return -EINVAL;
}
-int usbvideo_v4l_mmap(struct video_device *dev, const char *adr, unsigned long size)
+int usbvideo_v4l_mmap(struct vm_area_struct *vma, struct video_device *dev, const char *adr, unsigned long size)
{
uvd_t *uvd = (uvd_t *) dev;
unsigned long start = (unsigned long) adr;
@@ -1199,7 +1199,7 @@ int usbvideo_v4l_mmap(struct video_device *dev, const char *adr, unsigned long s
pos = (unsigned long) uvd->fbuf;
while (size > 0) {
page = usbvideo_kvirt_to_pa(pos);
- if (remap_page_range(start, page, PAGE_SIZE, PAGE_SHARED))
+ if (remap_page_range(vma, start, page, PAGE_SIZE, PAGE_SHARED))
return -EAGAIN;
start += PAGE_SIZE;
diff --git a/drivers/usb/usbvideo.h b/drivers/usb/usbvideo.h
index b37a9f826..5ff4cf3ec 100644
--- a/drivers/usb/usbvideo.h
+++ b/drivers/usb/usbvideo.h
@@ -349,7 +349,7 @@ void usbvideo_CameraRelease(uvd_t *uvd);
void usbvideo_v4l_close(struct video_device *dev);
int usbvideo_v4l_initialize(struct video_device *dev);
int usbvideo_v4l_ioctl(struct video_device *dev, unsigned int cmd, void *arg);
-int usbvideo_v4l_mmap(struct video_device *dev, const char *adr, unsigned long size);
+int usbvideo_v4l_mmap(struct vm_area_struct *vma, struct video_device *dev, const char *adr, unsigned long size);
int usbvideo_v4l_open(struct video_device *dev, int flags);
long usbvideo_v4l_read(struct video_device *dev, char *buf,
unsigned long count, int noblock);
diff --git a/drivers/video/acornfb.c b/drivers/video/acornfb.c
index 50391f821..8a9a1a889 100644
--- a/drivers/video/acornfb.c
+++ b/drivers/video/acornfb.c
@@ -1152,7 +1152,7 @@ acornfb_mmap(struct fb_info *info, struct file *file, struct vm_area_struct *vma
* some updates to the screen occasionally, but process switches
* should cause the caches and buffers to be flushed often enough.
*/
- if (io_remap_page_range(vma->vm_start, off,
+ if (io_remap_page_range(vma, vma->vm_start, off,
vma->vm_end - vma->vm_start,
vma->vm_page_prot))
return -EAGAIN;
diff --git a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c
index 207fa355e..ee3e4659c 100644
--- a/drivers/video/aty/atyfb_base.c
+++ b/drivers/video/aty/atyfb_base.c
@@ -1416,7 +1416,7 @@ static int atyfb_mmap(struct fb_info *info, struct file *file,
pgprot_val(vma->vm_page_prot) &= ~(fb->mmap_map[i].prot_mask);
pgprot_val(vma->vm_page_prot) |= fb->mmap_map[i].prot_flag;
- if (remap_page_range(vma->vm_start + page, map_offset,
+ if (remap_page_range(vma, vma->vm_start + page, map_offset,
map_size, vma->vm_page_prot))
return -EAGAIN;
diff --git a/drivers/video/controlfb.c b/drivers/video/controlfb.c
index 2535b2d6c..3b42d082a 100644
--- a/drivers/video/controlfb.c
+++ b/drivers/video/controlfb.c
@@ -444,7 +444,7 @@ static int control_mmap(struct fb_info *info, struct file *file,
return -EINVAL;
off += start;
vma->vm_pgoff = off >> PAGE_SHIFT;
- if (io_remap_page_range(vma->vm_start, off,
+ if (io_remap_page_range(vma, vma->vm_start, off,
vma->vm_end - vma->vm_start, vma->vm_page_prot))
return -EAGAIN;
diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
index 8f445aff7..0c00d0cde 100644
--- a/drivers/video/fbmem.c
+++ b/drivers/video/fbmem.c
@@ -578,7 +578,7 @@ fb_mmap(struct file *file, struct vm_area_struct * vma)
vma->vm_pgoff = off >> PAGE_SHIFT;
#if defined(__sparc_v9__)
vma->vm_flags |= (VM_SHM | VM_LOCKED);
- if (io_remap_page_range(vma->vm_start, off,
+ if (io_remap_page_range(vma, vma->vm_start, off,
vma->vm_end - vma->vm_start, vma->vm_page_prot, 0))
return -EAGAIN;
vma->vm_flags |= VM_IO;
@@ -614,7 +614,7 @@ fb_mmap(struct file *file, struct vm_area_struct * vma)
#else
#warning What do we have to do here??
#endif
- if (io_remap_page_range(vma->vm_start, off,
+ if (io_remap_page_range(vma, vma->vm_start, off,
vma->vm_end - vma->vm_start, vma->vm_page_prot))
return -EAGAIN;
#endif /* !__sparc_v9__ */
diff --git a/drivers/video/igafb.c b/drivers/video/igafb.c
index 673e96557..8daf36364 100644
--- a/drivers/video/igafb.c
+++ b/drivers/video/igafb.c
@@ -283,7 +283,7 @@ static int igafb_mmap(struct fb_info *info, struct file *file,
pgprot_val(vma->vm_page_prot) &= ~(fb->mmap_map[i].prot_mask);
pgprot_val(vma->vm_page_prot) |= fb->mmap_map[i].prot_flag;
- if (remap_page_range(vma->vm_start + page, map_offset,
+ if (remap_page_range(vma, vma->vm_start + page, map_offset,
map_size, vma->vm_page_prot))
return -EAGAIN;
diff --git a/drivers/video/sbusfb.c b/drivers/video/sbusfb.c
index 34ee6dd29..3bab32a22 100644
--- a/drivers/video/sbusfb.c
+++ b/drivers/video/sbusfb.c
@@ -214,7 +214,7 @@ static int sbusfb_mmap(struct fb_info *info, struct file *file,
}
if (page + map_size > size)
map_size = size - page;
- r = io_remap_page_range (vma->vm_start+page, map_offset, map_size, vma->vm_page_prot, fb->iospace);
+ r = io_remap_page_range(vma, vma->vm_start+page, map_offset, map_size, vma->vm_page_prot, fb->iospace);
if (r)
return -EAGAIN;
page += map_size;
diff --git a/drivers/video/sgivwfb.c b/drivers/video/sgivwfb.c
index 2d24d9f25..89f8a67f5 100644
--- a/drivers/video/sgivwfb.c
+++ b/drivers/video/sgivwfb.c
@@ -847,7 +847,7 @@ static int sgivwfb_mmap(struct fb_info *info, struct file *file,
offset += sgivwfb_mem_phys;
pgprot_val(vma->vm_page_prot) = pgprot_val(vma->vm_page_prot) | _PAGE_PCD;
vma->vm_flags |= VM_IO;
- if (remap_page_range(vma->vm_start, offset, size, vma->vm_page_prot))
+ if (remap_page_range(vma, vma->vm_start, offset, size, vma->vm_page_prot))
return -EAGAIN;
vma->vm_file = file;
printk(KERN_DEBUG "sgivwfb: mmap framebuffer P(%lx)->V(%lx)\n", offset, vma->vm_start);
diff --git a/drivers/video/sis/sis_main.c b/drivers/video/sis/sis_main.c
index 828f6f8d3..cf4226bf6 100644
--- a/drivers/video/sis/sis_main.c
+++ b/drivers/video/sis/sis_main.c
@@ -2175,7 +2175,7 @@ static int sisfb_mmap (struct fb_info *info, struct file *file, struct vm_area_s
if (boot_cpu_data.x86 > 3)
pgprot_val (vma->vm_page_prot) |= _PAGE_PCD;
#endif
- if (io_remap_page_range(vma->vm_start, off, vma->vm_end - vma->vm_start, vma->vm_page_prot))
+ if (io_remap_page_range(vma, vma->vm_start, off, vma->vm_end - vma->vm_start, vma->vm_page_prot))
return -EAGAIN;
return 0;
diff --git a/include/asm-alpha/pgalloc.h b/include/asm-alpha/pgalloc.h
index af01b68cd..f00acfd42 100644
--- a/include/asm-alpha/pgalloc.h
+++ b/include/asm-alpha/pgalloc.h
@@ -14,7 +14,7 @@ extern void __load_new_mm_context(struct mm_struct *);
/* Caches aren't brain-dead on the Alpha. */
#define flush_cache_all() do { } while (0)
#define flush_cache_mm(mm) do { } while (0)
-#define flush_cache_range(mm, start, end) do { } while (0)
+#define flush_cache_range(vma, start, end) do { } while (0)
#define flush_cache_page(vma, vmaddr) do { } while (0)
#define flush_page_to_ram(page) do { } while (0)
#define flush_dcache_page(page) do { } while (0)
@@ -206,10 +206,10 @@ static inline void flush_tlb_page(struct vm_area_struct *vma,
* Flush a specified range of user mapping: on the
* Alpha we flush the whole user tlb.
*/
-static inline void flush_tlb_range(struct mm_struct *mm,
+static inline void flush_tlb_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end)
{
- flush_tlb_mm(mm);
+ flush_tlb_mm(vma->vm_mm);
}
#else /* CONFIG_SMP */
@@ -217,7 +217,7 @@ static inline void flush_tlb_range(struct mm_struct *mm,
extern void flush_tlb_all(void);
extern void flush_tlb_mm(struct mm_struct *);
extern void flush_tlb_page(struct vm_area_struct *, unsigned long);
-extern void flush_tlb_range(struct mm_struct *, unsigned long, unsigned long);
+extern void flush_tlb_range(struct vm_area_struct *, unsigned long, unsigned long);
#endif /* CONFIG_SMP */
diff --git a/include/asm-alpha/pgtable.h b/include/asm-alpha/pgtable.h
index 0132a0afd..c3915880b 100644
--- a/include/asm-alpha/pgtable.h
+++ b/include/asm-alpha/pgtable.h
@@ -344,8 +344,8 @@ extern inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
#define kern_addr_valid(addr) (1)
#endif
-#define io_remap_page_range(start, busaddr, size, prot) \
- remap_page_range(start, virt_to_phys(__ioremap(busaddr, size)), size, prot)
+#define io_remap_page_range(vma, start, busaddr, size, prot) \
+ remap_page_range(vma, start, virt_to_phys(__ioremap(busaddr, size)), size, prot)
#define pte_ERROR(e) \
printk("%s:%d: bad pte %016lx.\n", __FILE__, __LINE__, pte_val(e))
diff --git a/include/asm-arm/io.h b/include/asm-arm/io.h
index 91e50dc21..a6fb3fcda 100644
--- a/include/asm-arm/io.h
+++ b/include/asm-arm/io.h
@@ -223,8 +223,8 @@ out:
* remap a physical address `phys' of size `size' with page protection `prot'
* into virtual address `from'
*/
-#define io_remap_page_range(from,phys,size,prot) \
- remap_page_range(from,phys,size,prot)
+#define io_remap_page_range(vma,from,phys,size,prot) \
+ remap_page_range(vma,from,phys,size,prot)
/*
diff --git a/include/asm-arm/proc-armo/cache.h b/include/asm-arm/proc-armo/cache.h
index b35b40438..3d87ca384 100644
--- a/include/asm-arm/proc-armo/cache.h
+++ b/include/asm-arm/proc-armo/cache.h
@@ -11,7 +11,7 @@
*/
#define flush_cache_all() do { } while (0)
#define flush_cache_mm(mm) do { } while (0)
-#define flush_cache_range(mm,start,end) do { } while (0)
+#define flush_cache_range(vma,start,end) do { } while (0)
#define flush_cache_page(vma,vmaddr) do { } while (0)
#define flush_page_to_ram(page) do { } while (0)
@@ -34,12 +34,12 @@
* - flush_tlb_all() flushes all processes TLBs
* - flush_tlb_mm(mm) flushes the specified mm context TLB's
* - flush_tlb_page(vma, vmaddr) flushes one page
- * - flush_tlb_range(mm, start, end) flushes a range of pages
+ * - flush_tlb_range(vma, start, end) flushes a range of pages
*/
#define flush_tlb_all() memc_update_all()
#define flush_tlb_mm(mm) memc_update_mm(mm)
-#define flush_tlb_range(mm,start,end) \
- do { memc_update_mm(mm); (void)(start); (void)(end); } while (0)
+#define flush_tlb_range(vma,start,end) \
+ do { memc_update_mm(vma->vm_mm); (void)(start); (void)(end); } while (0)
#define flush_tlb_page(vma, vmaddr) do { } while (0)
/*
diff --git a/include/asm-arm/proc-armv/cache.h b/include/asm-arm/proc-armv/cache.h
index feb02f086..6547b3dc3 100644
--- a/include/asm-arm/proc-armv/cache.h
+++ b/include/asm-arm/proc-armv/cache.h
@@ -42,9 +42,9 @@
cpu_cache_clean_invalidate_all(); \
} while (0)
-#define flush_cache_range(_mm,_start,_end) \
+#define flush_cache_range(_vma,_start,_end) \
do { \
- if ((_mm) == current->mm) \
+ if ((_vma)->vm_mm == current->mm) \
cpu_cache_clean_invalidate_range((_start), (_end), 1); \
} while (0)
@@ -183,7 +183,7 @@ static inline void flush_dcache_page(struct page *page)
* - flush_tlb_all() flushes all processes TLBs
* - flush_tlb_mm(mm) flushes the specified mm context TLB's
* - flush_tlb_page(vma, vmaddr) flushes TLB for specified page
- * - flush_tlb_range(mm, start, end) flushes TLB for specified range of pages
+ * - flush_tlb_range(vma, start, end) flushes TLB for specified range of pages
*
* We drain the write buffer in here to ensure that the page tables in ram
* are really up to date. It is more efficient to do this here...
@@ -217,9 +217,9 @@ static inline void flush_dcache_page(struct page *page)
*
* _mm may not be current->active_mm, but may not be NULL.
*/
-#define flush_tlb_range(_mm,_start,_end) \
+#define flush_tlb_range(_vma,_start,_end) \
do { \
- if ((_mm) == current->active_mm) \
+ if ((_mm)->vm_mm == current->active_mm) \
cpu_tlb_invalidate_range((_start), (_end)); \
} while (0)
diff --git a/include/asm-cris/pgtable.h b/include/asm-cris/pgtable.h
index 2f2955b8a..a99f35703 100644
--- a/include/asm-cris/pgtable.h
+++ b/include/asm-cris/pgtable.h
@@ -111,7 +111,7 @@
*/
#define flush_cache_all() do { } while (0)
#define flush_cache_mm(mm) do { } while (0)
-#define flush_cache_range(mm, start, end) do { } while (0)
+#define flush_cache_range(vma, start, end) do { } while (0)
#define flush_cache_page(vma, vmaddr) do { } while (0)
#define flush_page_to_ram(page) do { } while (0)
#define flush_dcache_page(page) do { } while (0)
@@ -125,7 +125,7 @@
* - flush_tlb_all() flushes all processes TLBs
* - flush_tlb_mm(mm) flushes the specified mm context TLB's
* - flush_tlb_page(vma, vmaddr) flushes one page
- * - flush_tlb_range(mm, start, end) flushes a range of pages
+ * - flush_tlb_range(vma, start, end) flushes a range of pages
*
*/
@@ -133,7 +133,7 @@ extern void flush_tlb_all(void);
extern void flush_tlb_mm(struct mm_struct *mm);
extern void flush_tlb_page(struct vm_area_struct *vma,
unsigned long addr);
-extern void flush_tlb_range(struct mm_struct *mm,
+extern void flush_tlb_range(struct vm_area_struct *vma,
unsigned long start,
unsigned long end);
diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h
index c427f7eee..eafce6e44 100644
--- a/include/asm-generic/tlb.h
+++ b/include/asm-generic/tlb.h
@@ -25,7 +25,7 @@
* shootdown.
*/
typedef struct free_pte_ctx {
- struct mm_struct *mm;
+ struct vm_area_struct *vma;
unsigned long nr; /* set to ~0UL means fast mode */
unsigned long start_addr, end_addr;
pte_t ptes[FREE_PTE_NR];
@@ -37,11 +37,12 @@ extern mmu_gather_t mmu_gathers[NR_CPUS];
/* tlb_gather_mmu
* Return a pointer to an initialized mmu_gather_t.
*/
-static inline mmu_gather_t *tlb_gather_mmu(struct mm_struct *mm)
+static inline mmu_gather_t *tlb_gather_mmu(struct vm_area_struct *vma)
{
mmu_gather_t *tlb = &mmu_gathers[smp_processor_id()];
+ struct mm_struct *mm = vma->vm_mm;
- tlb->mm = mm;
+ tlb->vma = vma;
/* Use fast mode if there is only one user of this mm (this process) */
tlb->nr = (atomic_read(&(mm)->mm_users) == 1) ? ~0UL : 0UL;
return tlb;
@@ -69,7 +70,7 @@ static inline mmu_gather_t *tlb_gather_mmu(struct mm_struct *mm)
/* tlb_finish_mmu
* Called at the end of the shootdown operation to free up any resources
- * that were required. The page talbe lock is still held at this point.
+ * that were required. The page table lock is still held at this point.
*/
static inline void tlb_finish_mmu(struct free_pte_ctx *ctx, unsigned long start, unsigned long end)
{
@@ -77,13 +78,13 @@ static inline void tlb_finish_mmu(struct free_pte_ctx *ctx, unsigned long start,
/* Handle the fast case first. */
if (ctx->nr == ~0UL) {
- flush_tlb_range(ctx->mm, start, end);
+ flush_tlb_range(ctx->vma, start, end);
return;
}
nr = ctx->nr;
ctx->nr = 0;
if (nr)
- flush_tlb_range(ctx->mm, ctx->start_addr, ctx->end_addr);
+ flush_tlb_range(ctx->vma, ctx->start_addr, ctx->end_addr);
for (i=0; i < nr; i++) {
pte_t pte = ctx->ptes[i];
__free_pte(pte);
@@ -96,9 +97,9 @@ static inline void tlb_finish_mmu(struct free_pte_ctx *ctx, unsigned long start,
* attempt to get gcc to generate optimal code since this code is run on each
* page in a process at exit.
*/
-typedef struct mm_struct mmu_gather_t;
+typedef struct vm_area_struct mmu_gather_t;
-#define tlb_gather_mmu(mm) (mm)
+#define tlb_gather_mmu(vma) (vma)
#define tlb_finish_mmu(tlb, start, end) flush_tlb_range(tlb, start, end)
#define tlb_remove_page(tlb, ptep, addr) do {\
pte_t __pte = *(ptep);\
diff --git a/include/asm-i386/pgalloc.h b/include/asm-i386/pgalloc.h
index 988c26a75..63a47164f 100644
--- a/include/asm-i386/pgalloc.h
+++ b/include/asm-i386/pgalloc.h
@@ -165,7 +165,7 @@ extern int do_check_pgt_cache(int, int);
* - flush_tlb_all() flushes all processes TLBs
* - flush_tlb_mm(mm) flushes the specified mm context TLB's
* - flush_tlb_page(vma, vmaddr) flushes one page
- * - flush_tlb_range(mm, start, end) flushes a range of pages
+ * - flush_tlb_range(vma, start, end) flushes a range of pages
* - flush_tlb_pgtables(mm, start, end) flushes a range of page tables
*
* ..but the i386 has somewhat limited tlb flushing capabilities,
@@ -191,10 +191,10 @@ static inline void flush_tlb_page(struct vm_area_struct *vma,
__flush_tlb_one(addr);
}
-static inline void flush_tlb_range(struct mm_struct *mm,
+static inline void flush_tlb_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end)
{
- if (mm == current->active_mm)
+ if (vma->vm_mm == current->active_mm)
__flush_tlb();
}
@@ -212,9 +212,9 @@ extern void flush_tlb_page(struct vm_area_struct *, unsigned long);
#define flush_tlb() flush_tlb_current_task()
-static inline void flush_tlb_range(struct mm_struct * mm, unsigned long start, unsigned long end)
+static inline void flush_tlb_range(struct vm_area_struct * vma, unsigned long start, unsigned long end)
{
- flush_tlb_mm(mm);
+ flush_tlb_mm(vma->vm_mm);
}
#define TLBSTATE_OK 1
diff --git a/include/asm-i386/pgtable.h b/include/asm-i386/pgtable.h
index 6f99b61e8..c22d56a17 100644
--- a/include/asm-i386/pgtable.h
+++ b/include/asm-i386/pgtable.h
@@ -27,7 +27,7 @@ extern void paging_init(void);
/* Caches aren't brain-dead on the intel. */
#define flush_cache_all() do { } while (0)
#define flush_cache_mm(mm) do { } while (0)
-#define flush_cache_range(mm, start, end) do { } while (0)
+#define flush_cache_range(vma, start, end) do { } while (0)
#define flush_cache_page(vma, vmaddr) do { } while (0)
#define flush_page_to_ram(page) do { } while (0)
#define flush_dcache_page(page) do { } while (0)
diff --git a/include/asm-ia64/pgalloc.h b/include/asm-ia64/pgalloc.h
index 671ab4351..8ed75d3a6 100644
--- a/include/asm-ia64/pgalloc.h
+++ b/include/asm-ia64/pgalloc.h
@@ -181,7 +181,7 @@ flush_tlb_mm (struct mm_struct *mm)
}
}
-extern void flush_tlb_range (struct mm_struct *mm, unsigned long start, unsigned long end);
+extern void flush_tlb_range (struct vm_area_struct *vma, unsigned long start, unsigned long end);
/*
* Page-granular tlb flush.
@@ -190,7 +190,7 @@ static inline void
flush_tlb_page (struct vm_area_struct *vma, unsigned long addr)
{
#ifdef CONFIG_SMP
- flush_tlb_range(vma->vm_mm, (addr & PAGE_MASK), (addr & PAGE_MASK) + PAGE_SIZE);
+ flush_tlb_range(vma, (addr & PAGE_MASK), (addr & PAGE_MASK) + PAGE_SIZE);
#else
if (vma->vm_mm == current->active_mm)
asm volatile ("ptc.l %0,%1" :: "r"(addr), "r"(PAGE_SHIFT << 2) : "memory");
@@ -204,9 +204,12 @@ flush_tlb_page (struct vm_area_struct *vma, unsigned long addr)
static inline void
flush_tlb_pgtables (struct mm_struct *mm, unsigned long start, unsigned long end)
{
+ struct vm_area_struct vma;
+
if (rgn_index(start) != rgn_index(end))
printk("flush_tlb_pgtables: can't flush across regions!!\n");
- flush_tlb_range(mm, ia64_thash(start), ia64_thash(end));
+ vma.vm_mm = mm;
+ flush_tlb_range(&vma, ia64_thash(start), ia64_thash(end));
}
/*
@@ -217,7 +220,7 @@ flush_tlb_pgtables (struct mm_struct *mm, unsigned long start, unsigned long end
/* Caches aren't brain-dead on the IA-64. */
#define flush_cache_all() do { } while (0)
#define flush_cache_mm(mm) do { } while (0)
-#define flush_cache_range(mm, start, end) do { } while (0)
+#define flush_cache_range(vma, start, end) do { } while (0)
#define flush_cache_page(vma, vmaddr) do { } while (0)
#define flush_page_to_ram(page) do { } while (0)
diff --git a/include/asm-m68k/motorola_pgalloc.h b/include/asm-m68k/motorola_pgalloc.h
index b6d667159..fa6585fbc 100644
--- a/include/asm-m68k/motorola_pgalloc.h
+++ b/include/asm-m68k/motorola_pgalloc.h
@@ -241,10 +241,10 @@ static inline void flush_tlb_page(struct vm_area_struct *vma, unsigned long addr
__flush_tlb_one(addr);
}
-static inline void flush_tlb_range(struct mm_struct *mm,
+static inline void flush_tlb_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end)
{
- if (mm == current->mm)
+ if (vma->vm_mm == current->mm)
__flush_tlb();
}
diff --git a/include/asm-m68k/pgalloc.h b/include/asm-m68k/pgalloc.h
index 04e3b3eca..f67a54a35 100644
--- a/include/asm-m68k/pgalloc.h
+++ b/include/asm-m68k/pgalloc.h
@@ -89,11 +89,11 @@ extern inline void flush_cache_mm(struct mm_struct *mm)
__flush_cache_030();
}
-extern inline void flush_cache_range(struct mm_struct *mm,
+extern inline void flush_cache_range(struct vm_area_struct *vma,
unsigned long start,
unsigned long end)
{
- if (mm == current->mm)
+ if (vma->vm_mm == current->mm)
__flush_cache_030();
}
diff --git a/include/asm-m68k/sun3_pgalloc.h b/include/asm-m68k/sun3_pgalloc.h
index bb069bbcf..c9eee306f 100644
--- a/include/asm-m68k/sun3_pgalloc.h
+++ b/include/asm-m68k/sun3_pgalloc.h
@@ -216,9 +216,10 @@ static inline void flush_tlb_page (struct vm_area_struct *vma,
}
/* Flush a range of pages from TLB. */
-static inline void flush_tlb_range (struct mm_struct *mm,
+static inline void flush_tlb_range (struct vm_area_struct *vma,
unsigned long start, unsigned long end)
{
+ struct mm_struct *mm = vma->vm_mm;
unsigned char seg, oldctx;
start &= ~SUN3_PMEG_MASK;
diff --git a/include/asm-mips/gfx.h b/include/asm-mips/gfx.h
index 7cda7a69f..38b0ad5d0 100644
--- a/include/asm-mips/gfx.h
+++ b/include/asm-mips/gfx.h
@@ -48,9 +48,9 @@ struct gfx_attach_board_args {
#ifdef __KERNEL__
/* umap.c */
-extern void remove_mapping (struct task_struct *, unsigned long, unsigned long);
+extern void remove_mapping (struct vm_area_struct *vma, struct task_struct *, unsigned long, unsigned long);
extern void *vmalloc_uncached (unsigned long size);
-extern int vmap_page_range (unsigned long from, unsigned long size, unsigned long vaddr);
+extern int vmap_page_range (struct vm_area_struct *vma, unsigned long from, unsigned long size, unsigned long vaddr);
#endif
#endif /* _ASM_GFX_H */
diff --git a/include/asm-mips/pgalloc.h b/include/asm-mips/pgalloc.h
index 66c12260f..9492a50da 100644
--- a/include/asm-mips/pgalloc.h
+++ b/include/asm-mips/pgalloc.h
@@ -16,12 +16,12 @@
*
* - flush_tlb_all() flushes all processes TLB entries
* - flush_tlb_mm(mm) flushes the specified mm context TLB entries
- * - flush_tlb_page(mm, vmaddr) flushes a single page
- * - flush_tlb_range(mm, start, end) flushes a range of pages
+ * - flush_tlb_page(vma, vmaddr) flushes a single page
+ * - flush_tlb_range(vma, start, end) flushes a range of pages
*/
extern void flush_tlb_all(void);
extern void flush_tlb_mm(struct mm_struct *mm);
-extern void flush_tlb_range(struct mm_struct *mm, unsigned long start,
+extern void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end);
extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long page);
diff --git a/include/asm-mips/pgtable.h b/include/asm-mips/pgtable.h
index 71232fe8f..afc0148e9 100644
--- a/include/asm-mips/pgtable.h
+++ b/include/asm-mips/pgtable.h
@@ -23,14 +23,14 @@
* - flush_cache_all() flushes entire cache
* - flush_cache_mm(mm) flushes the specified mm context's cache lines
* - flush_cache_page(mm, vmaddr) flushes a single page
- * - flush_cache_range(mm, start, end) flushes a range of pages
+ * - flush_cache_range(vma, start, end) flushes a range of pages
* - flush_page_to_ram(page) write back kernel page to ram
* - flush_icache_range(start, end) flush a range of instructions
*/
extern void (*_flush_cache_all)(void);
extern void (*___flush_cache_all)(void);
extern void (*_flush_cache_mm)(struct mm_struct *mm);
-extern void (*_flush_cache_range)(struct mm_struct *mm, unsigned long start,
+extern void (*_flush_cache_range)(struct vm_area_struct *vma, unsigned long start,
unsigned long end);
extern void (*_flush_cache_page)(struct vm_area_struct *vma, unsigned long page);
extern void (*_flush_cache_sigtramp)(unsigned long addr);
@@ -44,7 +44,7 @@ extern void (*_flush_icache_page)(struct vm_area_struct *vma,
#define flush_cache_all() _flush_cache_all()
#define __flush_cache_all() ___flush_cache_all()
#define flush_cache_mm(mm) _flush_cache_mm(mm)
-#define flush_cache_range(mm,start,end) _flush_cache_range(mm,start,end)
+#define flush_cache_range(vma,start,end) _flush_cache_range(vma,start,end)
#define flush_cache_page(vma,page) _flush_cache_page(vma, page)
#define flush_cache_sigtramp(addr) _flush_cache_sigtramp(addr)
#define flush_page_to_ram(page) _flush_page_to_ram(page)
diff --git a/include/asm-mips/umap.h b/include/asm-mips/umap.h
index afa524b10..940148ee2 100644
--- a/include/asm-mips/umap.h
+++ b/include/asm-mips/umap.h
@@ -1,7 +1,7 @@
#ifndef __MIPS_UMAP_H
#define __MIPS_UMAP_H
-void remove_mapping (struct task_struct *task, unsigned long start,
+void remove_mapping (struct vm_area_struct *vma, struct task_struct *task, unsigned long start,
unsigned long end);
#endif
diff --git a/include/asm-mips64/gfx.h b/include/asm-mips64/gfx.h
index 3c701b74c..38ded7211 100644
--- a/include/asm-mips64/gfx.h
+++ b/include/asm-mips64/gfx.h
@@ -47,9 +47,9 @@ struct gfx_attach_board_args {
#ifdef __KERNEL__
/* umap.c */
-extern void remove_mapping (struct task_struct *, unsigned long, unsigned long);
+extern void remove_mapping (struct vm_area_struct *vma, struct task_struct *, unsigned long, unsigned long);
extern void *vmalloc_uncached (unsigned long size);
-extern int vmap_page_range (unsigned long from, unsigned long size, unsigned long vaddr);
+extern int vmap_page_range (struct vm_area_struct *vma, unsigned long from, unsigned long size, unsigned long vaddr);
#endif
#endif /* _ASM_GFX_H */
diff --git a/include/asm-mips64/pgalloc.h b/include/asm-mips64/pgalloc.h
index 5954fff58..79b58408d 100644
--- a/include/asm-mips64/pgalloc.h
+++ b/include/asm-mips64/pgalloc.h
@@ -15,13 +15,13 @@
*
* - flush_tlb_all() flushes all processes TLB entries
* - flush_tlb_mm(mm) flushes the specified mm context TLB entries
- * - flush_tlb_page(mm, vmaddr) flushes a single page
- * - flush_tlb_range(mm, start, end) flushes a range of pages
+ * - flush_tlb_page(vma, vmaddr) flushes a single page
+ * - flush_tlb_range(vma, start, end) flushes a range of pages
* - flush_tlb_pgtables(mm, start, end) flushes a range of page tables
*/
extern void (*_flush_tlb_all)(void);
extern void (*_flush_tlb_mm)(struct mm_struct *mm);
-extern void (*_flush_tlb_range)(struct mm_struct *mm, unsigned long start,
+extern void (*_flush_tlb_range)(struct vm_area_struct *vma, unsigned long start,
unsigned long end);
extern void (*_flush_tlb_page)(struct vm_area_struct *vma, unsigned long page);
@@ -29,14 +29,14 @@ extern void (*_flush_tlb_page)(struct vm_area_struct *vma, unsigned long page);
#define flush_tlb_all() _flush_tlb_all()
#define flush_tlb_mm(mm) _flush_tlb_mm(mm)
-#define flush_tlb_range(mm,vmaddr,end) _flush_tlb_range(mm, vmaddr, end)
+#define flush_tlb_range(vma,vmaddr,end) _flush_tlb_range(vma, vmaddr, end)
#define flush_tlb_page(vma,page) _flush_tlb_page(vma, page)
#else /* CONFIG_SMP */
extern void flush_tlb_all(void);
extern void flush_tlb_mm(struct mm_struct *);
-extern void flush_tlb_range(struct mm_struct *, unsigned long, unsigned long);
+extern void flush_tlb_range(struct vm_area_struct *, unsigned long, unsigned long);
extern void flush_tlb_page(struct vm_area_struct *, unsigned long);
#endif /* CONFIG_SMP */
diff --git a/include/asm-mips64/pgtable.h b/include/asm-mips64/pgtable.h
index c4e31bbd1..6c35e0d93 100644
--- a/include/asm-mips64/pgtable.h
+++ b/include/asm-mips64/pgtable.h
@@ -24,11 +24,11 @@
* - flush_cache_all() flushes entire cache
* - flush_cache_mm(mm) flushes the specified mm context's cache lines
* - flush_cache_page(mm, vmaddr) flushes a single page
- * - flush_cache_range(mm, start, end) flushes a range of pages
+ * - flush_cache_range(vma, start, end) flushes a range of pages
* - flush_page_to_ram(page) write back kernel page to ram
*/
extern void (*_flush_cache_mm)(struct mm_struct *mm);
-extern void (*_flush_cache_range)(struct mm_struct *mm, unsigned long start,
+extern void (*_flush_cache_range)(struct vm_area_struct *vma, unsigned long start,
unsigned long end);
extern void (*_flush_cache_page)(struct vm_area_struct *vma, unsigned long page);
extern void (*_flush_page_to_ram)(struct page * page);
@@ -38,7 +38,7 @@ extern void (*_flush_page_to_ram)(struct page * page);
#ifndef CONFIG_CPU_R10000
#define flush_cache_mm(mm) _flush_cache_mm(mm)
-#define flush_cache_range(mm,start,end) _flush_cache_range(mm,start,end)
+#define flush_cache_range(vma,start,end) _flush_cache_range(vma,start,end)
#define flush_cache_page(vma,page) _flush_cache_page(vma, page)
#define flush_page_to_ram(page) _flush_page_to_ram(page)
@@ -62,7 +62,7 @@ do { \
*/
extern void andes_flush_icache_page(unsigned long);
#define flush_cache_mm(mm) do { } while(0)
-#define flush_cache_range(mm,start,end) do { } while(0)
+#define flush_cache_range(vma,start,end) do { } while(0)
#define flush_cache_page(vma,page) do { } while(0)
#define flush_page_to_ram(page) do { } while(0)
#define flush_icache_range(start, end) _flush_cache_l1()
diff --git a/include/asm-parisc/pgalloc.h b/include/asm-parisc/pgalloc.h
index 3fbabb0d3..d458ec27b 100644
--- a/include/asm-parisc/pgalloc.h
+++ b/include/asm-parisc/pgalloc.h
@@ -90,7 +90,7 @@ extern inline void flush_cache_mm(struct mm_struct *mm) {
}
#endif
-#define flush_cache_range(mm, start, end) do { \
+#define flush_cache_range(vma, start, end) do { \
__flush_dcache_range(start, (unsigned long)end - (unsigned long)start); \
__flush_icache_range(start, (unsigned long)end - (unsigned long)start); \
} while(0)
@@ -197,10 +197,10 @@ static inline void flush_tlb_page(struct vm_area_struct *vma,
}
-static inline void flush_tlb_range(struct mm_struct *mm,
+static inline void flush_tlb_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end)
{
- __flush_tlb_range(mm->context, start, end - start);
+ __flush_tlb_range(vma->vm_mm->context, start, end - start);
}
/*
diff --git a/include/asm-parisc/pgtable.h b/include/asm-parisc/pgtable.h
index 1e2fdf53e..1dfe59ef4 100644
--- a/include/asm-parisc/pgtable.h
+++ b/include/asm-parisc/pgtable.h
@@ -34,10 +34,10 @@ extern void kernel_set_cachemode(unsigned long addr,
#define cache_push(paddr, len) \
do { \
unsigned long vaddr = phys_to_virt(paddr); \
- flush_cache_range(&init_mm, vaddr, vaddr + len); \
+ flush_cache_range(0, vaddr, vaddr + len); \
} while(0)
#define cache_push_v(vaddr, len) \
- flush_cache_range(&init_mm, vaddr, vaddr + len)
+ flush_cache_range(0, vaddr, vaddr + len)
/*
* kern_addr_valid(ADDR) tests if ADDR is pointing to valid kernel
diff --git a/include/asm-ppc/pgtable.h b/include/asm-ppc/pgtable.h
index 47aa26cdc..809304903 100644
--- a/include/asm-ppc/pgtable.h
+++ b/include/asm-ppc/pgtable.h
@@ -18,7 +18,7 @@
extern void local_flush_tlb_all(void);
extern void local_flush_tlb_mm(struct mm_struct *mm);
extern void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
-extern void local_flush_tlb_range(struct mm_struct *mm, unsigned long start,
+extern void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end);
#define update_mmu_cache(vma, addr, pte) do { } while (0)
@@ -32,7 +32,7 @@ static inline void local_flush_tlb_mm(struct mm_struct *mm)
static inline void local_flush_tlb_page(struct vm_area_struct *vma,
unsigned long vmaddr)
{ __tlbia(); }
-static inline void local_flush_tlb_range(struct mm_struct *mm,
+static inline void local_flush_tlb_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end)
{ __tlbia(); }
#define update_mmu_cache(vma, addr, pte) do { } while (0)
@@ -43,7 +43,7 @@ struct vm_area_struct;
extern void local_flush_tlb_all(void);
extern void local_flush_tlb_mm(struct mm_struct *mm);
extern void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
-extern void local_flush_tlb_range(struct mm_struct *mm, unsigned long start,
+extern void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end);
/*
@@ -80,7 +80,7 @@ static inline void flush_tlb_pgtables(struct mm_struct *mm,
*/
#define flush_cache_all() do { } while (0)
#define flush_cache_mm(mm) do { } while (0)
-#define flush_cache_range(mm, a, b) do { } while (0)
+#define flush_cache_range(vma, a, b) do { } while (0)
#define flush_cache_page(vma, p) do { } while (0)
#define flush_icache_page(vma, page) do { } while (0)
diff --git a/include/asm-s390/pgalloc.h b/include/asm-s390/pgalloc.h
index 1f3a00675..4d38bda2e 100644
--- a/include/asm-s390/pgalloc.h
+++ b/include/asm-s390/pgalloc.h
@@ -156,7 +156,7 @@ extern int do_check_pgt_cache(int, int);
* called only from vmalloc/vfree
* - flush_tlb_mm(mm) flushes the specified mm context TLB's
* - flush_tlb_page(vma, vmaddr) flushes one page
- * - flush_tlb_range(mm, start, end) flushes a range of pages
+ * - flush_tlb_range(vma, start, end) flushes a range of pages
* - flush_tlb_pgtables(mm, start, end) flushes a range of page tables
*/
@@ -196,7 +196,7 @@ static inline void flush_tlb_page(struct vm_area_struct *vma,
{
local_flush_tlb();
}
-static inline void flush_tlb_range(struct mm_struct *mm,
+static inline void flush_tlb_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end)
{
local_flush_tlb();
@@ -264,10 +264,10 @@ static inline void flush_tlb_page(struct vm_area_struct *vma,
{
__flush_tlb_mm(vma->vm_mm);
}
-static inline void flush_tlb_range(struct mm_struct *mm,
+static inline void flush_tlb_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end)
{
- __flush_tlb_mm(mm);
+ __flush_tlb_mm(vma->vm_mm);
}
#endif
diff --git a/include/asm-s390/pgtable.h b/include/asm-s390/pgtable.h
index eac4173c4..ce43b50b7 100644
--- a/include/asm-s390/pgtable.h
+++ b/include/asm-s390/pgtable.h
@@ -36,7 +36,7 @@ extern void paging_init(void);
/* Caches aren't brain-dead on S390. */
#define flush_cache_all() do { } while (0)
#define flush_cache_mm(mm) do { } while (0)
-#define flush_cache_range(mm, start, end) do { } while (0)
+#define flush_cache_range(vma, start, end) do { } while (0)
#define flush_cache_page(vma, vmaddr) do { } while (0)
#define flush_page_to_ram(page) do { } while (0)
#define flush_dcache_page(page) do { } while (0)
diff --git a/include/asm-s390x/pgalloc.h b/include/asm-s390x/pgalloc.h
index 6a8e42e15..72fe8a8ce 100644
--- a/include/asm-s390x/pgalloc.h
+++ b/include/asm-s390x/pgalloc.h
@@ -192,7 +192,7 @@ extern int do_check_pgt_cache (int, int);
* called only from vmalloc/vfree
* - flush_tlb_mm(mm) flushes the specified mm context TLB's
* - flush_tlb_page(vma, vmaddr) flushes one page
- * - flush_tlb_range(mm, start, end) flushes a range of pages
+ * - flush_tlb_range(vma, start, end) flushes a range of pages
* - flush_tlb_pgtables(mm, start, end) flushes a range of page tables
*/
@@ -232,7 +232,7 @@ static inline void flush_tlb_page(struct vm_area_struct *vma,
{
local_flush_tlb();
}
-static inline void flush_tlb_range(struct mm_struct *mm,
+static inline void flush_tlb_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end)
{
local_flush_tlb();
@@ -291,10 +291,10 @@ static inline void flush_tlb_page(struct vm_area_struct *vma,
{
__flush_tlb_mm(vma->vm_mm);
}
-static inline void flush_tlb_range(struct mm_struct *mm,
+static inline void flush_tlb_range(struct vm_area_struct *vma,
unsigned long start, unsigned long end)
{
- __flush_tlb_mm(mm);
+ __flush_tlb_mm(vma->vm_mm);
}
#endif
diff --git a/include/asm-s390x/pgtable.h b/include/asm-s390x/pgtable.h
index 1bc4b2f36..25b30c860 100644
--- a/include/asm-s390x/pgtable.h
+++ b/include/asm-s390x/pgtable.h
@@ -32,7 +32,7 @@ extern void paging_init(void);
/* Caches aren't brain-dead on S390. */
#define flush_cache_all() do { } while (0)
#define flush_cache_mm(mm) do { } while (0)
-#define flush_cache_range(mm, start, end) do { } while (0)
+#define flush_cache_range(vma, start, end) do { } while (0)
#define flush_cache_page(vma, vmaddr) do { } while (0)
#define flush_page_to_ram(page) do { } while (0)
#define flush_dcache_page(page) do { } while (0)
diff --git a/include/asm-sh/pgalloc.h b/include/asm-sh/pgalloc.h
index 0c09199af..b6753c973 100644
--- a/include/asm-sh/pgalloc.h
+++ b/include/asm-sh/pgalloc.h
@@ -78,14 +78,14 @@ static inline int do_check_pgt_cache(int low, int high) { }
* - flush_tlb_all() flushes all processes TLBs
* - flush_tlb_mm(mm) flushes the specified mm context TLB's
* - flush_tlb_page(vma, vmaddr) flushes one page
- * - flush_tlb_range(mm, start, end) flushes a range of pages
+ * - flush_tlb_range(vma, start, end) flushes a range of pages
* - flush_tlb_pgtables(mm, start, end) flushes a range of page tables
*/
extern void flush_tlb(void);
extern void flush_tlb_all(void);
extern void flush_tlb_mm(struct mm_struct *mm);
-extern void flush_tlb_range(struct mm_struct *mm, unsigned long start,
+extern void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end);
extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long page);
extern void __flush_tlb_page(unsigned long asid, unsigned long page);
diff --git a/include/asm-sh/pgtable.h b/include/asm-sh/pgtable.h
index cc962def5..6c47e1bbb 100644
--- a/include/asm-sh/pgtable.h
+++ b/include/asm-sh/pgtable.h
@@ -23,7 +23,7 @@ extern void paging_init(void);
* - flush_cache_all() flushes entire cache
* - flush_cache_mm(mm) flushes the specified mm context's cache lines
* - flush_cache_page(mm, vmaddr) flushes a single page
- * - flush_cache_range(mm, start, end) flushes a range of pages
+ * - flush_cache_range(vma, start, end) flushes a range of pages
*
* - flush_dcache_page(pg) flushes(wback&invalidates) a page for dcache
* - flush_page_to_ram(page) write back kernel page to ram
@@ -35,7 +35,7 @@ extern void paging_init(void);
*/
#define flush_cache_all() do { } while (0)
#define flush_cache_mm(mm) do { } while (0)
-#define flush_cache_range(mm, start, end) do { } while (0)
+#define flush_cache_range(vma, start, end) do { } while (0)
#define flush_cache_page(vma, vmaddr) do { } while (0)
#define flush_page_to_ram(page) do { } while (0)
#define flush_dcache_page(page) do { } while (0)
@@ -55,7 +55,7 @@ extern void paging_init(void);
extern void flush_cache_all(void);
extern void flush_cache_mm(struct mm_struct *mm);
-extern void flush_cache_range(struct mm_struct *mm, unsigned long start,
+extern void flush_cache_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end);
extern void flush_cache_page(struct vm_area_struct *vma, unsigned long addr);
extern void flush_dcache_page(struct page *pg);
diff --git a/include/asm-sparc/pgalloc.h b/include/asm-sparc/pgalloc.h
index 5dab980cf..9983cdc7a 100644
--- a/include/asm-sparc/pgalloc.h
+++ b/include/asm-sparc/pgalloc.h
@@ -1,4 +1,4 @@
-/* $Id: pgalloc.h,v 1.15 2001-10-18 09:06:37 davem Exp $ */
+/* $Id: pgalloc.h,v 1.16 2001-12-21 04:56:17 davem Exp $ */
#ifndef _SPARC_PGALLOC_H
#define _SPARC_PGALLOC_H
@@ -13,22 +13,22 @@
#ifdef CONFIG_SMP
BTFIXUPDEF_CALL(void, local_flush_cache_all, void)
BTFIXUPDEF_CALL(void, local_flush_cache_mm, struct mm_struct *)
-BTFIXUPDEF_CALL(void, local_flush_cache_range, struct mm_struct *, unsigned long, unsigned long)
+BTFIXUPDEF_CALL(void, local_flush_cache_range, struct vm_area_struct *, unsigned long, unsigned long)
BTFIXUPDEF_CALL(void, local_flush_cache_page, struct vm_area_struct *, unsigned long)
#define local_flush_cache_all() BTFIXUP_CALL(local_flush_cache_all)()
#define local_flush_cache_mm(mm) BTFIXUP_CALL(local_flush_cache_mm)(mm)
-#define local_flush_cache_range(mm,start,end) BTFIXUP_CALL(local_flush_cache_range)(mm,start,end)
+#define local_flush_cache_range(vma,start,end) BTFIXUP_CALL(local_flush_cache_range)(vma,start,end)
#define local_flush_cache_page(vma,addr) BTFIXUP_CALL(local_flush_cache_page)(vma,addr)
BTFIXUPDEF_CALL(void, local_flush_tlb_all, void)
BTFIXUPDEF_CALL(void, local_flush_tlb_mm, struct mm_struct *)
-BTFIXUPDEF_CALL(void, local_flush_tlb_range, struct mm_struct *, unsigned long, unsigned long)
+BTFIXUPDEF_CALL(void, local_flush_tlb_range, struct vm_area_struct *, unsigned long, unsigned long)
BTFIXUPDEF_CALL(void, local_flush_tlb_page, struct vm_area_struct *, unsigned long)
#define local_flush_tlb_all() BTFIXUP_CALL(local_flush_tlb_all)()
#define local_flush_tlb_mm(mm) BTFIXUP_CALL(local_flush_tlb_mm)(mm)
-#define local_flush_tlb_range(mm,start,end) BTFIXUP_CALL(local_flush_tlb_range)(mm,start,end)
+#define local_flush_tlb_range(vma,start,end) BTFIXUP_CALL(local_flush_tlb_range)(vma,start,end)
#define local_flush_tlb_page(vma,addr) BTFIXUP_CALL(local_flush_tlb_page)(vma,addr)
BTFIXUPDEF_CALL(void, local_flush_page_to_ram, unsigned long)
@@ -39,14 +39,14 @@ BTFIXUPDEF_CALL(void, local_flush_sig_insns, struct mm_struct *, unsigned long)
extern void smp_flush_cache_all(void);
extern void smp_flush_cache_mm(struct mm_struct *mm);
-extern void smp_flush_cache_range(struct mm_struct *mm,
+extern void smp_flush_cache_range(struct vm_area_struct *vma,
unsigned long start,
unsigned long end);
extern void smp_flush_cache_page(struct vm_area_struct *vma, unsigned long page);
extern void smp_flush_tlb_all(void);
extern void smp_flush_tlb_mm(struct mm_struct *mm);
-extern void smp_flush_tlb_range(struct mm_struct *mm,
+extern void smp_flush_tlb_range(struct vm_area_struct *vma,
unsigned long start,
unsigned long end);
extern void smp_flush_tlb_page(struct vm_area_struct *mm, unsigned long page);
@@ -56,18 +56,18 @@ extern void smp_flush_sig_insns(struct mm_struct *mm, unsigned long insn_addr);
BTFIXUPDEF_CALL(void, flush_cache_all, void)
BTFIXUPDEF_CALL(void, flush_cache_mm, struct mm_struct *)
-BTFIXUPDEF_CALL(void, flush_cache_range, struct mm_struct *, unsigned long, unsigned long)
+BTFIXUPDEF_CALL(void, flush_cache_range, struct vm_area_struct *, unsigned long, unsigned long)
BTFIXUPDEF_CALL(void, flush_cache_page, struct vm_area_struct *, unsigned long)
#define flush_cache_all() BTFIXUP_CALL(flush_cache_all)()
#define flush_cache_mm(mm) BTFIXUP_CALL(flush_cache_mm)(mm)
-#define flush_cache_range(mm,start,end) BTFIXUP_CALL(flush_cache_range)(mm,start,end)
+#define flush_cache_range(vma,start,end) BTFIXUP_CALL(flush_cache_range)(vma,start,end)
#define flush_cache_page(vma,addr) BTFIXUP_CALL(flush_cache_page)(vma,addr)
#define flush_icache_range(start, end) do { } while (0)
BTFIXUPDEF_CALL(void, flush_tlb_all, void)
BTFIXUPDEF_CALL(void, flush_tlb_mm, struct mm_struct *)
-BTFIXUPDEF_CALL(void, flush_tlb_range, struct mm_struct *, unsigned long, unsigned long)
+BTFIXUPDEF_CALL(void, flush_tlb_range, struct vm_area_struct *, unsigned long, unsigned long)
BTFIXUPDEF_CALL(void, flush_tlb_page, struct vm_area_struct *, unsigned long)
extern __inline__ void flush_tlb_pgtables(struct mm_struct *mm, unsigned long start, unsigned long end)
@@ -76,7 +76,7 @@ extern __inline__ void flush_tlb_pgtables(struct mm_struct *mm, unsigned long st
#define flush_tlb_all() BTFIXUP_CALL(flush_tlb_all)()
#define flush_tlb_mm(mm) BTFIXUP_CALL(flush_tlb_mm)(mm)
-#define flush_tlb_range(mm,start,end) BTFIXUP_CALL(flush_tlb_range)(mm,start,end)
+#define flush_tlb_range(vma,start,end) BTFIXUP_CALL(flush_tlb_range)(vma,start,end)
#define flush_tlb_page(vma,addr) BTFIXUP_CALL(flush_tlb_page)(vma,addr)
BTFIXUPDEF_CALL(void, __flush_page_to_ram, unsigned long)
diff --git a/include/asm-sparc/pgtable.h b/include/asm-sparc/pgtable.h
index 0b4798644..f1706542e 100644
--- a/include/asm-sparc/pgtable.h
+++ b/include/asm-sparc/pgtable.h
@@ -1,4 +1,4 @@
-/* $Id: pgtable.h,v 1.109 2001-11-13 00:49:32 davem Exp $ */
+/* $Id: pgtable.h,v 1.110 2001-12-21 04:56:17 davem Exp $ */
#ifndef _SPARC_PGTABLE_H
#define _SPARC_PGTABLE_H
@@ -445,7 +445,7 @@ extern unsigned long *sparc_valid_addr_bitmap;
#define kern_addr_valid(addr) \
(test_bit(__pa((unsigned long)(addr))>>20, sparc_valid_addr_bitmap))
-extern int io_remap_page_range(unsigned long from, unsigned long to,
+extern int io_remap_page_range(struct vm_area_struct *vma, unsigned long from, unsigned long to,
unsigned long size, pgprot_t prot, int space);
#include <asm-generic/pgtable.h>
diff --git a/include/asm-sparc64/pgalloc.h b/include/asm-sparc64/pgalloc.h
index 5cf7c318b..f8f85d314 100644
--- a/include/asm-sparc64/pgalloc.h
+++ b/include/asm-sparc64/pgalloc.h
@@ -1,4 +1,4 @@
-/* $Id: pgalloc.h,v 1.29 2001-10-20 12:38:51 davem Exp $ */
+/* $Id: pgalloc.h,v 1.30 2001-12-21 04:56:17 davem Exp $ */
#ifndef _SPARC64_PGALLOC_H
#define _SPARC64_PGALLOC_H
@@ -15,8 +15,7 @@
/* These are the same regardless of whether this is an SMP kernel or not. */
#define flush_cache_mm(__mm) \
do { if ((__mm) == current->mm) flushw_user(); } while(0)
-#define flush_cache_range(mm, start, end) \
- flush_cache_mm(mm)
+extern void flush_cache_range(struct vm_area_struct *, unsigned long, unsigned long);
#define flush_cache_page(vma, page) \
flush_cache_mm((vma)->vm_mm)
@@ -35,8 +34,10 @@ extern void __flush_icache_page(unsigned long);
extern void flush_dcache_page_impl(struct page *page);
#ifdef CONFIG_SMP
extern void smp_flush_dcache_page_impl(struct page *page, int cpu);
+extern void flush_dcache_page_all(struct mm_struct *mm, struct page *page);
#else
#define smp_flush_dcache_page_impl(page,cpu) flush_dcache_page_impl(page)
+#define flush_dcache_page_all(mm,page) flush_dcache_page_impl(page)
#endif
extern void flush_dcache_page(struct page *page);
@@ -62,11 +63,11 @@ do { if(CTX_VALID((__mm)->context)) \
__flush_tlb_mm(CTX_HWBITS((__mm)->context), SECONDARY_CONTEXT); \
} while(0)
-#define flush_tlb_range(__mm, start, end) \
-do { if(CTX_VALID((__mm)->context)) { \
+#define flush_tlb_range(__vma, start, end) \
+do { if(CTX_VALID((__vma)->vm_mm->context)) { \
unsigned long __start = (start)&PAGE_MASK; \
unsigned long __end = PAGE_ALIGN(end); \
- __flush_tlb_range(CTX_HWBITS((__mm)->context), __start, \
+ __flush_tlb_range(CTX_HWBITS((__vma)->vm_mm->context), __start, \
SECONDARY_CONTEXT, __end, PAGE_SIZE, \
(__end - __start)); \
} \
@@ -84,15 +85,15 @@ do { struct mm_struct *__mm = (vma)->vm_mm; \
extern void smp_flush_cache_all(void);
extern void smp_flush_tlb_all(void);
extern void smp_flush_tlb_mm(struct mm_struct *mm);
-extern void smp_flush_tlb_range(struct mm_struct *mm, unsigned long start,
+extern void smp_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
unsigned long end);
extern void smp_flush_tlb_page(struct mm_struct *mm, unsigned long page);
#define flush_cache_all() smp_flush_cache_all()
#define flush_tlb_all() smp_flush_tlb_all()
#define flush_tlb_mm(mm) smp_flush_tlb_mm(mm)
-#define flush_tlb_range(mm, start, end) \
- smp_flush_tlb_range(mm, start, end)
+#define flush_tlb_range(vma, start, end) \
+ smp_flush_tlb_range(vma, start, end)
#define flush_tlb_page(vma, page) \
smp_flush_tlb_page((vma)->vm_mm, page)
@@ -122,9 +123,13 @@ extern __inline__ void flush_tlb_pgtables(struct mm_struct *mm, unsigned long st
vpte_base = (tlb_type == spitfire ?
VPTE_BASE_SPITFIRE :
VPTE_BASE_CHEETAH);
- flush_tlb_range(mm,
- vpte_base + (s >> (PAGE_SHIFT - 3)),
- vpte_base + (e >> (PAGE_SHIFT - 3)));
+ {
+ struct vm_area_struct vma;
+ vma.vm_mm = mm;
+ flush_tlb_range(&vma,
+ vpte_base + (s >> (PAGE_SHIFT - 3)),
+ vpte_base + (e >> (PAGE_SHIFT - 3)));
+ }
}
#undef VPTE_BASE_SPITFIRE
#undef VPTE_BASE_CHEETAH
diff --git a/include/asm-sparc64/pgtable.h b/include/asm-sparc64/pgtable.h
index 913819d57..e013039e8 100644
--- a/include/asm-sparc64/pgtable.h
+++ b/include/asm-sparc64/pgtable.h
@@ -1,4 +1,4 @@
-/* $Id: pgtable.h,v 1.154 2001-12-05 06:05:36 davem Exp $
+/* $Id: pgtable.h,v 1.155 2001-12-21 04:56:17 davem Exp $
* pgtable.h: SpitFire page table operations.
*
* Copyright 1996,1997 David S. Miller (davem@caip.rutgers.edu)
@@ -336,7 +336,7 @@ extern unsigned long *sparc64_valid_addr_bitmap;
#define kern_addr_valid(addr) \
(test_bit(__pa((unsigned long)(addr))>>22, sparc64_valid_addr_bitmap))
-extern int io_remap_page_range(unsigned long from, unsigned long offset,
+extern int io_remap_page_range(struct vm_area_struct *vma, unsigned long from, unsigned long offset,
unsigned long size, pgprot_t prot, int space);
#include <asm-generic/pgtable.h>
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 98b763c4f..fd151a339 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -404,10 +404,10 @@ struct file *shmem_file_setup(char * name, loff_t size);
extern void shmem_lock(struct file * file, int lock);
extern int shmem_zero_setup(struct vm_area_struct *);
-extern void zap_page_range(struct mm_struct *mm, unsigned long address, unsigned long size);
+extern void zap_page_range(struct vm_area_struct *vma, unsigned long address, unsigned long size);
extern int copy_page_range(struct mm_struct *dst, struct mm_struct *src, struct vm_area_struct *vma);
-extern int remap_page_range(unsigned long from, unsigned long to, unsigned long size, pgprot_t prot);
-extern int zeromap_page_range(unsigned long from, unsigned long size, pgprot_t prot);
+extern int remap_page_range(struct vm_area_struct *vma, unsigned long from, unsigned long to, unsigned long size, pgprot_t prot);
+extern int zeromap_page_range(struct vm_area_struct *vma, unsigned long from, unsigned long size, pgprot_t prot);
extern int vmtruncate(struct inode * inode, loff_t offset);
extern pmd_t *FASTCALL(__pmd_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address));
diff --git a/include/linux/videodev.h b/include/linux/videodev.h
index 0055d5810..efa4caddc 100644
--- a/include/linux/videodev.h
+++ b/include/linux/videodev.h
@@ -8,6 +8,7 @@
#include <linux/poll.h>
#include <linux/devfs_fs_kernel.h>
+#include <linux/mm.h>
struct video_device
{
@@ -25,7 +26,7 @@ struct video_device
unsigned int (*poll)(struct video_device *, struct file *, poll_table *);
#endif
int (*ioctl)(struct video_device *, unsigned int , void *);
- int (*mmap)(struct video_device *, const char *, unsigned long);
+ int (*mmap)(struct vm_area_struct *vma, struct video_device *, const char *, unsigned long);
int (*initialize)(struct video_device *);
void *priv; /* Used to be 'private' but that upsets C++ */
int busy;
diff --git a/mm/filemap.c b/mm/filemap.c
index b9e9ff56e..3f807b05c 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -2100,7 +2100,7 @@ int filemap_sync(struct vm_area_struct * vma, unsigned long address,
spin_lock(&vma->vm_mm->page_table_lock);
dir = pgd_offset(vma->vm_mm, address);
- flush_cache_range(vma->vm_mm, end - size, end);
+ flush_cache_range(vma, end - size, end);
if (address >= end)
BUG();
do {
@@ -2108,7 +2108,7 @@ int filemap_sync(struct vm_area_struct * vma, unsigned long address,
address = (address + PGDIR_SIZE) & PGDIR_MASK;
dir++;
} while (address && (address < end));
- flush_tlb_range(vma->vm_mm, end - size, end);
+ flush_tlb_range(vma, end - size, end);
spin_unlock(&vma->vm_mm->page_table_lock);
@@ -2442,7 +2442,7 @@ static long madvise_dontneed(struct vm_area_struct * vma,
if (vma->vm_flags & VM_LOCKED)
return -EINVAL;
- zap_page_range(vma->vm_mm, start, end - start);
+ zap_page_range(vma, start, end - start);
return 0;
}
diff --git a/mm/memory.c b/mm/memory.c
index 533529b1f..f4ef76985 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -355,8 +355,9 @@ static inline int zap_pmd_range(mmu_gather_t *tlb, pgd_t * dir, unsigned long ad
/*
* remove user pages in a given range.
*/
-void zap_page_range(struct mm_struct *mm, unsigned long address, unsigned long size)
+void zap_page_range(struct vm_area_struct *vma, unsigned long address, unsigned long size)
{
+ struct mm_struct *mm = vma->vm_mm;
mmu_gather_t *tlb;
pgd_t * dir;
unsigned long start = address, end = address + size;
@@ -374,8 +375,8 @@ void zap_page_range(struct mm_struct *mm, unsigned long address, unsigned long s
if (address >= end)
BUG();
spin_lock(&mm->page_table_lock);
- flush_cache_range(mm, address, end);
- tlb = tlb_gather_mmu(mm);
+ flush_cache_range(vma, address, end);
+ tlb = tlb_gather_mmu(vma);
do {
freed += zap_pmd_range(tlb, dir, address, end - address);
@@ -757,16 +758,16 @@ static inline int zeromap_pmd_range(struct mm_struct *mm, pmd_t * pmd, unsigned
return 0;
}
-int zeromap_page_range(unsigned long address, unsigned long size, pgprot_t prot)
+int zeromap_page_range(struct vm_area_struct *vma, unsigned long address, unsigned long size, pgprot_t prot)
{
int error = 0;
pgd_t * dir;
unsigned long beg = address;
unsigned long end = address + size;
- struct mm_struct *mm = current->mm;
+ struct mm_struct *mm = vma->vm_mm;
dir = pgd_offset(mm, address);
- flush_cache_range(mm, beg, end);
+ flush_cache_range(vma, beg, end);
if (address >= end)
BUG();
@@ -783,7 +784,7 @@ int zeromap_page_range(unsigned long address, unsigned long size, pgprot_t prot)
dir++;
} while (address && (address < end));
spin_unlock(&mm->page_table_lock);
- flush_tlb_range(mm, beg, end);
+ flush_tlb_range(vma, beg, end);
return error;
}
@@ -838,17 +839,17 @@ static inline int remap_pmd_range(struct mm_struct *mm, pmd_t * pmd, unsigned lo
}
/* Note: this is only safe if the mm semaphore is held when called. */
-int remap_page_range(unsigned long from, unsigned long phys_addr, unsigned long size, pgprot_t prot)
+int remap_page_range(struct vm_area_struct *vma, unsigned long from, unsigned long phys_addr, unsigned long size, pgprot_t prot)
{
int error = 0;
pgd_t * dir;
unsigned long beg = from;
unsigned long end = from + size;
- struct mm_struct *mm = current->mm;
+ struct mm_struct *mm = vma->vm_mm;
phys_addr -= from;
dir = pgd_offset(mm, from);
- flush_cache_range(mm, beg, end);
+ flush_cache_range(vma, beg, end);
if (from >= end)
BUG();
@@ -865,7 +866,7 @@ int remap_page_range(unsigned long from, unsigned long phys_addr, unsigned long
dir++;
} while (from && (from < end));
spin_unlock(&mm->page_table_lock);
- flush_tlb_range(mm, beg, end);
+ flush_tlb_range(vma, beg, end);
return error;
}
@@ -976,7 +977,6 @@ no_mem:
static void vmtruncate_list(struct vm_area_struct *mpnt, unsigned long pgoff)
{
do {
- struct mm_struct *mm = mpnt->vm_mm;
unsigned long start = mpnt->vm_start;
unsigned long end = mpnt->vm_end;
unsigned long len = end - start;
@@ -984,7 +984,7 @@ static void vmtruncate_list(struct vm_area_struct *mpnt, unsigned long pgoff)
/* mapping wholly truncated? */
if (mpnt->vm_pgoff >= pgoff) {
- zap_page_range(mm, start, len);
+ zap_page_range(mpnt, start, len);
continue;
}
@@ -997,7 +997,7 @@ static void vmtruncate_list(struct vm_area_struct *mpnt, unsigned long pgoff)
/* Ok, partially affected.. */
start += diff << PAGE_SHIFT;
len = (len - diff) << PAGE_SHIFT;
- zap_page_range(mm, start, len);
+ zap_page_range(mpnt, start, len);
} while ((mpnt = mpnt->vm_next_share) != NULL);
}
diff --git a/mm/mmap.c b/mm/mmap.c
index 79c513ecc..9139feab7 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -569,7 +569,7 @@ unmap_and_free_vma:
fput(file);
/* Undo any partial mapping done by a device driver. */
- zap_page_range(mm, vma->vm_start, vma->vm_end - vma->vm_start);
+ zap_page_range(vma, vma->vm_start, vma->vm_end - vma->vm_start);
free_vma:
kmem_cache_free(vm_area_cachep, vma);
return error;
@@ -967,7 +967,7 @@ int do_munmap(struct mm_struct *mm, unsigned long addr, size_t len)
remove_shared_vm_struct(mpnt);
mm->map_count--;
- zap_page_range(mm, st, size);
+ zap_page_range(mpnt, st, size);
/*
* Fix the mapping, and free the old area if it wasn't reused.
@@ -1127,7 +1127,7 @@ void exit_mmap(struct mm_struct * mm)
}
mm->map_count--;
remove_shared_vm_struct(mpnt);
- zap_page_range(mm, start, size);
+ zap_page_range(mpnt, start, size);
if (mpnt->vm_file)
fput(mpnt->vm_file);
kmem_cache_free(vm_area_cachep, mpnt);
diff --git a/mm/mprotect.c b/mm/mprotect.c
index fe69b33da..1d4c86872 100644
--- a/mm/mprotect.c
+++ b/mm/mprotect.c
@@ -71,13 +71,13 @@ static inline void change_pmd_range(pgd_t * pgd, unsigned long address,
} while (address && (address < end));
}
-static void change_protection(unsigned long start, unsigned long end, pgprot_t newprot)
+static void change_protection(struct vm_area_struct *vma, unsigned long start, unsigned long end, pgprot_t newprot)
{
pgd_t *dir;
unsigned long beg = start;
dir = pgd_offset(current->mm, start);
- flush_cache_range(current->mm, beg, end);
+ flush_cache_range(vma, beg, end);
if (start >= end)
BUG();
spin_lock(&current->mm->page_table_lock);
@@ -87,7 +87,7 @@ static void change_protection(unsigned long start, unsigned long end, pgprot_t n
dir++;
} while (start && (start < end));
spin_unlock(&current->mm->page_table_lock);
- flush_tlb_range(current->mm, beg, end);
+ flush_tlb_range(vma, beg, end);
return;
}
@@ -260,7 +260,7 @@ static int mprotect_fixup(struct vm_area_struct * vma, struct vm_area_struct **
if (error)
return error;
- change_protection(start, end, newprot);
+ change_protection(vma, start, end, newprot);
return 0;
}
diff --git a/mm/mremap.c b/mm/mremap.c
index 03f77dea2..68d770043 100644
--- a/mm/mremap.c
+++ b/mm/mremap.c
@@ -87,12 +87,13 @@ static int move_one_page(struct mm_struct *mm, unsigned long old_addr, unsigned
return error;
}
-static int move_page_tables(struct mm_struct * mm,
+static int move_page_tables(struct vm_area_struct *vma,
unsigned long new_addr, unsigned long old_addr, unsigned long len)
{
+ struct mm_struct *mm = vma->vm_mm;
unsigned long offset = len;
- flush_cache_range(mm, old_addr, old_addr + len);
+ flush_cache_range(vma, old_addr, old_addr + len);
/*
* This is not the clever way to do this, but we're taking the
@@ -104,7 +105,7 @@ static int move_page_tables(struct mm_struct * mm,
if (move_one_page(mm, old_addr + offset, new_addr + offset))
goto oops_we_failed;
}
- flush_tlb_range(mm, old_addr, old_addr + len);
+ flush_tlb_range(vma, old_addr, old_addr + len);
return 0;
/*
@@ -115,10 +116,10 @@ static int move_page_tables(struct mm_struct * mm,
* the old page tables)
*/
oops_we_failed:
- flush_cache_range(mm, new_addr, new_addr + len);
+ flush_cache_range(vma, new_addr, new_addr + len);
while ((offset += PAGE_SIZE) < len)
move_one_page(mm, new_addr + offset, old_addr + offset);
- zap_page_range(mm, new_addr, len);
+ zap_page_range(vma, new_addr, len);
return -1;
}
@@ -176,7 +177,7 @@ static inline unsigned long move_vma(struct vm_area_struct * vma,
allocated_vma = 1;
}
- if (!move_page_tables(current->mm, new_addr, addr, old_len)) {
+ if (!move_page_tables(vma, new_addr, addr, old_len)) {
if (allocated_vma) {
*new_vma = *vma;
new_vma->vm_start = new_addr;
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 925b478db..1b3bee5eb 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -5,7 +5,7 @@
*
* PACKET - implements raw packet sockets.
*
- * Version: $Id: af_packet.c,v 1.58 2001-11-28 21:02:10 davem Exp $
+ * Version: $Id: af_packet.c,v 1.59 2001-12-21 04:56:17 davem Exp $
*
* Authors: Ross Biro, <bir7@leland.Stanford.Edu>
* Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
@@ -1763,7 +1763,7 @@ static int packet_mmap(struct file *file, struct socket *sock, struct vm_area_st
start = vma->vm_start;
err = -EAGAIN;
for (i=0; i<po->pg_vec_len; i++) {
- if (remap_page_range(start, __pa(po->pg_vec[i]),
+ if (remap_page_range(vma, start, __pa(po->pg_vec[i]),
po->pg_vec_pages*PAGE_SIZE,
vma->vm_page_prot))
goto out;