aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Wilson <wilsons@start.ca>2011-03-13 15:49:15 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2011-03-23 16:36:54 -0400
commit31db58b3ab432f72ea76be58b12e6ffaf627d5db (patch)
treec88b742e1f2c52045d5abc6d35d7492ebdf64541
parent375906f8765e131a4a159b1ffebf78c15db7b3bf (diff)
mm: arch: make get_gate_vma take an mm_struct instead of a task_struct
Morally, the presence of a gate vma is more an attribute of a particular mm than a particular task. Moreover, dropping the dependency on task_struct will help make both existing and future operations on mm's more flexible and convenient. Signed-off-by: Stephen Wilson <wilsons@start.ca> Reviewed-by: Michel Lespinasse <walken@google.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: "H. Peter Anvin" <hpa@zytor.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--arch/powerpc/kernel/vdso.c2
-rw-r--r--arch/s390/kernel/vdso.c2
-rw-r--r--arch/sh/kernel/vsyscall/vsyscall.c2
-rw-r--r--arch/x86/mm/init_64.c6
-rw-r--r--arch/x86/vdso/vdso32-setup.c11
-rw-r--r--fs/binfmt_elf.c2
-rw-r--r--fs/proc/task_mmu.c8
-rw-r--r--include/linux/mm.h2
-rw-r--r--mm/memory.c4
-rw-r--r--mm/mlock.c4
10 files changed, 23 insertions, 20 deletions
diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c
index fd8728729abc..6169f1756930 100644
--- a/arch/powerpc/kernel/vdso.c
+++ b/arch/powerpc/kernel/vdso.c
@@ -830,7 +830,7 @@ int in_gate_area(struct task_struct *task, unsigned long addr)
830 return 0; 830 return 0;
831} 831}
832 832
833struct vm_area_struct *get_gate_vma(struct task_struct *tsk) 833struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
834{ 834{
835 return NULL; 835 return NULL;
836} 836}
diff --git a/arch/s390/kernel/vdso.c b/arch/s390/kernel/vdso.c
index f438d74dedbd..d19f30504c63 100644
--- a/arch/s390/kernel/vdso.c
+++ b/arch/s390/kernel/vdso.c
@@ -347,7 +347,7 @@ int in_gate_area(struct task_struct *task, unsigned long addr)
347 return 0; 347 return 0;
348} 348}
349 349
350struct vm_area_struct *get_gate_vma(struct task_struct *tsk) 350struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
351{ 351{
352 return NULL; 352 return NULL;
353} 353}
diff --git a/arch/sh/kernel/vsyscall/vsyscall.c b/arch/sh/kernel/vsyscall/vsyscall.c
index 242117cbad67..3f9b6f41813a 100644
--- a/arch/sh/kernel/vsyscall/vsyscall.c
+++ b/arch/sh/kernel/vsyscall/vsyscall.c
@@ -94,7 +94,7 @@ const char *arch_vma_name(struct vm_area_struct *vma)
94 return NULL; 94 return NULL;
95} 95}
96 96
97struct vm_area_struct *get_gate_vma(struct task_struct *task) 97struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
98{ 98{
99 return NULL; 99 return NULL;
100} 100}
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 0aa34669ed3f..dd4809b58441 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -861,10 +861,10 @@ static struct vm_area_struct gate_vma = {
861 .vm_flags = VM_READ | VM_EXEC 861 .vm_flags = VM_READ | VM_EXEC
862}; 862};
863 863
864struct vm_area_struct *get_gate_vma(struct task_struct *tsk) 864struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
865{ 865{
866#ifdef CONFIG_IA32_EMULATION 866#ifdef CONFIG_IA32_EMULATION
867 if (test_tsk_thread_flag(tsk, TIF_IA32)) 867 if (!mm || mm->context.ia32_compat)
868 return NULL; 868 return NULL;
869#endif 869#endif
870 return &gate_vma; 870 return &gate_vma;
@@ -872,7 +872,7 @@ struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
872 872
873int in_gate_area(struct task_struct *task, unsigned long addr) 873int in_gate_area(struct task_struct *task, unsigned long addr)
874{ 874{
875 struct vm_area_struct *vma = get_gate_vma(task); 875 struct vm_area_struct *vma = get_gate_vma(task->mm);
876 876
877 if (!vma) 877 if (!vma)
878 return 0; 878 return 0;
diff --git a/arch/x86/vdso/vdso32-setup.c b/arch/x86/vdso/vdso32-setup.c
index 36df991985b2..1f651f6bdf61 100644
--- a/arch/x86/vdso/vdso32-setup.c
+++ b/arch/x86/vdso/vdso32-setup.c
@@ -417,11 +417,12 @@ const char *arch_vma_name(struct vm_area_struct *vma)
417 return NULL; 417 return NULL;
418} 418}
419 419
420struct vm_area_struct *get_gate_vma(struct task_struct *tsk) 420struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
421{ 421{
422 struct mm_struct *mm = tsk->mm; 422 /*
423 423 * Check to see if the corresponding task was created in compat vdso
424 /* Check to see if this task was created in compat vdso mode */ 424 * mode.
425 */
425 if (mm && mm->context.vdso == (void *)VDSO_HIGH_BASE) 426 if (mm && mm->context.vdso == (void *)VDSO_HIGH_BASE)
426 return &gate_vma; 427 return &gate_vma;
427 return NULL; 428 return NULL;
@@ -429,7 +430,7 @@ struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
429 430
430int in_gate_area(struct task_struct *task, unsigned long addr) 431int in_gate_area(struct task_struct *task, unsigned long addr)
431{ 432{
432 const struct vm_area_struct *vma = get_gate_vma(task); 433 const struct vm_area_struct *vma = get_gate_vma(task->mm);
433 434
434 return vma && addr >= vma->vm_start && addr < vma->vm_end; 435 return vma && addr >= vma->vm_start && addr < vma->vm_end;
435} 436}
diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
index d5b640ba6cb1..bbabdcce1179 100644
--- a/fs/binfmt_elf.c
+++ b/fs/binfmt_elf.c
@@ -1906,7 +1906,7 @@ static int elf_core_dump(struct coredump_params *cprm)
1906 segs = current->mm->map_count; 1906 segs = current->mm->map_count;
1907 segs += elf_core_extra_phdrs(); 1907 segs += elf_core_extra_phdrs();
1908 1908
1909 gate_vma = get_gate_vma(current); 1909 gate_vma = get_gate_vma(current->mm);
1910 if (gate_vma != NULL) 1910 if (gate_vma != NULL)
1911 segs++; 1911 segs++;
1912 1912
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index 8fed0f88fbf7..e73314afc535 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -126,7 +126,7 @@ static void *m_start(struct seq_file *m, loff_t *pos)
126 return mm; 126 return mm;
127 down_read(&mm->mmap_sem); 127 down_read(&mm->mmap_sem);
128 128
129 tail_vma = get_gate_vma(priv->task); 129 tail_vma = get_gate_vma(priv->task->mm);
130 priv->tail_vma = tail_vma; 130 priv->tail_vma = tail_vma;
131 131
132 /* Start with last addr hint */ 132 /* Start with last addr hint */
@@ -277,7 +277,8 @@ static int show_map(struct seq_file *m, void *v)
277 show_map_vma(m, vma); 277 show_map_vma(m, vma);
278 278
279 if (m->count < m->size) /* vma is copied successfully */ 279 if (m->count < m->size) /* vma is copied successfully */
280 m->version = (vma != get_gate_vma(task))? vma->vm_start: 0; 280 m->version = (vma != get_gate_vma(task->mm))
281 ? vma->vm_start : 0;
281 return 0; 282 return 0;
282} 283}
283 284
@@ -436,7 +437,8 @@ static int show_smap(struct seq_file *m, void *v)
436 (unsigned long)(mss.pss >> (10 + PSS_SHIFT)) : 0); 437 (unsigned long)(mss.pss >> (10 + PSS_SHIFT)) : 0);
437 438
438 if (m->count < m->size) /* vma is copied successfully */ 439 if (m->count < m->size) /* vma is copied successfully */
439 m->version = (vma != get_gate_vma(task)) ? vma->vm_start : 0; 440 m->version = (vma != get_gate_vma(task->mm))
441 ? vma->vm_start : 0;
440 return 0; 442 return 0;
441} 443}
442 444
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 581703d86fbd..18b4a6358ab4 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1578,7 +1578,7 @@ static inline bool kernel_page_present(struct page *page) { return true; }
1578#endif /* CONFIG_HIBERNATION */ 1578#endif /* CONFIG_HIBERNATION */
1579#endif 1579#endif
1580 1580
1581extern struct vm_area_struct *get_gate_vma(struct task_struct *tsk); 1581extern struct vm_area_struct *get_gate_vma(struct mm_struct *mm);
1582#ifdef __HAVE_ARCH_GATE_AREA 1582#ifdef __HAVE_ARCH_GATE_AREA
1583int in_gate_area_no_task(unsigned long addr); 1583int in_gate_area_no_task(unsigned long addr);
1584int in_gate_area(struct task_struct *task, unsigned long addr); 1584int in_gate_area(struct task_struct *task, unsigned long addr);
diff --git a/mm/memory.c b/mm/memory.c
index e48945ab362b..b6dc37097433 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -1488,7 +1488,7 @@ int __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
1488 vma = find_extend_vma(mm, start); 1488 vma = find_extend_vma(mm, start);
1489 if (!vma && in_gate_area(tsk, start)) { 1489 if (!vma && in_gate_area(tsk, start)) {
1490 unsigned long pg = start & PAGE_MASK; 1490 unsigned long pg = start & PAGE_MASK;
1491 struct vm_area_struct *gate_vma = get_gate_vma(tsk); 1491 struct vm_area_struct *gate_vma = get_gate_vma(tsk->mm);
1492 pgd_t *pgd; 1492 pgd_t *pgd;
1493 pud_t *pud; 1493 pud_t *pud;
1494 pmd_t *pmd; 1494 pmd_t *pmd;
@@ -3496,7 +3496,7 @@ static int __init gate_vma_init(void)
3496__initcall(gate_vma_init); 3496__initcall(gate_vma_init);
3497#endif 3497#endif
3498 3498
3499struct vm_area_struct *get_gate_vma(struct task_struct *tsk) 3499struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
3500{ 3500{
3501#ifdef AT_SYSINFO_EHDR 3501#ifdef AT_SYSINFO_EHDR
3502 return &gate_vma; 3502 return &gate_vma;
diff --git a/mm/mlock.c b/mm/mlock.c
index c3924c7f00be..2689a08c79af 100644
--- a/mm/mlock.c
+++ b/mm/mlock.c
@@ -237,7 +237,7 @@ long mlock_vma_pages_range(struct vm_area_struct *vma,
237 237
238 if (!((vma->vm_flags & (VM_DONTEXPAND | VM_RESERVED)) || 238 if (!((vma->vm_flags & (VM_DONTEXPAND | VM_RESERVED)) ||
239 is_vm_hugetlb_page(vma) || 239 is_vm_hugetlb_page(vma) ||
240 vma == get_gate_vma(current))) { 240 vma == get_gate_vma(current->mm))) {
241 241
242 __mlock_vma_pages_range(vma, start, end, NULL); 242 __mlock_vma_pages_range(vma, start, end, NULL);
243 243
@@ -332,7 +332,7 @@ static int mlock_fixup(struct vm_area_struct *vma, struct vm_area_struct **prev,
332 int lock = newflags & VM_LOCKED; 332 int lock = newflags & VM_LOCKED;
333 333
334 if (newflags == vma->vm_flags || (vma->vm_flags & VM_SPECIAL) || 334 if (newflags == vma->vm_flags || (vma->vm_flags & VM_SPECIAL) ||
335 is_vm_hugetlb_page(vma) || vma == get_gate_vma(current)) 335 is_vm_hugetlb_page(vma) || vma == get_gate_vma(current->mm))
336 goto out; /* don't set VM_LOCKED, don't count */ 336 goto out; /* don't set VM_LOCKED, don't count */
337 337
338 pgoff = vma->vm_pgoff + ((start - vma->vm_start) >> PAGE_SHIFT); 338 pgoff = vma->vm_pgoff + ((start - vma->vm_start) >> PAGE_SHIFT);