Commit 8a194945 authored by Chris Wilson's avatar Chris Wilson

drm/mm: Fix caching of leftmost node in the interval tree

When we descend the tree to find our slot, if we step to the right, we
are no longer the leftmost node.

Fixes: f808c13f ("lib/interval_tree: fast overlap detection")
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Davidlohr Bueso <dbueso@suse.de>
Cc: Jérôme Glisse <jglisse@redhat.com>
Cc: Christian König <christian.koenig@amd.com>
Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Acked-by: Christian König <christian.koenig@amd.com> for now.
Link: https://patchwork.freedesktop.org/patch/msgid/20180220093738.1461-1-chris@chris-wilson.co.uk
parent 2b91e3c4
...@@ -180,7 +180,7 @@ static void drm_mm_interval_tree_add_node(struct drm_mm_node *hole_node, ...@@ -180,7 +180,7 @@ static void drm_mm_interval_tree_add_node(struct drm_mm_node *hole_node,
struct drm_mm *mm = hole_node->mm; struct drm_mm *mm = hole_node->mm;
struct rb_node **link, *rb; struct rb_node **link, *rb;
struct drm_mm_node *parent; struct drm_mm_node *parent;
bool leftmost = true; bool leftmost;
node->__subtree_last = LAST(node); node->__subtree_last = LAST(node);
...@@ -201,6 +201,7 @@ static void drm_mm_interval_tree_add_node(struct drm_mm_node *hole_node, ...@@ -201,6 +201,7 @@ static void drm_mm_interval_tree_add_node(struct drm_mm_node *hole_node,
} else { } else {
rb = NULL; rb = NULL;
link = &mm->interval_tree.rb_root.rb_node; link = &mm->interval_tree.rb_root.rb_node;
leftmost = true;
} }
while (*link) { while (*link) {
...@@ -208,11 +209,11 @@ static void drm_mm_interval_tree_add_node(struct drm_mm_node *hole_node, ...@@ -208,11 +209,11 @@ static void drm_mm_interval_tree_add_node(struct drm_mm_node *hole_node,
parent = rb_entry(rb, struct drm_mm_node, rb); parent = rb_entry(rb, struct drm_mm_node, rb);
if (parent->__subtree_last < node->__subtree_last) if (parent->__subtree_last < node->__subtree_last)
parent->__subtree_last = node->__subtree_last; parent->__subtree_last = node->__subtree_last;
if (node->start < parent->start) if (node->start < parent->start) {
link = &parent->rb.rb_left; link = &parent->rb.rb_left;
else { } else {
link = &parent->rb.rb_right; link = &parent->rb.rb_right;
leftmost = true; leftmost = false;
} }
} }
......
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