Commit 31db58b3 authored by Stephen Wilson's avatar Stephen Wilson Committed by Al Viro

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: default avatarStephen Wilson <wilsons@start.ca>
Reviewed-by: default avatarMichel 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: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 375906f8
...@@ -830,7 +830,7 @@ int in_gate_area(struct task_struct *task, unsigned long addr) ...@@ -830,7 +830,7 @@ int in_gate_area(struct task_struct *task, unsigned long addr)
return 0; 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; return NULL;
} }
......
...@@ -347,7 +347,7 @@ int in_gate_area(struct task_struct *task, unsigned long addr) ...@@ -347,7 +347,7 @@ int in_gate_area(struct task_struct *task, unsigned long addr)
return 0; 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; return NULL;
} }
...@@ -94,7 +94,7 @@ const char *arch_vma_name(struct vm_area_struct *vma) ...@@ -94,7 +94,7 @@ const char *arch_vma_name(struct vm_area_struct *vma)
return NULL; 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; return NULL;
} }
......
...@@ -861,10 +861,10 @@ static struct vm_area_struct gate_vma = { ...@@ -861,10 +861,10 @@ static struct vm_area_struct gate_vma = {
.vm_flags = VM_READ | VM_EXEC .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 #ifdef CONFIG_IA32_EMULATION
if (test_tsk_thread_flag(tsk, TIF_IA32)) if (!mm || mm->context.ia32_compat)
return NULL; return NULL;
#endif #endif
return &gate_vma; return &gate_vma;
...@@ -872,7 +872,7 @@ struct vm_area_struct *get_gate_vma(struct task_struct *tsk) ...@@ -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) 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) if (!vma)
return 0; return 0;
......
...@@ -417,11 +417,12 @@ const char *arch_vma_name(struct vm_area_struct *vma) ...@@ -417,11 +417,12 @@ const char *arch_vma_name(struct vm_area_struct *vma)
return NULL; 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 the corresponding task was created in compat vdso
/* Check to see if this task was created in compat vdso mode */ * mode.
*/
if (mm && mm->context.vdso == (void *)VDSO_HIGH_BASE) if (mm && mm->context.vdso == (void *)VDSO_HIGH_BASE)
return &gate_vma; return &gate_vma;
return NULL; return NULL;
...@@ -429,7 +430,7 @@ struct vm_area_struct *get_gate_vma(struct task_struct *tsk) ...@@ -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) 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; return vma && addr >= vma->vm_start && addr < vma->vm_end;
} }
......
...@@ -1906,7 +1906,7 @@ static int elf_core_dump(struct coredump_params *cprm) ...@@ -1906,7 +1906,7 @@ static int elf_core_dump(struct coredump_params *cprm)
segs = current->mm->map_count; segs = current->mm->map_count;
segs += elf_core_extra_phdrs(); segs += elf_core_extra_phdrs();
gate_vma = get_gate_vma(current); gate_vma = get_gate_vma(current->mm);
if (gate_vma != NULL) if (gate_vma != NULL)
segs++; segs++;
......
...@@ -126,7 +126,7 @@ static void *m_start(struct seq_file *m, loff_t *pos) ...@@ -126,7 +126,7 @@ static void *m_start(struct seq_file *m, loff_t *pos)
return mm; return mm;
down_read(&mm->mmap_sem); 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; priv->tail_vma = tail_vma;
/* Start with last addr hint */ /* Start with last addr hint */
...@@ -277,7 +277,8 @@ static int show_map(struct seq_file *m, void *v) ...@@ -277,7 +277,8 @@ static int show_map(struct seq_file *m, void *v)
show_map_vma(m, vma); show_map_vma(m, vma);
if (m->count < m->size) /* vma is copied successfully */ 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; return 0;
} }
...@@ -436,7 +437,8 @@ static int show_smap(struct seq_file *m, void *v) ...@@ -436,7 +437,8 @@ static int show_smap(struct seq_file *m, void *v)
(unsigned long)(mss.pss >> (10 + PSS_SHIFT)) : 0); (unsigned long)(mss.pss >> (10 + PSS_SHIFT)) : 0);
if (m->count < m->size) /* vma is copied successfully */ 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; return 0;
} }
......
...@@ -1578,7 +1578,7 @@ static inline bool kernel_page_present(struct page *page) { return true; } ...@@ -1578,7 +1578,7 @@ static inline bool kernel_page_present(struct page *page) { return true; }
#endif /* CONFIG_HIBERNATION */ #endif /* CONFIG_HIBERNATION */
#endif #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 #ifdef __HAVE_ARCH_GATE_AREA
int in_gate_area_no_task(unsigned long addr); 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 task_struct *task, unsigned long addr);
......
...@@ -1488,7 +1488,7 @@ int __get_user_pages(struct task_struct *tsk, struct mm_struct *mm, ...@@ -1488,7 +1488,7 @@ int __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
vma = find_extend_vma(mm, start); vma = find_extend_vma(mm, start);
if (!vma && in_gate_area(tsk, start)) { if (!vma && in_gate_area(tsk, start)) {
unsigned long pg = start & PAGE_MASK; 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; pgd_t *pgd;
pud_t *pud; pud_t *pud;
pmd_t *pmd; pmd_t *pmd;
...@@ -3496,7 +3496,7 @@ static int __init gate_vma_init(void) ...@@ -3496,7 +3496,7 @@ static int __init gate_vma_init(void)
__initcall(gate_vma_init); __initcall(gate_vma_init);
#endif #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 #ifdef AT_SYSINFO_EHDR
return &gate_vma; return &gate_vma;
......
...@@ -237,7 +237,7 @@ long mlock_vma_pages_range(struct vm_area_struct *vma, ...@@ -237,7 +237,7 @@ long mlock_vma_pages_range(struct vm_area_struct *vma,
if (!((vma->vm_flags & (VM_DONTEXPAND | VM_RESERVED)) || if (!((vma->vm_flags & (VM_DONTEXPAND | VM_RESERVED)) ||
is_vm_hugetlb_page(vma) || is_vm_hugetlb_page(vma) ||
vma == get_gate_vma(current))) { vma == get_gate_vma(current->mm))) {
__mlock_vma_pages_range(vma, start, end, NULL); __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, ...@@ -332,7 +332,7 @@ static int mlock_fixup(struct vm_area_struct *vma, struct vm_area_struct **prev,
int lock = newflags & VM_LOCKED; int lock = newflags & VM_LOCKED;
if (newflags == vma->vm_flags || (vma->vm_flags & VM_SPECIAL) || 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 */ goto out; /* don't set VM_LOCKED, don't count */
pgoff = vma->vm_pgoff + ((start - vma->vm_start) >> PAGE_SHIFT); pgoff = vma->vm_pgoff + ((start - vma->vm_start) >> PAGE_SHIFT);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment