prio_tree 1/3: kill vma_prio_tree_init()
Subsystems (5)
PATCH 1/1 prio_tree 1/3: kill vma_prio_tree_init()
Hello.
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.
Oleg.
Signed-off-by Oleg Nesterov <[email protected]>
include/linux/mm.h +7 -8
@@ -598,14 +598,6 @@ extern void show_mem(void);extern void si_meminfo (struct sysinfo * val);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 */ 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 *);
@@ -614,6 +606,13 @@ struct vm_area_struct *vma_prio_tree_nex struct vm_area_struct *, struct prio_tree_root *, 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 */ extern void vma_adjust (struct vm_area_struct *vma,unsigned long start,unsigned long end,pgoff_t pgoff,struct vm_area_struct *insert);
kernel/fork.c +0 -1
@@ -324,7 +324,6 @@ static inline int dup_mmap(struct mm_str tmp->vm_mm = mm; tmp->vm_next =NULL ;anon_vma_link (tmp); -vma_prio_tree_init (tmp); file = tmp->vm_file;if (file) {struct inode *inode = file->f_dentry->d_inode;
mm/fremap.c +1 -3
@@ -214,9 +214,7 @@ asmlinkage long sys_remap_file_pages(unsflush_dcache_mmap_lock (mapping); vma->vm_flags |=VM_NONLINEAR ;vma_prio_tree_remove (vma, &mapping->i_mmap); -vma_prio_tree_init (vma); -list_add_tail (&vma->shared.vm_set.list, - &mapping->i_mmap_nonlinear); +vma_nonlinear_insert (vma, &mapping->i_mmap_nonlinear);flush_dcache_mmap_unlock (mapping);spin_unlock (&mapping->i_mmap_lock); }
mm/mmap.c +2 -8
@@ -279,8 +279,7 @@ static inline void __vma_link_file(strucflush_dcache_mmap_lock (mapping);if (unlikely (vma->vm_flags &VM_NONLINEAR )) -list_add_tail (&vma->shared.vm_set.list, - &mapping->i_mmap_nonlinear); +vma_nonlinear_insert (vma, &mapping->i_mmap_nonlinear);else vma_prio_tree_insert (vma, &mapping->i_mmap);flush_dcache_mmap_unlock (mapping);
@@ -449,11 +448,8 @@ again: remove_next = 1 + (end > next-> }if (root) { -if (adjust_next) { -vma_prio_tree_init (next); +if (adjust_next)vma_prio_tree_insert (next, root); - } -vma_prio_tree_init (vma);vma_prio_tree_insert (vma, root);flush_dcache_mmap_unlock (mapping); }
@@ -1488,7 +1484,6 @@ int split_vma(struct mm_struct * mm, str/* most fields are the same, copy all, and then fixup */ *new = *vma; -vma_prio_tree_init (new);if (new_below) new->vm_end = addr;
@@ -1801,7 +1796,6 @@ struct vm_area_struct *copy_vma(struct v new_vma =kmem_cache_alloc (vm_area_cachep,SLAB_KERNEL );if (new_vma) { *new_vma = *vma; -vma_prio_tree_init (new_vma); pol =mpol_copy (vma_policy (vma));if (IS_ERR (pol)) {kmem_cache_free (vm_area_cachep, new_vma);
mm/prio_tree.c +5 -0
@@ -538,6 +538,9 @@ void vma_prio_tree_add(struct vm_area_stBUG_ON (RADIX_INDEX (vma) !=RADIX_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)list_add (&vma->shared.vm_set.list, &old->shared.vm_set.list);
@@ -557,6 +560,8 @@ void vma_prio_tree_insert(struct vm_areastruct prio_tree_node *ptr;struct vm_area_struct *old; + vma->shared.vm_set.head =NULL ; + ptr =prio_tree_insert (root, &vma->shared.prio_tree_node);if (ptr != &vma->shared.prio_tree_node) { old = prio_tree_entry(ptr, struct vm_area_struct,