mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 12:10:52 -04:00
lib/interval_tree: fast overlap detection
Allow interval trees to quickly check for overlaps to avoid unnecesary tree lookups in interval_tree_iter_first(). As of this patch, all interval tree flavors will require using a 'rb_root_cached' such that we can have the leftmost node easily available. While most users will make use of this feature, those with special functions (in addition to the generic insert, delete, search calls) will avoid using the cached option as they can do funky things with insertions -- for example, vma_interval_tree_insert_after(). [[email protected]: fix deadlock from typo vm_lock_anon_vma()] Link: http://lkml.kernel.org/r/[email protected] Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Davidlohr Bueso <[email protected]> Signed-off-by: Jérôme Glisse <[email protected]> Acked-by: Christian König <[email protected]> Acked-by: Peter Zijlstra (Intel) <[email protected]> Acked-by: Doug Ledford <[email protected]> Acked-by: Michael S. Tsirkin <[email protected]> Cc: David Airlie <[email protected]> Cc: Jason Wang <[email protected]> Cc: Christian Benvenuti <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
09663c86e2
commit
f808c13fd3
33 changed files with 145 additions and 105 deletions
10
mm/mmap.c
10
mm/mmap.c
|
|
@ -685,7 +685,7 @@ int __vma_adjust(struct vm_area_struct *vma, unsigned long start,
|
|||
struct mm_struct *mm = vma->vm_mm;
|
||||
struct vm_area_struct *next = vma->vm_next, *orig_vma = vma;
|
||||
struct address_space *mapping = NULL;
|
||||
struct rb_root *root = NULL;
|
||||
struct rb_root_cached *root = NULL;
|
||||
struct anon_vma *anon_vma = NULL;
|
||||
struct file *file = vma->vm_file;
|
||||
bool start_changed = false, end_changed = false;
|
||||
|
|
@ -3340,7 +3340,7 @@ static DEFINE_MUTEX(mm_all_locks_mutex);
|
|||
|
||||
static void vm_lock_anon_vma(struct mm_struct *mm, struct anon_vma *anon_vma)
|
||||
{
|
||||
if (!test_bit(0, (unsigned long *) &anon_vma->root->rb_root.rb_node)) {
|
||||
if (!test_bit(0, (unsigned long *) &anon_vma->root->rb_root.rb_root.rb_node)) {
|
||||
/*
|
||||
* The LSB of head.next can't change from under us
|
||||
* because we hold the mm_all_locks_mutex.
|
||||
|
|
@ -3356,7 +3356,7 @@ static void vm_lock_anon_vma(struct mm_struct *mm, struct anon_vma *anon_vma)
|
|||
* anon_vma->root->rwsem.
|
||||
*/
|
||||
if (__test_and_set_bit(0, (unsigned long *)
|
||||
&anon_vma->root->rb_root.rb_node))
|
||||
&anon_vma->root->rb_root.rb_root.rb_node))
|
||||
BUG();
|
||||
}
|
||||
}
|
||||
|
|
@ -3458,7 +3458,7 @@ out_unlock:
|
|||
|
||||
static void vm_unlock_anon_vma(struct anon_vma *anon_vma)
|
||||
{
|
||||
if (test_bit(0, (unsigned long *) &anon_vma->root->rb_root.rb_node)) {
|
||||
if (test_bit(0, (unsigned long *) &anon_vma->root->rb_root.rb_root.rb_node)) {
|
||||
/*
|
||||
* The LSB of head.next can't change to 0 from under
|
||||
* us because we hold the mm_all_locks_mutex.
|
||||
|
|
@ -3472,7 +3472,7 @@ static void vm_unlock_anon_vma(struct anon_vma *anon_vma)
|
|||
* anon_vma->root->rwsem.
|
||||
*/
|
||||
if (!__test_and_clear_bit(0, (unsigned long *)
|
||||
&anon_vma->root->rb_root.rb_node))
|
||||
&anon_vma->root->rb_root.rb_root.rb_node))
|
||||
BUG();
|
||||
anon_vma_unlock_write(anon_vma);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue