The patch titled Subject: lib/rbtree,drm/mm: add rbtree_replace_node_cached() has been added to the -mm tree. Its filename is lib-rbtreedrm-mm-add-rbtree_replace_node_cached.patch This patch should soon appear at http://ozlabs.org/~akpm/mmots/broken-out/lib-rbtreedrm-mm-add-rbtree_replace_node_cached.patch and later at http://ozlabs.org/~akpm/mmotm/broken-out/lib-rbtreedrm-mm-add-rbtree_replace_node_cached.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/SubmitChecklist when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> Subject: lib/rbtree,drm/mm: add rbtree_replace_node_cached() Add a variant of rbtree_replace_node() that maintains the leftmost cache of struct rbtree_root_cached when replacing nodes within the rbtree. As drm_mm is the only rb_replace_node() being used on an interval tree, the mistake looks fairly self-contained. Furthermore the only user of drm_mm_replace_node() is its testsuite... Testcase: igt/drm_mm/replace Link: http://lkml.kernel.org/r/20171122100729.3742-1-chris@xxxxxxxxxxxxxxxxxx Link: https://patchwork.freedesktop.org/patch/msgid/20171109212435.9265-1-chris@xxxxxxxxxxxxxxxxxx Fixes: f808c13fd373 ("lib/interval_tree: fast overlap detection") Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx> Acked-by: Davidlohr Bueso <dbueso@xxxxxxx> Cc: Jérôme Glisse <jglisse@xxxxxxxxxx> Cc: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx> Cc: Daniel Vetter <daniel.vetter@xxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- drivers/gpu/drm/drm_mm.c | 8 +++++--- include/linux/rbtree.h | 2 ++ lib/rbtree.c | 10 ++++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff -puN drivers/gpu/drm/drm_mm.c~lib-rbtreedrm-mm-add-rbtree_replace_node_cached drivers/gpu/drm/drm_mm.c --- a/drivers/gpu/drm/drm_mm.c~lib-rbtreedrm-mm-add-rbtree_replace_node_cached +++ a/drivers/gpu/drm/drm_mm.c @@ -575,21 +575,23 @@ EXPORT_SYMBOL(drm_mm_remove_node); */ void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new) { + struct drm_mm *mm = old->mm; + DRM_MM_BUG_ON(!old->allocated); *new = *old; list_replace(&old->node_list, &new->node_list); - rb_replace_node(&old->rb, &new->rb, &old->mm->interval_tree.rb_root); + rb_replace_node_cached(&old->rb, &new->rb, &mm->interval_tree); if (drm_mm_hole_follows(old)) { list_replace(&old->hole_stack, &new->hole_stack); rb_replace_node(&old->rb_hole_size, &new->rb_hole_size, - &old->mm->holes_size); + &mm->holes_size); rb_replace_node(&old->rb_hole_addr, &new->rb_hole_addr, - &old->mm->holes_addr); + &mm->holes_addr); } old->allocated = false; diff -puN include/linux/rbtree.h~lib-rbtreedrm-mm-add-rbtree_replace_node_cached include/linux/rbtree.h --- a/include/linux/rbtree.h~lib-rbtreedrm-mm-add-rbtree_replace_node_cached +++ a/include/linux/rbtree.h @@ -99,6 +99,8 @@ extern void rb_replace_node(struct rb_no struct rb_root *root); extern void rb_replace_node_rcu(struct rb_node *victim, struct rb_node *new, struct rb_root *root); +extern void rb_replace_node_cached(struct rb_node *victim, struct rb_node *new, + struct rb_root_cached *root); static inline void rb_link_node(struct rb_node *node, struct rb_node *parent, struct rb_node **rb_link) diff -puN lib/rbtree.c~lib-rbtreedrm-mm-add-rbtree_replace_node_cached lib/rbtree.c --- a/lib/rbtree.c~lib-rbtreedrm-mm-add-rbtree_replace_node_cached +++ a/lib/rbtree.c @@ -603,6 +603,16 @@ void rb_replace_node(struct rb_node *vic } EXPORT_SYMBOL(rb_replace_node); +void rb_replace_node_cached(struct rb_node *victim, struct rb_node *new, + struct rb_root_cached *root) +{ + rb_replace_node(victim, new, &root->rb_root); + + if (root->rb_leftmost == victim) + root->rb_leftmost = new; +} +EXPORT_SYMBOL(rb_replace_node_cached); + void rb_replace_node_rcu(struct rb_node *victim, struct rb_node *new, struct rb_root *root) { _ Patches currently in -mm which might be from chris@xxxxxxxxxxxxxxxxxx are lib-rbtreedrm-mm-add-rbtree_replace_node_cached.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html