From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752008AbdKVKJN (ORCPT ); Wed, 22 Nov 2017 05:09:13 -0500 Received: from mail.fireflyinternet.com ([109.228.58.192]:54421 "EHLO fireflyinternet.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751723AbdKVKJL (ORCPT ); Wed, 22 Nov 2017 05:09:11 -0500 X-Default-Received-SPF: pass (skip=forwardok (res=PASS)) x-ip-name=78.156.65.138; From: Chris Wilson To: akpm@linux-foundation.org Cc: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, Chris Wilson , Davidlohr Bueso , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Joonas Lahtinen , Daniel Vetter Subject: [PATCH] lib/rbtree,drm/mm: Add rbtree_replace_node_cached() Date: Wed, 22 Nov 2017 10:07:29 +0000 Message-Id: <20171122100729.3742-1-chris@chris-wilson.co.uk> X-Mailer: git-send-email 2.15.0 In-Reply-To: <20171109212435.9265-1-chris@chris-wilson.co.uk> References: <20171109212435.9265-1-chris@chris-wilson.co.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Originating-IP: 78.156.65.138 X-Country: code=GB country="United Kingdom" ip=78.156.65.138 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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... Fixes: f808c13fd373 ("lib/interval_tree: fast overlap detection") Testcase: igt/drm_mm/replace Signed-off-by: Chris Wilson Cc: Davidlohr Bueso Cc: Jérôme Glisse Cc: Andrew Morton Cc: Joonas Lahtinen Cc: Daniel Vetter Link: https://patchwork.freedesktop.org/patch/msgid/20171109212435.9265-1-chris@chris-wilson.co.uk Acked-by: Davidlohr Bueso Reviewed-by: Joonas Lahtinen --- drivers/gpu/drm/drm_mm.c | 8 +++++--- include/linux/rbtree.h | 2 ++ lib/rbtree.c | 10 ++++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c index 61a1c8ea74bc..c3c79ee6119e 100644 --- a/drivers/gpu/drm/drm_mm.c +++ b/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 --git a/include/linux/rbtree.h b/include/linux/rbtree.h index d574361943ea..fcbeed4053ef 100644 --- a/include/linux/rbtree.h +++ b/include/linux/rbtree.h @@ -99,6 +99,8 @@ extern void rb_replace_node(struct rb_node *victim, struct rb_node *new, 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 --git a/lib/rbtree.c b/lib/rbtree.c index ba4a9d165f1b..d3ff682fd4b8 100644 --- a/lib/rbtree.c +++ b/lib/rbtree.c @@ -603,6 +603,16 @@ void rb_replace_node(struct rb_node *victim, struct rb_node *new, } 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) { -- 2.15.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Wilson Subject: [PATCH] lib/rbtree,drm/mm: Add rbtree_replace_node_cached() Date: Wed, 22 Nov 2017 10:07:29 +0000 Message-ID: <20171122100729.3742-1-chris@chris-wilson.co.uk> References: <20171109212435.9265-1-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20171109212435.9265-1-chris@chris-wilson.co.uk> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: akpm@linux-foundation.org Cc: Davidlohr Bueso , Daniel Vetter , intel-gfx@lists.freedesktop.org, Joonas Lahtinen , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= List-Id: dri-devel@lists.freedesktop.org QWRkIGEgdmFyaWFudCBvZiByYnRyZWVfcmVwbGFjZV9ub2RlKCkgdGhhdCBtYWludGFpbnMgdGhl IGxlZnRtb3N0CmNhY2hlIG9mIHN0cnVjdCByYnRyZWVfcm9vdF9jYWNoZWQgd2hlbiByZXBsYWNp bmcgbm9kZXMgd2l0aGluIHRoZQpyYnRyZWUuCgpBcyBkcm1fbW0gaXMgdGhlIG9ubHkgcmJfcmVw bGFjZV9ub2RlKCkgYmVpbmcgdXNlZCBvbiBhbiBpbnRlcnZhbCB0cmVlLAp0aGUgbWlzdGFrZSBs b29rcyBmYWlybHkgc2VsZi1jb250YWluZWQuIEZ1cnRoZXJtb3JlIHRoZSBvbmx5IHVzZXIgb2YK ZHJtX21tX3JlcGxhY2Vfbm9kZSgpIGlzIGl0cyB0ZXN0c3VpdGUuLi4KCkZpeGVzOiBmODA4YzEz ZmQzNzMgKCJsaWIvaW50ZXJ2YWxfdHJlZTogZmFzdCBvdmVybGFwIGRldGVjdGlvbiIpClRlc3Rj YXNlOiBpZ3QvZHJtX21tL3JlcGxhY2UKU2lnbmVkLW9mZi1ieTogQ2hyaXMgV2lsc29uIDxjaHJp c0BjaHJpcy13aWxzb24uY28udWs+CkNjOiBEYXZpZGxvaHIgQnVlc28gPGRidWVzb0BzdXNlLmRl PgpDYzogSsOpcsO0bWUgR2xpc3NlIDxqZ2xpc3NlQHJlZGhhdC5jb20+CkNjOiBBbmRyZXcgTW9y dG9uIDxha3BtQGxpbnV4LWZvdW5kYXRpb24ub3JnPgpDYzogSm9vbmFzIExhaHRpbmVuIDxqb29u YXMubGFodGluZW5AbGludXguaW50ZWwuY29tPgpDYzogRGFuaWVsIFZldHRlciA8ZGFuaWVsLnZl dHRlckBmZndsbC5jaD4KTGluazogaHR0cHM6Ly9wYXRjaHdvcmsuZnJlZWRlc2t0b3Aub3JnL3Bh dGNoL21zZ2lkLzIwMTcxMTA5MjEyNDM1LjkyNjUtMS1jaHJpc0BjaHJpcy13aWxzb24uY28udWsK QWNrZWQtYnk6IERhdmlkbG9ociBCdWVzbyA8ZGJ1ZXNvQHN1c2UuZGU+ClJldmlld2VkLWJ5OiBK b29uYXMgTGFodGluZW4gPGpvb25hcy5sYWh0aW5lbkBsaW51eC5pbnRlbC5jb20+Ci0tLQogZHJp dmVycy9ncHUvZHJtL2RybV9tbS5jIHwgIDggKysrKystLS0KIGluY2x1ZGUvbGludXgvcmJ0cmVl LmggICB8ICAyICsrCiBsaWIvcmJ0cmVlLmMgICAgICAgICAgICAgfCAxMCArKysrKysrKysrCiAz IGZpbGVzIGNoYW5nZWQsIDE3IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCgpkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9tbS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9tbS5j CmluZGV4IDYxYTFjOGVhNzRiYy4uYzNjNzllZTYxMTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dw dS9kcm0vZHJtX21tLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9tbS5jCkBAIC01NzUsMjEg KzU3NSwyMyBAQCBFWFBPUlRfU1lNQk9MKGRybV9tbV9yZW1vdmVfbm9kZSk7CiAgKi8KIHZvaWQg ZHJtX21tX3JlcGxhY2Vfbm9kZShzdHJ1Y3QgZHJtX21tX25vZGUgKm9sZCwgc3RydWN0IGRybV9t bV9ub2RlICpuZXcpCiB7CisJc3RydWN0IGRybV9tbSAqbW0gPSBvbGQtPm1tOworCiAJRFJNX01N X0JVR19PTighb2xkLT5hbGxvY2F0ZWQpOwogCiAJKm5ldyA9ICpvbGQ7CiAKIAlsaXN0X3JlcGxh Y2UoJm9sZC0+bm9kZV9saXN0LCAmbmV3LT5ub2RlX2xpc3QpOwotCXJiX3JlcGxhY2Vfbm9kZSgm b2xkLT5yYiwgJm5ldy0+cmIsICZvbGQtPm1tLT5pbnRlcnZhbF90cmVlLnJiX3Jvb3QpOworCXJi X3JlcGxhY2Vfbm9kZV9jYWNoZWQoJm9sZC0+cmIsICZuZXctPnJiLCAmbW0tPmludGVydmFsX3Ry ZWUpOwogCiAJaWYgKGRybV9tbV9ob2xlX2ZvbGxvd3Mob2xkKSkgewogCQlsaXN0X3JlcGxhY2Uo Jm9sZC0+aG9sZV9zdGFjaywgJm5ldy0+aG9sZV9zdGFjayk7CiAJCXJiX3JlcGxhY2Vfbm9kZSgm b2xkLT5yYl9ob2xlX3NpemUsCiAJCQkJJm5ldy0+cmJfaG9sZV9zaXplLAotCQkJCSZvbGQtPm1t LT5ob2xlc19zaXplKTsKKwkJCQkmbW0tPmhvbGVzX3NpemUpOwogCQlyYl9yZXBsYWNlX25vZGUo Jm9sZC0+cmJfaG9sZV9hZGRyLAogCQkJCSZuZXctPnJiX2hvbGVfYWRkciwKLQkJCQkmb2xkLT5t bS0+aG9sZXNfYWRkcik7CisJCQkJJm1tLT5ob2xlc19hZGRyKTsKIAl9CiAKIAlvbGQtPmFsbG9j YXRlZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYnRyZWUuaCBiL2luY2x1 ZGUvbGludXgvcmJ0cmVlLmgKaW5kZXggZDU3NDM2MTk0M2VhLi5mY2JlZWQ0MDUzZWYgMTAwNjQ0 Ci0tLSBhL2luY2x1ZGUvbGludXgvcmJ0cmVlLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYnRyZWUu aApAQCAtOTksNiArOTksOCBAQCBleHRlcm4gdm9pZCByYl9yZXBsYWNlX25vZGUoc3RydWN0IHJi X25vZGUgKnZpY3RpbSwgc3RydWN0IHJiX25vZGUgKm5ldywKIAkJCSAgICBzdHJ1Y3QgcmJfcm9v dCAqcm9vdCk7CiBleHRlcm4gdm9pZCByYl9yZXBsYWNlX25vZGVfcmN1KHN0cnVjdCByYl9ub2Rl ICp2aWN0aW0sIHN0cnVjdCByYl9ub2RlICpuZXcsCiAJCQkJc3RydWN0IHJiX3Jvb3QgKnJvb3Qp OworZXh0ZXJuIHZvaWQgcmJfcmVwbGFjZV9ub2RlX2NhY2hlZChzdHJ1Y3QgcmJfbm9kZSAqdmlj dGltLCBzdHJ1Y3QgcmJfbm9kZSAqbmV3LAorCQkJCSAgIHN0cnVjdCByYl9yb290X2NhY2hlZCAq cm9vdCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByYl9saW5rX25vZGUoc3RydWN0IHJiX25vZGUg Km5vZGUsIHN0cnVjdCByYl9ub2RlICpwYXJlbnQsCiAJCQkJc3RydWN0IHJiX25vZGUgKipyYl9s aW5rKQpkaWZmIC0tZ2l0IGEvbGliL3JidHJlZS5jIGIvbGliL3JidHJlZS5jCmluZGV4IGJhNGE5 ZDE2NWYxYi4uZDNmZjY4MmZkNGI4IDEwMDY0NAotLS0gYS9saWIvcmJ0cmVlLmMKKysrIGIvbGli L3JidHJlZS5jCkBAIC02MDMsNiArNjAzLDE2IEBAIHZvaWQgcmJfcmVwbGFjZV9ub2RlKHN0cnVj dCByYl9ub2RlICp2aWN0aW0sIHN0cnVjdCByYl9ub2RlICpuZXcsCiB9CiBFWFBPUlRfU1lNQk9M KHJiX3JlcGxhY2Vfbm9kZSk7CiAKK3ZvaWQgcmJfcmVwbGFjZV9ub2RlX2NhY2hlZChzdHJ1Y3Qg cmJfbm9kZSAqdmljdGltLCBzdHJ1Y3QgcmJfbm9kZSAqbmV3LAorCQkJICAgIHN0cnVjdCByYl9y b290X2NhY2hlZCAqcm9vdCkKK3sKKwlyYl9yZXBsYWNlX25vZGUodmljdGltLCBuZXcsICZyb290 LT5yYl9yb290KTsKKworCWlmIChyb290LT5yYl9sZWZ0bW9zdCA9PSB2aWN0aW0pCisJCXJvb3Qt PnJiX2xlZnRtb3N0ID0gbmV3OworfQorRVhQT1JUX1NZTUJPTChyYl9yZXBsYWNlX25vZGVfY2Fj aGVkKTsKKwogdm9pZCByYl9yZXBsYWNlX25vZGVfcmN1KHN0cnVjdCByYl9ub2RlICp2aWN0aW0s IHN0cnVjdCByYl9ub2RlICpuZXcsCiAJCQkgc3RydWN0IHJiX3Jvb3QgKnJvb3QpCiB7Ci0tIAoy LjE1LjAKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRy aS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRw czovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=