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>
This commit is contained in:
Родитель
375906f876
Коммит
31db58b3ab
|
@ -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)
|
||||||
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)
|
||||||
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 = {
|
||||||
.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)
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
(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; }
|
||||||
#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,
|
||||||
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)
|
||||||
__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,
|
||||||
|
|
||||||
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,
|
||||||
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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче