mm: arch: make get_gate_vma take an mm_struct instead of a task_struct
Stephen Wilson [Sun, 13 Mar 2011 19:49:15 +0000 (15:49 -0400)]
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>

arch/powerpc/kernel/vdso.c
arch/s390/kernel/vdso.c
arch/sh/kernel/vsyscall/vsyscall.c
arch/x86/mm/init_64.c
arch/x86/vdso/vdso32-setup.c
fs/binfmt_elf.c
fs/proc/task_mmu.c
include/linux/mm.h
mm/memory.c
mm/mlock.c

index fd87287..6169f17 100644 (file)
@@ -830,7 +830,7 @@ int in_gate_area(struct task_struct *task, unsigned long addr)
        return 0;
 }
 
-struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
+struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
 {
        return NULL;
 }
index f438d74..d19f305 100644 (file)
@@ -347,7 +347,7 @@ int in_gate_area(struct task_struct *task, unsigned long addr)
        return 0;
 }
 
-struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
+struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
 {
        return NULL;
 }
index 242117c..3f9b6f4 100644 (file)
@@ -94,7 +94,7 @@ const char *arch_vma_name(struct vm_area_struct *vma)
        return NULL;
 }
 
-struct vm_area_struct *get_gate_vma(struct task_struct *task)
+struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
 {
        return NULL;
 }
index 0aa3466..dd4809b 100644 (file)
@@ -861,10 +861,10 @@ static struct vm_area_struct gate_vma = {
        .vm_flags       = VM_READ | VM_EXEC
 };
 
-struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
+struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
 {
 #ifdef CONFIG_IA32_EMULATION
-       if (test_tsk_thread_flag(tsk, TIF_IA32))
+       if (!mm || mm->context.ia32_compat)
                return NULL;
 #endif
        return &gate_vma;
@@ -872,7 +872,7 @@ struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
 
 int in_gate_area(struct task_struct *task, unsigned long addr)
 {
-       struct vm_area_struct *vma = get_gate_vma(task);
+       struct vm_area_struct *vma = get_gate_vma(task->mm);
 
        if (!vma)
                return 0;
index 36df991..1f651f6 100644 (file)
@@ -417,11 +417,12 @@ const char *arch_vma_name(struct vm_area_struct *vma)
        return NULL;
 }
 
-struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
+struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
 {
-       struct mm_struct *mm = tsk->mm;
-
-       /* Check to see if this task was created in compat vdso mode */
+       /*
+        * Check to see if the corresponding task was created in compat vdso
+        * mode.
+        */
        if (mm && mm->context.vdso == (void *)VDSO_HIGH_BASE)
                return &gate_vma;
        return NULL;
@@ -429,7 +430,7 @@ struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
 
 int in_gate_area(struct task_struct *task, unsigned long addr)
 {
-       const struct vm_area_struct *vma = get_gate_vma(task);
+       const struct vm_area_struct *vma = get_gate_vma(task->mm);
 
        return vma && addr >= vma->vm_start && addr < vma->vm_end;
 }
index d5b640b..bbabdcc 100644 (file)
@@ -1906,7 +1906,7 @@ static int elf_core_dump(struct coredump_params *cprm)
        segs = current->mm->map_count;
        segs += elf_core_extra_phdrs();
 
-       gate_vma = get_gate_vma(current);
+       gate_vma = get_gate_vma(current->mm);
        if (gate_vma != NULL)
                segs++;
 
index 8fed0f8..e73314a 100644 (file)
@@ -126,7 +126,7 @@ static void *m_start(struct seq_file *m, loff_t *pos)
                return mm;
        down_read(&mm->mmap_sem);
 
-       tail_vma = get_gate_vma(priv->task);
+       tail_vma = get_gate_vma(priv->task->mm);
        priv->tail_vma = tail_vma;
 
        /* Start with last addr hint */
@@ -277,7 +277,8 @@ static int show_map(struct seq_file *m, void *v)
        show_map_vma(m, vma);
 
        if (m->count < m->size)  /* vma is copied successfully */
-               m->version = (vma != get_gate_vma(task))? vma->vm_start: 0;
+               m->version = (vma != get_gate_vma(task->mm))
+                       ? vma->vm_start : 0;
        return 0;
 }
 
@@ -436,7 +437,8 @@ static int show_smap(struct seq_file *m, void *v)
                        (unsigned long)(mss.pss >> (10 + PSS_SHIFT)) : 0);
 
        if (m->count < m->size)  /* vma is copied successfully */
-               m->version = (vma != get_gate_vma(task)) ? vma->vm_start : 0;
+               m->version = (vma != get_gate_vma(task->mm))
+                       ? vma->vm_start : 0;
        return 0;
 }
 
index 581703d..18b4a63 100644 (file)
@@ -1578,7 +1578,7 @@ static inline bool kernel_page_present(struct page *page) { return true; }
 #endif /* CONFIG_HIBERNATION */
 #endif
 
-extern struct vm_area_struct *get_gate_vma(struct task_struct *tsk);
+extern struct vm_area_struct *get_gate_vma(struct mm_struct *mm);
 #ifdef __HAVE_ARCH_GATE_AREA
 int in_gate_area_no_task(unsigned long addr);
 int in_gate_area(struct task_struct *task, unsigned long addr);
index e48945a..b6dc370 100644 (file)
@@ -1488,7 +1488,7 @@ int __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
                vma = find_extend_vma(mm, start);
                if (!vma && in_gate_area(tsk, start)) {
                        unsigned long pg = start & PAGE_MASK;
-                       struct vm_area_struct *gate_vma = get_gate_vma(tsk);
+                       struct vm_area_struct *gate_vma = get_gate_vma(tsk->mm);
                        pgd_t *pgd;
                        pud_t *pud;
                        pmd_t *pmd;
@@ -3496,7 +3496,7 @@ static int __init gate_vma_init(void)
 __initcall(gate_vma_init);
 #endif
 
-struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
+struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
 {
 #ifdef AT_SYSINFO_EHDR
        return &gate_vma;
index c3924c7..2689a08 100644 (file)
@@ -237,7 +237,7 @@ long mlock_vma_pages_range(struct vm_area_struct *vma,
 
        if (!((vma->vm_flags & (VM_DONTEXPAND | VM_RESERVED)) ||
                        is_vm_hugetlb_page(vma) ||
-                       vma == get_gate_vma(current))) {
+                       vma == get_gate_vma(current->mm))) {
 
                __mlock_vma_pages_range(vma, start, end, NULL);
 
@@ -332,7 +332,7 @@ static int mlock_fixup(struct vm_area_struct *vma, struct vm_area_struct **prev,
        int lock = newflags & VM_LOCKED;
 
        if (newflags == vma->vm_flags || (vma->vm_flags & VM_SPECIAL) ||
-           is_vm_hugetlb_page(vma) || vma == get_gate_vma(current))
+           is_vm_hugetlb_page(vma) || vma == get_gate_vma(current->mm))
                goto out;       /* don't set VM_LOCKED,  don't count */
 
        pgoff = vma->vm_pgoff + ((start - vma->vm_start) >> PAGE_SHIFT);