Blame view
mm/interval_tree.c
3.12 KB
6b2dbba8b mm: replace vma p... |
1 2 3 4 5 6 7 8 9 10 |
/* * mm/interval_tree.c - interval tree for mapping->i_mmap * * Copyright (C) 2012, Michel Lespinasse <walken@google.com> * * This file is released under the GPL v2. */ #include <linux/mm.h> #include <linux/fs.h> |
bf181b9f9 mm anon rmap: rep... |
11 |
#include <linux/rmap.h> |
9826a516f mm: interval tree... |
12 |
#include <linux/interval_tree_generic.h> |
6b2dbba8b mm: replace vma p... |
13 |
|
9826a516f mm: interval tree... |
14 15 16 17 18 19 20 21 22 |
static inline unsigned long vma_start_pgoff(struct vm_area_struct *v) { return v->vm_pgoff; } static inline unsigned long vma_last_pgoff(struct vm_area_struct *v) { return v->vm_pgoff + ((v->vm_end - v->vm_start) >> PAGE_SHIFT) - 1; } |
ac51b934f mm: replace vma->... |
23 24 |
INTERVAL_TREE_DEFINE(struct vm_area_struct, shared.rb, unsigned long, shared.rb_subtree_last, |
9826a516f mm: interval tree... |
25 26 27 28 29 30 |
vma_start_pgoff, vma_last_pgoff,, vma_interval_tree) /* Insert node immediately after prev in the interval tree */ void vma_interval_tree_insert_after(struct vm_area_struct *node, struct vm_area_struct *prev, struct rb_root *root) |
6b2dbba8b mm: replace vma p... |
31 32 33 |
{ struct rb_node **link; struct vm_area_struct *parent; |
9826a516f mm: interval tree... |
34 |
unsigned long last = vma_last_pgoff(node); |
6b2dbba8b mm: replace vma p... |
35 |
|
81d1b09c6 mm: convert a few... |
36 |
VM_BUG_ON_VMA(vma_start_pgoff(node) != vma_start_pgoff(prev), node); |
6b2dbba8b mm: replace vma p... |
37 |
|
ac51b934f mm: replace vma->... |
38 |
if (!prev->shared.rb.rb_right) { |
9826a516f mm: interval tree... |
39 |
parent = prev; |
ac51b934f mm: replace vma->... |
40 |
link = &prev->shared.rb.rb_right; |
6b2dbba8b mm: replace vma p... |
41 |
} else { |
ac51b934f mm: replace vma->... |
42 43 44 45 46 47 48 49 50 |
parent = rb_entry(prev->shared.rb.rb_right, struct vm_area_struct, shared.rb); if (parent->shared.rb_subtree_last < last) parent->shared.rb_subtree_last = last; while (parent->shared.rb.rb_left) { parent = rb_entry(parent->shared.rb.rb_left, struct vm_area_struct, shared.rb); if (parent->shared.rb_subtree_last < last) parent->shared.rb_subtree_last = last; |
6b2dbba8b mm: replace vma p... |
51 |
} |
ac51b934f mm: replace vma->... |
52 |
link = &parent->shared.rb.rb_left; |
6b2dbba8b mm: replace vma p... |
53 |
} |
ac51b934f mm: replace vma->... |
54 55 56 |
node->shared.rb_subtree_last = last; rb_link_node(&node->shared.rb, &parent->shared.rb, link); rb_insert_augmented(&node->shared.rb, root, |
9826a516f mm: interval tree... |
57 |
&vma_interval_tree_augment); |
6b2dbba8b mm: replace vma p... |
58 |
} |
bf181b9f9 mm anon rmap: rep... |
59 60 61 62 63 64 65 66 67 68 69 70 |
static inline unsigned long avc_start_pgoff(struct anon_vma_chain *avc) { return vma_start_pgoff(avc->vma); } static inline unsigned long avc_last_pgoff(struct anon_vma_chain *avc) { return vma_last_pgoff(avc->vma); } INTERVAL_TREE_DEFINE(struct anon_vma_chain, rb, unsigned long, rb_subtree_last, |
ed8ea8150 mm: add CONFIG_DE... |
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
avc_start_pgoff, avc_last_pgoff, static inline, __anon_vma_interval_tree) void anon_vma_interval_tree_insert(struct anon_vma_chain *node, struct rb_root *root) { #ifdef CONFIG_DEBUG_VM_RB node->cached_vma_start = avc_start_pgoff(node); node->cached_vma_last = avc_last_pgoff(node); #endif __anon_vma_interval_tree_insert(node, root); } void anon_vma_interval_tree_remove(struct anon_vma_chain *node, struct rb_root *root) { __anon_vma_interval_tree_remove(node, root); } struct anon_vma_chain * anon_vma_interval_tree_iter_first(struct rb_root *root, unsigned long first, unsigned long last) { return __anon_vma_interval_tree_iter_first(root, first, last); } struct anon_vma_chain * anon_vma_interval_tree_iter_next(struct anon_vma_chain *node, unsigned long first, unsigned long last) { return __anon_vma_interval_tree_iter_next(node, first, last); } #ifdef CONFIG_DEBUG_VM_RB void anon_vma_interval_tree_verify(struct anon_vma_chain *node) { WARN_ON_ONCE(node->cached_vma_start != avc_start_pgoff(node)); WARN_ON_ONCE(node->cached_vma_last != avc_last_pgoff(node)); } #endif |