LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
From: Geert Uytterhoeven <geert+renesas@glider.be>
To: Grant Likely <grant.likely@linaro.org>, Rob Herring <robh+dt@kernel.org>
Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
Geert Uytterhoeven <geert+renesas@glider.be>
Subject: [PATCH RFC 2/2] of/unittest: Add reference count tests
Date: Fri, 23 Jan 2015 17:10:05 +0100 [thread overview]
Message-ID: <1422029405-9353-3-git-send-email-geert+renesas@glider.be> (raw)
In-Reply-To: <1422029405-9353-1-git-send-email-geert+renesas@glider.be>
Add tests to detect reference count imbalances. The tests use a fixed
list of paths to devices nodes (required device nodes in a minimal DTS,
and device nodes present in unittest-data).
These tests are executed only if CONFIG_OF_DYNAMIC=y.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
drivers/of/unittest.c | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 155 insertions(+)
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
index 7aa1d6dae5ba72af..464703c6e7021760 100644
--- a/drivers/of/unittest.c
+++ b/drivers/of/unittest.c
@@ -1383,6 +1383,154 @@ out:
static inline void __init of_selftest_overlay(void) { }
#endif
+#ifdef CONFIG_OF_DYNAMIC
+static struct {
+ const char *path;
+ int refcnt;
+} refcnt_tests[] __initdata = {
+ /* required nodes */
+ { "/" },
+ { "/aliases" },
+ { "/chosen" },
+ { "/cpus" },
+ { "/cpus/cpu@0" },
+ { "/testcase-data" },
+ /* unittest-data */
+ { "/testcase-data/interrupts" },
+ { "/testcase-data/interrupts/intc0" },
+ { "/testcase-data/interrupts/intc1" },
+ { "/testcase-data/interrupts/intc2" },
+ { "/testcase-data/interrupts/interrupts0" },
+ { "/testcase-data/interrupts/interrupts1" },
+ { "/testcase-data/interrupts/interrupts-extended0" },
+ { "/testcase-data/interrupts/intmap0" },
+ { "/testcase-data/interrupts/intmap1" },
+ { "/testcase-data/platform-tests" },
+ { "/testcase-data/platform-tests/test-device@0" },
+ { "/testcase-data/platform-tests/test-device@0/dev@100" },
+ { "/testcase-data/platform-tests/test-device@1" },
+ { "/testcase-data/platform-tests/test-device@1/dev@100" },
+ { "/testcase-data/phandle-tests" },
+ { "/testcase-data/phandle-tests/consumer-a" },
+ { "/testcase-data/phandle-tests/provider0" },
+ { "/testcase-data/phandle-tests/provider1" },
+ { "/testcase-data/phandle-tests/provider2" },
+ { "/testcase-data/phandle-tests/provider3" },
+ { "/testcase-data/match-node" },
+ { "/testcase-data/match-node/a" },
+ { "/testcase-data/match-node/a/name2" },
+ { "/testcase-data/match-node/b" },
+ { "/testcase-data/match-node/b/name2" },
+ { "/testcase-data/match-node/c" },
+ { "/testcase-data/match-node/c/name2" },
+ { "/testcase-data/match-node/name0" },
+ { "/testcase-data/match-node/name1" },
+ { "/testcase-data/match-node/name3" },
+ { "/testcase-data/match-node/name4" },
+ { "/testcase-data/match-node/name5" },
+ { "/testcase-data/match-node/name6" },
+ { "/testcase-data/match-node/name7" },
+ { "/testcase-data/match-node/name8" },
+ { "/testcase-data/match-node/name9" },
+ { "/testcase-data/changeset" },
+ { "/testcase-data/changeset/node-remove" },
+ { "/testcase-data/overlay-node" },
+ { "/testcase-data/overlay-node/test-bus" },
+ { "/testcase-data/overlay-node/test-bus/test-selftest100" },
+ { "/testcase-data/overlay-node/test-bus/test-selftest101" },
+ { "/testcase-data/overlay-node/test-bus/test-selftest0" },
+ { "/testcase-data/overlay-node/test-bus/test-selftest1" },
+ { "/testcase-data/overlay-node/test-bus/test-selftest2" },
+ { "/testcase-data/overlay-node/test-bus/test-selftest3" },
+ { "/testcase-data/overlay-node/test-bus/test-selftest5" },
+ { "/testcase-data/overlay-node/test-bus/test-selftest6" },
+ { "/testcase-data/overlay-node/test-bus/test-selftest7" },
+ { "/testcase-data/overlay-node/test-bus/test-selftest8" },
+ { "/testcase-data/overlay0" },
+ { "/testcase-data/overlay0/fragment@0" },
+ { "/testcase-data/overlay0/fragment@0/__overlay__" },
+ { "/testcase-data/overlay1" },
+ { "/testcase-data/overlay1/fragment@0" },
+ { "/testcase-data/overlay1/fragment@0/__overlay__" },
+ { "/testcase-data/overlay2" },
+ { "/testcase-data/overlay2/fragment@0" },
+ { "/testcase-data/overlay2/fragment@0/__overlay__" },
+ { "/testcase-data/overlay3" },
+ { "/testcase-data/overlay3/fragment@0" },
+ { "/testcase-data/overlay3/fragment@0/__overlay__" },
+ { "/testcase-data/overlay4" },
+ { "/testcase-data/overlay4/fragment@0" },
+ { "/testcase-data/overlay4/fragment@0/__overlay__" },
+ { "/testcase-data/overlay4/fragment@0/__overlay__/test-selftest4" },
+ { "/testcase-data/overlay5" },
+ { "/testcase-data/overlay5/fragment@0" },
+ { "/testcase-data/overlay5/fragment@0/__overlay__" },
+ { "/testcase-data/overlay6" },
+ { "/testcase-data/overlay6/fragment@0" },
+ { "/testcase-data/overlay6/fragment@0/__overlay__" },
+ { "/testcase-data/overlay7" },
+ { "/testcase-data/overlay7/fragment@0" },
+ { "/testcase-data/overlay7/fragment@0/__overlay__" },
+ { "/testcase-data/overlay8" },
+ { "/testcase-data/overlay8/fragment@0" },
+ { "/testcase-data/overlay8/fragment@0/__overlay__" },
+ { "/testcase-data/overlay9" },
+ { "/testcase-data/overlay9/fragment@0" },
+ { "/testcase-data/overlay9/fragment@0/__overlay__" },
+ { "/testcase-data/duplicate-name#1" },
+ { "/testcase-data/testcase-device1" },
+ { "/testcase-data/testcase-device2" },
+ { "/__local_fixups__/testcase-data" },
+ { "/__local_fixups__/testcase-data/interrupts" },
+ { "/__local_fixups__/testcase-data/interrupts/interrupts0" },
+ { "/__local_fixups__/testcase-data/interrupts/interrupts1" },
+ { "/__local_fixups__/testcase-data/interrupts/interrupts-extended0" },
+ { "/__local_fixups__/testcase-data/interrupts/intmap0" },
+ { "/__local_fixups__/testcase-data/interrupts/intmap1" },
+ { "/__local_fixups__/testcase-data/phandle-tests" },
+ { "/__local_fixups__/testcase-data/phandle-tests/consumer-a" },
+ { "/__local_fixups__/testcase-data/overlay2" },
+ { "/__local_fixups__/testcase-data/overlay2/fragment@0" },
+ { "/__local_fixups__/testcase-data/overlay3" },
+ { "/__local_fixups__/testcase-data/overlay3/fragment@0" },
+ { "/__local_fixups__/testcase-data/overlay4" },
+ { "/__local_fixups__/testcase-data/overlay4/fragment@0" },
+ { "/__local_fixups__/testcase-data/testcase-device1" },
+ { "/__local_fixups__/testcase-data/testcase-device2" },
+};
+
+static void __init of_selftest_refcnt(void)
+{
+ static bool called;
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(refcnt_tests); i++) {
+ const char *path = refcnt_tests[i].path;
+ struct device_node *np = of_find_node_by_path(path);
+ int refcnt;
+
+ selftest(np, "%s: not found", path);
+ if (!np)
+ continue;
+
+ refcnt = atomic_read(&np->kobj.kref.refcount);
+ if (!called)
+ refcnt_tests[i].refcnt = refcnt;
+ else
+ selftest(refcnt == refcnt_tests[i].refcnt,
+ "%s: expected:%i got:%i\n", path,
+ refcnt_tests[i].refcnt, refcnt);
+
+ of_node_put(np);
+ }
+
+ called = true;
+}
+
+#else
+static inline void __init of_selftest_refcnt(void) { }
+#endif
+
static int __init of_selftest(void)
{
struct device_node *np;
@@ -1403,6 +1551,11 @@ static int __init of_selftest(void)
of_node_put(np);
pr_info("start of selftest - you will see error messages\n");
+
+ /* gather reference counts */
+ of_selftest_refcnt();
+ /* verify reference counts */
+ of_selftest_refcnt();
of_selftest_check_tree_linkage();
of_selftest_check_phandles();
of_selftest_find_node_by_name();
@@ -1420,6 +1573,8 @@ static int __init of_selftest(void)
/* Double check linkage after removing testcase data */
of_selftest_check_tree_linkage();
+ of_selftest_refcnt();
+
pr_info("end of selftest - %i passed, %i failed\n",
selftest_results.passed, selftest_results.failed);
--
1.9.1
next prev parent reply other threads:[~2015-01-23 16:10 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-23 16:10 [PATCH RFC 0/2] " Geert Uytterhoeven
2015-01-23 16:10 ` [PATCH 1/2] of: Allow selection of OF_DYNAMIC and OF_OVERLAY if OF_UNITTEST Geert Uytterhoeven
2015-03-20 12:25 ` Grant Likely
2015-03-20 13:32 ` Rob Herring
2015-03-24 22:54 ` Grant Likely
2015-03-25 14:14 ` Geert Uytterhoeven
2015-01-23 16:10 ` Geert Uytterhoeven [this message]
2015-02-04 16:14 ` [PATCH RFC 0/2] of/unittest: Add reference count tests Rob Herring
2015-02-04 17:08 ` Geert Uytterhoeven
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1422029405-9353-3-git-send-email-geert+renesas@glider.be \
--to=geert+renesas@glider.be \
--cc=devicetree@vger.kernel.org \
--cc=grant.likely@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=robh+dt@kernel.org \
--subject='Re: [PATCH RFC 2/2] of/unittest: Add reference count tests' \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).