Lines Matching refs:anon_vma

85 static inline struct anon_vma *anon_vma_alloc(void)  in anon_vma_alloc()
87 struct anon_vma *anon_vma; in anon_vma_alloc() local
89 anon_vma = kmem_cache_alloc(anon_vma_cachep, GFP_KERNEL); in anon_vma_alloc()
90 if (anon_vma) { in anon_vma_alloc()
91 atomic_set(&anon_vma->refcount, 1); in anon_vma_alloc()
92 anon_vma->degree = 1; /* Reference for first vma */ in anon_vma_alloc()
93 anon_vma->parent = anon_vma; in anon_vma_alloc()
98 anon_vma->root = anon_vma; in anon_vma_alloc()
101 return anon_vma; in anon_vma_alloc()
104 static inline void anon_vma_free(struct anon_vma *anon_vma) in anon_vma_free() argument
106 VM_BUG_ON(atomic_read(&anon_vma->refcount)); in anon_vma_free()
126 if (rwsem_is_locked(&anon_vma->root->rwsem)) { in anon_vma_free()
127 anon_vma_lock_write(anon_vma); in anon_vma_free()
128 anon_vma_unlock_write(anon_vma); in anon_vma_free()
131 kmem_cache_free(anon_vma_cachep, anon_vma); in anon_vma_free()
146 struct anon_vma *anon_vma) in anon_vma_chain_link() argument
149 avc->anon_vma = anon_vma; in anon_vma_chain_link()
151 anon_vma_interval_tree_insert(avc, &anon_vma->rb_root); in anon_vma_chain_link()
185 struct anon_vma *anon_vma, *allocated; in __anon_vma_prepare() local
194 anon_vma = find_mergeable_anon_vma(vma); in __anon_vma_prepare()
196 if (!anon_vma) { in __anon_vma_prepare()
197 anon_vma = anon_vma_alloc(); in __anon_vma_prepare()
198 if (unlikely(!anon_vma)) in __anon_vma_prepare()
200 allocated = anon_vma; in __anon_vma_prepare()
203 anon_vma_lock_write(anon_vma); in __anon_vma_prepare()
206 if (likely(!vma->anon_vma)) { in __anon_vma_prepare()
207 vma->anon_vma = anon_vma; in __anon_vma_prepare()
208 anon_vma_chain_link(vma, avc, anon_vma); in __anon_vma_prepare()
210 anon_vma->degree++; in __anon_vma_prepare()
215 anon_vma_unlock_write(anon_vma); in __anon_vma_prepare()
238 static inline struct anon_vma *lock_anon_vma_root(struct anon_vma *root, struct anon_vma *anon_vma) in lock_anon_vma_root() argument
240 struct anon_vma *new_root = anon_vma->root; in lock_anon_vma_root()
250 static inline void unlock_anon_vma_root(struct anon_vma *root) in unlock_anon_vma_root()
277 struct anon_vma *root = NULL; in anon_vma_clone()
280 struct anon_vma *anon_vma; in anon_vma_clone() local
290 anon_vma = pavc->anon_vma; in anon_vma_clone()
291 root = lock_anon_vma_root(root, anon_vma); in anon_vma_clone()
292 anon_vma_chain_link(dst, avc, anon_vma); in anon_vma_clone()
302 if (!dst->anon_vma && src->anon_vma && in anon_vma_clone()
303 anon_vma != src->anon_vma && anon_vma->degree < 2) in anon_vma_clone()
304 dst->anon_vma = anon_vma; in anon_vma_clone()
306 if (dst->anon_vma) in anon_vma_clone()
307 dst->anon_vma->degree++; in anon_vma_clone()
318 dst->anon_vma = NULL; in anon_vma_clone()
331 struct anon_vma *anon_vma; in anon_vma_fork() local
335 if (!pvma->anon_vma) in anon_vma_fork()
339 vma->anon_vma = NULL; in anon_vma_fork()
350 if (vma->anon_vma) in anon_vma_fork()
354 anon_vma = anon_vma_alloc(); in anon_vma_fork()
355 if (!anon_vma) in anon_vma_fork()
365 anon_vma->root = pvma->anon_vma->root; in anon_vma_fork()
366 anon_vma->parent = pvma->anon_vma; in anon_vma_fork()
372 get_anon_vma(anon_vma->root); in anon_vma_fork()
374 vma->anon_vma = anon_vma; in anon_vma_fork()
375 anon_vma_lock_write(anon_vma); in anon_vma_fork()
376 anon_vma_chain_link(vma, avc, anon_vma); in anon_vma_fork()
377 anon_vma->parent->degree++; in anon_vma_fork()
378 anon_vma_unlock_write(anon_vma); in anon_vma_fork()
383 put_anon_vma(anon_vma); in anon_vma_fork()
392 struct anon_vma *root = NULL; in unlink_anon_vmas()
399 struct anon_vma *anon_vma = avc->anon_vma; in unlink_anon_vmas() local
401 root = lock_anon_vma_root(root, anon_vma); in unlink_anon_vmas()
402 anon_vma_interval_tree_remove(avc, &anon_vma->rb_root); in unlink_anon_vmas()
408 if (RB_EMPTY_ROOT(&anon_vma->rb_root.rb_root)) { in unlink_anon_vmas()
409 anon_vma->parent->degree--; in unlink_anon_vmas()
416 if (vma->anon_vma) in unlink_anon_vmas()
417 vma->anon_vma->degree--; in unlink_anon_vmas()
426 struct anon_vma *anon_vma = avc->anon_vma; in unlink_anon_vmas() local
428 VM_WARN_ON(anon_vma->degree); in unlink_anon_vmas()
429 put_anon_vma(anon_vma); in unlink_anon_vmas()
438 struct anon_vma *anon_vma = data; in anon_vma_ctor() local
440 init_rwsem(&anon_vma->rwsem); in anon_vma_ctor()
441 atomic_set(&anon_vma->refcount, 0); in anon_vma_ctor()
442 anon_vma->rb_root = RB_ROOT_CACHED; in anon_vma_ctor()
447 anon_vma_cachep = kmem_cache_create("anon_vma", sizeof(struct anon_vma), in anon_vma_init()
478 struct anon_vma *page_get_anon_vma(struct page *page) in page_get_anon_vma()
480 struct anon_vma *anon_vma = NULL; in page_get_anon_vma() local
490 anon_vma = (struct anon_vma *) (anon_mapping - PAGE_MAPPING_ANON); in page_get_anon_vma()
491 if (!atomic_inc_not_zero(&anon_vma->refcount)) { in page_get_anon_vma()
492 anon_vma = NULL; in page_get_anon_vma()
505 put_anon_vma(anon_vma); in page_get_anon_vma()
511 return anon_vma; in page_get_anon_vma()
521 struct anon_vma *page_lock_anon_vma_read(struct page *page) in page_lock_anon_vma_read()
523 struct anon_vma *anon_vma = NULL; in page_lock_anon_vma_read() local
524 struct anon_vma *root_anon_vma; in page_lock_anon_vma_read()
534 anon_vma = (struct anon_vma *) (anon_mapping - PAGE_MAPPING_ANON); in page_lock_anon_vma_read()
535 root_anon_vma = READ_ONCE(anon_vma->root); in page_lock_anon_vma_read()
544 anon_vma = NULL; in page_lock_anon_vma_read()
550 if (!atomic_inc_not_zero(&anon_vma->refcount)) { in page_lock_anon_vma_read()
551 anon_vma = NULL; in page_lock_anon_vma_read()
557 put_anon_vma(anon_vma); in page_lock_anon_vma_read()
563 anon_vma_lock_read(anon_vma); in page_lock_anon_vma_read()
565 if (atomic_dec_and_test(&anon_vma->refcount)) { in page_lock_anon_vma_read()
571 anon_vma_unlock_read(anon_vma); in page_lock_anon_vma_read()
572 __put_anon_vma(anon_vma); in page_lock_anon_vma_read()
573 anon_vma = NULL; in page_lock_anon_vma_read()
576 return anon_vma; in page_lock_anon_vma_read()
580 return anon_vma; in page_lock_anon_vma_read()
583 void page_unlock_anon_vma_read(struct anon_vma *anon_vma) in page_unlock_anon_vma_read() argument
585 anon_vma_unlock_read(anon_vma); in page_unlock_anon_vma_read()
705 struct anon_vma *page__anon_vma = page_anon_vma(page); in page_address_in_vma()
710 if (!vma->anon_vma || !page__anon_vma || in page_address_in_vma()
711 vma->anon_vma->root != page__anon_vma->root) in page_address_in_vma()
1016 struct anon_vma *anon_vma = vma->anon_vma; in page_move_anon_rmap() local
1021 VM_BUG_ON_VMA(!anon_vma, vma); in page_move_anon_rmap()
1023 anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON; in page_move_anon_rmap()
1029 WRITE_ONCE(page->mapping, (struct address_space *) anon_vma); in page_move_anon_rmap()
1042 struct anon_vma *anon_vma = vma->anon_vma; in __page_set_anon_rmap() local
1044 BUG_ON(!anon_vma); in __page_set_anon_rmap()
1055 anon_vma = anon_vma->root; in __page_set_anon_rmap()
1057 anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON; in __page_set_anon_rmap()
1058 page->mapping = (struct address_space *) anon_vma; in __page_set_anon_rmap()
1083 VM_BUG_ON_PAGE(page_anon_vma(page)->root != vma->anon_vma->root, page); in __page_check_anon_rmap()
1802 void __put_anon_vma(struct anon_vma *anon_vma) in __put_anon_vma() argument
1804 struct anon_vma *root = anon_vma->root; in __put_anon_vma()
1806 anon_vma_free(anon_vma); in __put_anon_vma()
1807 if (root != anon_vma && atomic_dec_and_test(&root->refcount)) in __put_anon_vma()
1811 static struct anon_vma *rmap_walk_anon_lock(struct page *page, in rmap_walk_anon_lock()
1814 struct anon_vma *anon_vma; in rmap_walk_anon_lock() local
1825 anon_vma = page_anon_vma(page); in rmap_walk_anon_lock()
1826 if (!anon_vma) in rmap_walk_anon_lock()
1829 anon_vma_lock_read(anon_vma); in rmap_walk_anon_lock()
1830 return anon_vma; in rmap_walk_anon_lock()
1850 struct anon_vma *anon_vma; in rmap_walk_anon() local
1855 anon_vma = page_anon_vma(page); in rmap_walk_anon()
1857 VM_BUG_ON_PAGE(!anon_vma, page); in rmap_walk_anon()
1859 anon_vma = rmap_walk_anon_lock(page, rwc); in rmap_walk_anon()
1861 if (!anon_vma) in rmap_walk_anon()
1866 anon_vma_interval_tree_foreach(avc, &anon_vma->rb_root, in rmap_walk_anon()
1883 anon_vma_unlock_read(anon_vma); in rmap_walk_anon()
1971 struct anon_vma *anon_vma = vma->anon_vma; in hugepage_add_anon_rmap() local
1975 BUG_ON(!anon_vma); in hugepage_add_anon_rmap()