Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp7791134ybl; Tue, 24 Dec 2019 09:03:05 -0800 (PST) X-Google-Smtp-Source: APXvYqy6XKbtQ5MHTJZ2m1YQbXqzmWT6+DHmh+QgO+7/KpwmFEPE3qcxLWGszUPwssgGWQf1Fyhv X-Received: by 2002:a9d:7ad9:: with SMTP id m25mr37364253otn.13.1577206984213; Tue, 24 Dec 2019 09:03:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577206984; cv=none; d=google.com; s=arc-20160816; b=gH1LDJV61f+nNyK1U+Scv66MwfgvSDKnYd1R8gnGnsXOHFDRGzBCM9nYxGnJuODG7F 3yMvRbrgN6rVfvuGlDUZKEb5iQeuSvM1y/mX9t0H8fdF7p/AqZ3bvimVFwMqIXGpfSAd rtqs28Jmo0K0wnKcJtgv1iayPBHUwNb8p40IEKbSeopDyR6GaQvEKOuMHysBm8M1Qjys sLJ72Y9yQ8QGBXPOtK8MoHXACJYvf0DDO/dslMPJCDg8SPqUtW8DYVVwcOy1KrVdlI2S bpYjGZdQ43NSm5oG6yjK/xh6CFOF8V+GBasKDi6G9M+F3Mc9Z4kSRn8loXdRoB9eFpfk hqHw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=fMlqiUykmo16Z9pg3WBxmVvNi2niQ348Njp7IT+vbho=; b=0kgL7b/mescdXaLlZlAmLeX6S9S2yAVGUZWa2xAQc2r/CVZQ5VCkIvaP0wWMLroIZY tR7btgsset7F1z2V9tlHvYx0+xchiVAzQ4aHjEz5BomDesgJra9CBvGiHDtJzfNaKbri 8aJR/qJ9T0b6PMUXlERI2ciu3hLCu2rqnPMa3t03V6CxyWBO3/j7w3rnV8YOqBE6dfsI q5rKFpt6nui88V61umwcSTx4bJ0IQQjMrdszfEr6EWGMt2mRW7+ZSy4xDrxE5uxZFyAP f1+X/E0TU0dXDFoTZAc9FDw9cDb/ghf3KCCBJno0c7xRQc6Xx4qf/+Vbd2y7+umVW3Ru EJ6A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@hev-cc.20150623.gappssmtp.com header.s=20150623 header.b=OK11mFGH; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o6si12768619otk.201.2019.12.24.09.02.24; Tue, 24 Dec 2019 09:03:04 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@hev-cc.20150623.gappssmtp.com header.s=20150623 header.b=OK11mFGH; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726203AbfLXRAa (ORCPT + 99 others); Tue, 24 Dec 2019 12:00:30 -0500 Received: from mail-lf1-f67.google.com ([209.85.167.67]:40962 "EHLO mail-lf1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726168AbfLXRAa (ORCPT ); Tue, 24 Dec 2019 12:00:30 -0500 Received: by mail-lf1-f67.google.com with SMTP id m30so15475619lfp.8 for ; Tue, 24 Dec 2019 09:00:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hev-cc.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=fMlqiUykmo16Z9pg3WBxmVvNi2niQ348Njp7IT+vbho=; b=OK11mFGHAvMV+VshqPr29zmkfLsHdHcrFCWRTqi8KliQvT/irVVhbSPhfQXMou+Wyh JYTobjcq4YuqpvJkBSoQA29mR00WKRc2Q3+HgKREx8lvjsnuTaBxXrWWPyamrlCrnRVr HqRbg7r2EMdOdj69RILBR51XF0es+V2Mtd2yrWVG1NeYhsPtkVMWuv6+NIwfFQJMI0ys Sk9EQyw0XyN5UEnot7DTrbXD2x+cBI35KMJZlDGSx1cMKg3HieCFK7ucTDETOwyLS37m UV+UjwBQMB20AxwH5TXyZCuiGqZh/Nl5etVXIjKrKd+8Nj54A+CFXy2WO/ZijcGG1Aak fCBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=fMlqiUykmo16Z9pg3WBxmVvNi2niQ348Njp7IT+vbho=; b=fW4y/dG3vVMFesqjgbsf+F9FnJ/zXu/B+W3oUCTE+3JJeM8e+enQ8Id2Ddtkn4qTmt ciAskLKOvhAIpAmaFJO+K11av8xpm7sFBXMh4NaiqW9HtZxF9wdDyNJcBQFju7IwfZpB j8zUlgEtrso9mIEv/hD/msSRSf1qs+FeQrcYlddAUaxu0zxji9TcU1XT3fQpt+XWD3KV IDaqLYrX8wDV/+qcnND1eNy3VgmeQObgtIYKXu3Ko0mYPISMyBbygOjqZM4X7s0OVz1a oq0TMk/orn3+/39+lL1iVUxLgJGJMRZlZI2rPft0CnOXUN8qr9wbAvyT4IIdWjZ4llPc mq5g== X-Gm-Message-State: APjAAAUTyED1GW7Ad4fPMFj0+BH1PcdLGRH+jOPpqOLGf/6hIbQMMnHP qtmlKZ56nB6qGBb82O9QesdAckbb2Bef+8qXYLHXJ+o7KcU= X-Received: by 2002:a19:84d:: with SMTP id 74mr20107748lfi.122.1577206826723; Tue, 24 Dec 2019 09:00:26 -0800 (PST) MIME-Version: 1.0 References: <20191224121210.29713-1-r@hev.cc> In-Reply-To: <20191224121210.29713-1-r@hev.cc> From: Hev Date: Wed, 25 Dec 2019 01:00:15 +0800 Message-ID: Subject: Re: [RFC PATCH 1/3] selftests: add rbtree selftests To: linux-kernel@vger.kernel.org Cc: Andrew Morton , Michel Lespinasse , Peter Zijlstra Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, On Tue, Dec 24, 2019 at 8:12 PM Heiher wrote: > > This adds the selftest for rbtree. It will reproduce the crash at earsing. > > Signed-off-by: hev > Cc: Andrew Morton > Cc: Michel Lespinasse > Cc: Peter Zijlstra > --- > tools/testing/selftests/Makefile | 1 + > tools/testing/selftests/lib/rbtree/.gitignore | 1 + > tools/testing/selftests/lib/rbtree/Makefile | 29 ++++++++ > .../selftests/lib/rbtree/rbtree_test.c | 70 +++++++++++++++++++ > 4 files changed, 101 insertions(+) > create mode 100644 tools/testing/selftests/lib/rbtree/.gitignore > create mode 100644 tools/testing/selftests/lib/rbtree/Makefile > create mode 100644 tools/testing/selftests/lib/rbtree/rbtree_test.c > > diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile > index b001c602414b..0e84ca3f207f 100644 > --- a/tools/testing/selftests/Makefile > +++ b/tools/testing/selftests/Makefile > @@ -25,6 +25,7 @@ TARGETS += kcmp > TARGETS += kexec > TARGETS += kvm > TARGETS += lib > +TARGETS += lib/rbtree > TARGETS += livepatch > TARGETS += membarrier > TARGETS += memfd > diff --git a/tools/testing/selftests/lib/rbtree/.gitignore b/tools/testing/selftests/lib/rbtree/.gitignore > new file mode 100644 > index 000000000000..4c9f82761fad > --- /dev/null > +++ b/tools/testing/selftests/lib/rbtree/.gitignore > @@ -0,0 +1 @@ > +rbtree_test > diff --git a/tools/testing/selftests/lib/rbtree/Makefile b/tools/testing/selftests/lib/rbtree/Makefile > new file mode 100644 > index 000000000000..68fa9dad24a1 > --- /dev/null > +++ b/tools/testing/selftests/lib/rbtree/Makefile > @@ -0,0 +1,29 @@ > +# SPDX-License-Identifier: GPL-2.0 > + > +CFLAGS += -I../../../../include/ > + > +include ../../lib.mk > + > +# lib.mk TEST_CUSTOM_PROGS var is for custom tests that need special > +# build rules. lib.mk will run and install them. > + > +TEST_CUSTOM_PROGS := $(OUTPUT)/rbtree_test > +all: $(TEST_CUSTOM_PROGS) > + > +OBJS = rbtree_test.o > + > +LIBS = ../../../../lib/rbtree.o > + > +OBJS := $(patsubst %,$(OUTPUT)/%,$(OBJS)) > +LIBS := $(patsubst %,$(OUTPUT)/%,$(LIBS)) > + > +$(TEST_CUSTOM_PROGS): $(LIBS) $(OBJS) > + $(CC) -o $(TEST_CUSTOM_PROGS) $(OBJS) $(LIBS) $(CFLAGS) $(LDFLAGS) > + > +$(OBJS): $(OUTPUT)/%.o: %.c > + $(CC) -c $^ -o $@ $(CFLAGS) > + > +$(LIBS): $(OUTPUT)/%.o: %.c > + $(CC) -c $^ -o $@ $(CFLAGS) > + > +EXTRA_CLEAN := $(TEST_CUSTOM_PROGS) $(OBJS) $(LIBS) > diff --git a/tools/testing/selftests/lib/rbtree/rbtree_test.c b/tools/testing/selftests/lib/rbtree/rbtree_test.c > new file mode 100644 > index 000000000000..11420541071a > --- /dev/null > +++ b/tools/testing/selftests/lib/rbtree/rbtree_test.c > @@ -0,0 +1,70 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +#include > +#include > +#include "../../kselftest_harness.h" > + > +struct node { > + struct rb_node node; > + int key; > +}; > + > +static int _insert(struct rb_root *tree, int key) > +{ > + struct rb_node **new = &tree->rb_node, *parent = NULL; > + struct node *node; > + > + while (*new) { > + struct node *this = container_of(*new, struct node, node); > + > + if (key < this->key) > + new = &((*new)->rb_left); > + else if (key > this->key) > + new = &((*new)->rb_right); > + else > + return 0; > + } > + > + node = malloc(sizeof(struct node)); > + if (!node) > + return 0; > + > + node->key = key; > + rb_link_node(&node->node, parent, new); > + rb_insert_color(&node->node, tree); > + > + return 1; > +} > + > +static void _remove(struct rb_root *tree, int key) > +{ > + struct rb_node **node = &tree->rb_node; > + > + while (*node) { > + struct node *this = container_of(*node, struct node, node); > + > + if (key < this->key) { > + node = &((*node)->rb_left); > + } else if (key > this->key) { > + node = &((*node)->rb_right); > + } else { > + rb_erase(&this->node, tree); > + free(this); > + return; > + } > + } > +} > + > +TEST(rbtree) > +{ > + struct rb_root tree = { 0 }; > + > + _insert(&tree, 2); > + _insert(&tree, 1); > + _insert(&tree, 4); > + _insert(&tree, 3); > + > + _remove(&tree, 2); > +} > + > +TEST_HARNESS_MAIN > -- > 2.24.1 > Sorry, recall these patches. It was my mistake. I forget to update the parent pointer at inserting. :( -- Best regards! Hev https://hev.cc