From 1c2abc8088b53a60791329fc967970d5876eab34 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Wed, 6 Jan 2010 17:23:23 +0000 Subject: [PATCH] --- yaml --- r: 178833 b: refs/heads/master c: cfe79c00a2f4f687eed8b7534d1d3d3d35540c29 h: refs/heads/master i: 178831: 161b238c3e1d2f65ad5ffae48c85cb328f95e120 v: v3 --- [refs] | 2 +- trunk/include/linux/mm_types.h | 2 ++ trunk/mm/nommu.c | 11 ++++++++--- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index b1cf3aaaf8ba..d3e4ace6bfc5 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 04e4f2b18c8de1389d1e00fef0f42a8099910daf +refs/heads/master: cfe79c00a2f4f687eed8b7534d1d3d3d35540c29 diff --git a/trunk/include/linux/mm_types.h b/trunk/include/linux/mm_types.h index 84a524afb3dc..84d020bed083 100644 --- a/trunk/include/linux/mm_types.h +++ b/trunk/include/linux/mm_types.h @@ -123,6 +123,8 @@ struct vm_region { struct file *vm_file; /* the backing file or NULL */ atomic_t vm_usage; /* region usage count */ + bool vm_icache_flushed : 1; /* true if the icache has been flushed for + * this region */ }; /* diff --git a/trunk/mm/nommu.c b/trunk/mm/nommu.c index 6f9248f89bde..a8d17521624a 100644 --- a/trunk/mm/nommu.c +++ b/trunk/mm/nommu.c @@ -432,6 +432,7 @@ SYSCALL_DEFINE1(brk, unsigned long, brk) /* * Ok, looks good - let it rip. */ + flush_icache_range(mm->brk, brk); return mm->brk = brk; } @@ -1353,10 +1354,14 @@ unsigned long do_mmap_pgoff(struct file *file, share: add_vma_to_mm(current->mm, vma); - up_write(&nommu_region_sem); + /* we flush the region from the icache only when the first executable + * mapping of it is made */ + if (vma->vm_flags & VM_EXEC && !region->vm_icache_flushed) { + flush_icache_range(region->vm_start, region->vm_end); + region->vm_icache_flushed = true; + } - if (prot & PROT_EXEC) - flush_icache_range(result, result + len); + up_write(&nommu_region_sem); kleave(" = %lx", result); return result;