mm: arch: make in_gate_area take an mm_struct instead of a task_struct
Stephen Wilson [Sun, 13 Mar 2011 19:49:16 +0000 (15:49 -0400)]
Morally, the question of whether an address lies in a gate vma should be asked
with respect to an mm, not a particular task.  Moreover, dropping the dependency
on task_struct will help make 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
include/linux/mm.h
mm/memory.c

index 6169f17..467aa9e 100644 (file)
@@ -825,7 +825,7 @@ int in_gate_area_no_task(unsigned long addr)
        return 0;
 }
 
-int in_gate_area(struct task_struct *task, unsigned long addr)
+int in_gate_area(struct mm_struct *mm, unsigned long addr)
 {
        return 0;
 }
index d19f305..9006e96 100644 (file)
@@ -342,7 +342,7 @@ int in_gate_area_no_task(unsigned long addr)
        return 0;
 }
 
-int in_gate_area(struct task_struct *task, unsigned long addr)
+int in_gate_area(struct mm_struct *mm, unsigned long addr)
 {
        return 0;
 }
index 3f9b6f4..62c36a8 100644 (file)
@@ -99,7 +99,7 @@ struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
        return NULL;
 }
 
-int in_gate_area(struct task_struct *task, unsigned long address)
+int in_gate_area(struct mm_struct *mm, unsigned long address)
 {
        return 0;
 }
index dd4809b..43c4416 100644 (file)
@@ -870,9 +870,9 @@ struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
        return &gate_vma;
 }
 
-int in_gate_area(struct task_struct *task, unsigned long addr)
+int in_gate_area(struct mm_struct *mm, unsigned long addr)
 {
-       struct vm_area_struct *vma = get_gate_vma(task->mm);
+       struct vm_area_struct *vma = get_gate_vma(mm);
 
        if (!vma)
                return 0;
index 1f651f6..f849bb2 100644 (file)
@@ -428,9 +428,9 @@ struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
        return NULL;
 }
 
-int in_gate_area(struct task_struct *task, unsigned long addr)
+int in_gate_area(struct mm_struct *mm, unsigned long addr)
 {
-       const struct vm_area_struct *vma = get_gate_vma(task->mm);
+       const struct vm_area_struct *vma = get_gate_vma(mm);
 
        return vma && addr >= vma->vm_start && addr < vma->vm_end;
 }
index 18b4a63..5c6d916 100644 (file)
@@ -1581,10 +1581,10 @@ static inline bool kernel_page_present(struct page *page) { return true; }
 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);
+int in_gate_area(struct mm_struct *mm, unsigned long addr);
 #else
 int in_gate_area_no_task(unsigned long addr);
-#define in_gate_area(task, addr) ({(void)task; in_gate_area_no_task(addr);})
+#define in_gate_area(mm, addr) ({(void)mm; in_gate_area_no_task(addr);})
 #endif /* __HAVE_ARCH_GATE_AREA */
 
 int drop_caches_sysctl_handler(struct ctl_table *, int,
index b6dc370..931d479 100644 (file)
@@ -1486,7 +1486,7 @@ int __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
                struct vm_area_struct *vma;
 
                vma = find_extend_vma(mm, start);
-               if (!vma && in_gate_area(tsk, start)) {
+               if (!vma && in_gate_area(tsk->mm, start)) {
                        unsigned long pg = start & PAGE_MASK;
                        struct vm_area_struct *gate_vma = get_gate_vma(tsk->mm);
                        pgd_t *pgd;