Commit e66c6753 authored by Rajesh Venkatasubramanian's avatar Rajesh Venkatasubramanian Committed by Linus Torvalds

[PATCH] prio_tree: kill vma_prio_tree_init()

vma_prio_tree_insert() relies on the fact, that vma was
vma_prio_tree_init()'ed.

Content of vma->shared should be considered undefined, until this vma is
inserted into i_mmap/i_mmap_nonlinear.  It's better to do proper
initialization in vma_prio_tree_add/insert.
Signed-off-by: default avatarOleg Nesterov <oleg@tv-sign.ru>
Signed-off-by: default avatarRajesh Venkatasubramanian <vrajesh@umich.edu>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 2caed7c7
...@@ -598,14 +598,6 @@ extern void show_mem(void); ...@@ -598,14 +598,6 @@ extern void show_mem(void);
extern void si_meminfo(struct sysinfo * val); extern void si_meminfo(struct sysinfo * val);
extern void si_meminfo_node(struct sysinfo *val, int nid); extern void si_meminfo_node(struct sysinfo *val, int nid);
static inline void vma_prio_tree_init(struct vm_area_struct *vma)
{
vma->shared.vm_set.list.next = NULL;
vma->shared.vm_set.list.prev = NULL;
vma->shared.vm_set.parent = NULL;
vma->shared.vm_set.head = NULL;
}
/* prio_tree.c */ /* prio_tree.c */
void vma_prio_tree_add(struct vm_area_struct *, struct vm_area_struct *old); void vma_prio_tree_add(struct vm_area_struct *, struct vm_area_struct *old);
void vma_prio_tree_insert(struct vm_area_struct *, struct prio_tree_root *); void vma_prio_tree_insert(struct vm_area_struct *, struct prio_tree_root *);
...@@ -614,6 +606,13 @@ struct vm_area_struct *vma_prio_tree_next( ...@@ -614,6 +606,13 @@ struct vm_area_struct *vma_prio_tree_next(
struct vm_area_struct *, struct prio_tree_root *, struct vm_area_struct *, struct prio_tree_root *,
struct prio_tree_iter *, pgoff_t begin, pgoff_t end); struct prio_tree_iter *, pgoff_t begin, pgoff_t end);
static inline void vma_nonlinear_insert(struct vm_area_struct *vma,
struct list_head *list)
{
vma->shared.vm_set.parent = NULL;
list_add_tail(&vma->shared.vm_set.list, list);
}
/* mmap.c */ /* mmap.c */
extern void vma_adjust(struct vm_area_struct *vma, unsigned long start, extern void vma_adjust(struct vm_area_struct *vma, unsigned long start,
unsigned long end, pgoff_t pgoff, struct vm_area_struct *insert); unsigned long end, pgoff_t pgoff, struct vm_area_struct *insert);
......
...@@ -324,7 +324,6 @@ static inline int dup_mmap(struct mm_struct * mm, struct mm_struct * oldmm) ...@@ -324,7 +324,6 @@ static inline int dup_mmap(struct mm_struct * mm, struct mm_struct * oldmm)
tmp->vm_mm = mm; tmp->vm_mm = mm;
tmp->vm_next = NULL; tmp->vm_next = NULL;
anon_vma_link(tmp); anon_vma_link(tmp);
vma_prio_tree_init(tmp);
file = tmp->vm_file; file = tmp->vm_file;
if (file) { if (file) {
struct inode *inode = file->f_dentry->d_inode; struct inode *inode = file->f_dentry->d_inode;
......
...@@ -220,9 +220,7 @@ asmlinkage long sys_remap_file_pages(unsigned long start, unsigned long size, ...@@ -220,9 +220,7 @@ asmlinkage long sys_remap_file_pages(unsigned long start, unsigned long size,
flush_dcache_mmap_lock(mapping); flush_dcache_mmap_lock(mapping);
vma->vm_flags |= VM_NONLINEAR; vma->vm_flags |= VM_NONLINEAR;
vma_prio_tree_remove(vma, &mapping->i_mmap); vma_prio_tree_remove(vma, &mapping->i_mmap);
vma_prio_tree_init(vma); vma_nonlinear_insert(vma, &mapping->i_mmap_nonlinear);
list_add_tail(&vma->shared.vm_set.list,
&mapping->i_mmap_nonlinear);
flush_dcache_mmap_unlock(mapping); flush_dcache_mmap_unlock(mapping);
spin_unlock(&mapping->i_mmap_lock); spin_unlock(&mapping->i_mmap_lock);
} }
......
...@@ -279,8 +279,7 @@ static inline void __vma_link_file(struct vm_area_struct *vma) ...@@ -279,8 +279,7 @@ static inline void __vma_link_file(struct vm_area_struct *vma)
flush_dcache_mmap_lock(mapping); flush_dcache_mmap_lock(mapping);
if (unlikely(vma->vm_flags & VM_NONLINEAR)) if (unlikely(vma->vm_flags & VM_NONLINEAR))
list_add_tail(&vma->shared.vm_set.list, vma_nonlinear_insert(vma, &mapping->i_mmap_nonlinear);
&mapping->i_mmap_nonlinear);
else else
vma_prio_tree_insert(vma, &mapping->i_mmap); vma_prio_tree_insert(vma, &mapping->i_mmap);
flush_dcache_mmap_unlock(mapping); flush_dcache_mmap_unlock(mapping);
...@@ -449,11 +448,8 @@ again: remove_next = 1 + (end > next->vm_end); ...@@ -449,11 +448,8 @@ again: remove_next = 1 + (end > next->vm_end);
} }
if (root) { if (root) {
if (adjust_next) { if (adjust_next)
vma_prio_tree_init(next);
vma_prio_tree_insert(next, root); vma_prio_tree_insert(next, root);
}
vma_prio_tree_init(vma);
vma_prio_tree_insert(vma, root); vma_prio_tree_insert(vma, root);
flush_dcache_mmap_unlock(mapping); flush_dcache_mmap_unlock(mapping);
} }
...@@ -1489,7 +1485,6 @@ int split_vma(struct mm_struct * mm, struct vm_area_struct * vma, ...@@ -1489,7 +1485,6 @@ int split_vma(struct mm_struct * mm, struct vm_area_struct * vma,
/* most fields are the same, copy all, and then fixup */ /* most fields are the same, copy all, and then fixup */
*new = *vma; *new = *vma;
vma_prio_tree_init(new);
if (new_below) if (new_below)
new->vm_end = addr; new->vm_end = addr;
...@@ -1802,7 +1797,6 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap, ...@@ -1802,7 +1797,6 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
new_vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL); new_vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
if (new_vma) { if (new_vma) {
*new_vma = *vma; *new_vma = *vma;
vma_prio_tree_init(new_vma);
pol = mpol_copy(vma_policy(vma)); pol = mpol_copy(vma_policy(vma));
if (IS_ERR(pol)) { if (IS_ERR(pol)) {
kmem_cache_free(vm_area_cachep, new_vma); kmem_cache_free(vm_area_cachep, new_vma);
......
...@@ -538,6 +538,9 @@ void vma_prio_tree_add(struct vm_area_struct *vma, struct vm_area_struct *old) ...@@ -538,6 +538,9 @@ void vma_prio_tree_add(struct vm_area_struct *vma, struct vm_area_struct *old)
BUG_ON(RADIX_INDEX(vma) != RADIX_INDEX(old)); BUG_ON(RADIX_INDEX(vma) != RADIX_INDEX(old));
BUG_ON(HEAP_INDEX(vma) != HEAP_INDEX(old)); BUG_ON(HEAP_INDEX(vma) != HEAP_INDEX(old));
vma->shared.vm_set.head = NULL;
vma->shared.vm_set.parent = NULL;
if (!old->shared.vm_set.parent) if (!old->shared.vm_set.parent)
list_add(&vma->shared.vm_set.list, list_add(&vma->shared.vm_set.list,
&old->shared.vm_set.list); &old->shared.vm_set.list);
...@@ -557,6 +560,8 @@ void vma_prio_tree_insert(struct vm_area_struct *vma, ...@@ -557,6 +560,8 @@ void vma_prio_tree_insert(struct vm_area_struct *vma,
struct prio_tree_node *ptr; struct prio_tree_node *ptr;
struct vm_area_struct *old; struct vm_area_struct *old;
vma->shared.vm_set.head = NULL;
ptr = prio_tree_insert(root, &vma->shared.prio_tree_node); ptr = prio_tree_insert(root, &vma->shared.prio_tree_node);
if (ptr != &vma->shared.prio_tree_node) { if (ptr != &vma->shared.prio_tree_node) {
old = prio_tree_entry(ptr, struct vm_area_struct, old = prio_tree_entry(ptr, struct vm_area_struct,
......
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