diff options
author | Stephen Wilson <wilsons@start.ca> | 2011-03-13 15:49:15 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2011-03-23 16:36:54 -0400 |
commit | 31db58b3ab432f72ea76be58b12e6ffaf627d5db (patch) | |
tree | c88b742e1f2c52045d5abc6d35d7492ebdf64541 | |
parent | 375906f8765e131a4a159b1ffebf78c15db7b3bf (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.c | 2 | ||||
-rw-r--r-- | arch/s390/kernel/vdso.c | 2 | ||||
-rw-r--r-- | arch/sh/kernel/vsyscall/vsyscall.c | 2 | ||||
-rw-r--r-- | arch/x86/mm/init_64.c | 6 | ||||
-rw-r--r-- | arch/x86/vdso/vdso32-setup.c | 11 | ||||
-rw-r--r-- | fs/binfmt_elf.c | 2 | ||||
-rw-r--r-- | fs/proc/task_mmu.c | 8 | ||||
-rw-r--r-- | include/linux/mm.h | 2 | ||||
-rw-r--r-- | mm/memory.c | 4 | ||||
-rw-r--r-- | mm/mlock.c | 4 |
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 | ||
833 | struct vm_area_struct *get_gate_vma(struct task_struct *tsk) | 833 | struct 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 | ||
350 | struct vm_area_struct *get_gate_vma(struct task_struct *tsk) | 350 | struct 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 | ||
97 | struct vm_area_struct *get_gate_vma(struct task_struct *task) | 97 | struct 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 | ||
864 | struct vm_area_struct *get_gate_vma(struct task_struct *tsk) | 864 | struct 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 | ||
873 | int in_gate_area(struct task_struct *task, unsigned long addr) | 873 | int 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 | ||
420 | struct vm_area_struct *get_gate_vma(struct task_struct *tsk) | 420 | struct 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 | ||
430 | int in_gate_area(struct task_struct *task, unsigned long addr) | 431 | int 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 | ||
1581 | extern struct vm_area_struct *get_gate_vma(struct task_struct *tsk); | 1581 | extern struct vm_area_struct *get_gate_vma(struct mm_struct *mm); |
1582 | #ifdef __HAVE_ARCH_GATE_AREA | 1582 | #ifdef __HAVE_ARCH_GATE_AREA |
1583 | int in_gate_area_no_task(unsigned long addr); | 1583 | int in_gate_area_no_task(unsigned long addr); |
1584 | int in_gate_area(struct task_struct *task, unsigned long addr); | 1584 | int 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 | ||
3499 | struct vm_area_struct *get_gate_vma(struct task_struct *tsk) | 3499 | struct 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); |