clk: Add kunit tests for fixed rate and parent data
Subsystems (8)
Stephen Boyd
maintainerv8 cover clk: Add kunit tests for fixed rate and parent data
This patch series adds unit tests for the clk fixed rate basic type and the clk registration functions that use struct clk_parent_data. To get there, we add support for loading device tree overlays onto the live DTB along with probing platform drivers to bind to device nodes in the overlays. With this series, we're able to exercise some of the code in the common clk framework that uses devicetree lookups to find parents and the fixed rate clk code that scans device tree directly and creates clks. Please review.
I Cced everyone to all the patches so they get the full context. I'm hoping I can take the whole pile through the clk tree as they all build upon each other. Or the DT part can be merged through the DT tree to reduce the dependencies.
Changes from v7: https://lore.kernel.org/r/[email protected]
* Support modular builds properly by compiling overlay with tests into one .ko
* Fold in thinko fix from Geert to DT overlay application patch
* Export device_is_bound() to fix module build
* Add more module license and description
Changes from v6: https://lore.kernel.org/r/[email protected]
* Fix kasan error in platform test by fixing the condition to check for correct free callback
* Add module descriptions to new modules
Changes from v5: https://lore.kernel.org/r/[email protected]
* Pick up reviewed-by tags
* Drop test vendor prefix bindings as dtschema allows anything now
* Use of_node_put_kunit() more to plug some reference leaks
* Select DTC config to avoid compile fails because of missing dtc
* Don't skip for OF_OVERLAY in overlay tests because they depend on it
Changes from v4: https://lore.kernel.org/r/[email protected]
* Picked up reviewed-by tags
* Check for non-NULL device pointers before calling put_device()
* Fix CFI issues with kunit actions
* Introduce platform_device_prepare_wait_for_probe() helper to wait for a platform device to probe
* Move platform code to lib/kunit and rename functions to have kunit prefix
* Fix issue with platform wrappers messing up reference counting because they used kunit actions
* New patch to populate overlay devices on root node for powerpc
* Make fixed-rate binding generic single clk consumer binding
Changes from v3: https://lore.kernel.org/r/[email protected]
* No longer depend on Frank's series[1] because it was merged upstream[2]
* Use kunit_add_action_or_reset() to shorten code
* Skip tests properly when CONFIG_OF_OVERLAY isn't set
Changes from v2: https://lore.kernel.org/r/[email protected]
* Overlays don't depend on __symbols__ node
* Depend on Frank's always create root node if CONFIG_OF series[1]
* Added kernel-doc to KUnit API doc
* Fixed some kernel-doc on functions
* More test cases for fixed rate clk
Changes from v1: https://lore.kernel.org/r/[email protected]
* Don't depend on UML, use unittest data approach to attach nodes
* Introduce overlay loading API for KUnit
* Move platform_device KUnit code to drivers/base/test
* Use #define macros for constants shared between unit tests and overlays
* Settle on "test" as a vendor prefix
* Make KUnit wrappers have "_kunit" postfix
[1] https://lore.kernel.org/r/[email protected]
[2] https://lore.kernel.org/r/[email protected]
Stephen Boyd (8):
of/platform: Allow overlays to create platform devices from the root
node
of: Add test managed wrappers for of_overlay_apply()/of_node_put()
dt-bindings: vendor-prefixes: Add "test" vendor for KUnit and friends
of: Add a KUnit test for overlays and test managed APIs
platform: Add test managed platform_device/driver APIs
clk: Add test managed clk provider/consumer APIs
clk: Add KUnit tests for clk fixed rate basic type
clk: Add KUnit tests for clks registered with struct clk_parent_data
Documentation/dev-tools/kunit/api/clk.rst | 10 + Documentation/dev-tools/kunit/api/index.rst | 21 + Documentation/dev-tools/kunit/api/of.rst | 13 + .../dev-tools/kunit/api/platformdevice.rst | 10 + .../devicetree/bindings/vendor-prefixes.yaml | 2 + drivers/base/dd.c | 1 + drivers/clk/.kunitconfig | 2 + drivers/clk/Kconfig | 11 + drivers/clk/Makefile | 11 +- drivers/clk/clk-fixed-rate_test.c | 380 +++++++++++++++ drivers/clk/clk-fixed-rate_test.h | 8 + drivers/clk/clk_kunit_helpers.c | 207 ++++++++ drivers/clk/clk_parent_data_test.h | 10 + drivers/clk/clk_test.c | 453 +++++++++++++++++- drivers/clk/kunit_clk_fixed_rate_test.dtso | 19 + drivers/clk/kunit_clk_parent_data_test.dtso | 28 ++ drivers/of/.kunitconfig | 1 + drivers/of/Kconfig | 10 + drivers/of/Makefile | 3 + drivers/of/kunit_overlay_test.dtso | 9 + drivers/of/of_kunit_helpers.c | 77 +++ drivers/of/overlay_test.c | 115 +++++ drivers/of/platform.c | 9 +- include/kunit/clk.h | 28 ++ include/kunit/of.h | 115 +++++ include/kunit/platform_device.h | 20 + lib/kunit/Makefile | 4 +- lib/kunit/platform-test.c | 224 +++++++++ lib/kunit/platform.c | 302 ++++++++++++ 29 files changed, 2097 insertions(+), 6 deletions(-) create mode 100644 Documentation/dev-tools/kunit/api/clk.rst create mode 100644 Documentation/dev-tools/kunit/api/of.rst create mode 100644 Documentation/dev-tools/kunit/api/platformdevice.rst create mode 100644 drivers/clk/clk-fixed-rate_test.c create mode 100644 drivers/clk/clk-fixed-rate_test.h create mode 100644 drivers/clk/clk_kunit_helpers.c create mode 100644 drivers/clk/clk_parent_data_test.h create mode 100644 drivers/clk/kunit_clk_fixed_rate_test.dtso create mode 100644 drivers/clk/kunit_clk_parent_data_test.dtso create mode 100644 drivers/of/kunit_overlay_test.dtso create mode 100644 drivers/of/of_kunit_helpers.c create mode 100644 drivers/of/overlay_test.c create mode 100644 include/kunit/clk.h create mode 100644 include/kunit/of.h create mode 100644 include/kunit/platform_device.h create mode 100644 lib/kunit/platform-test.c create mode 100644 lib/kunit/platform.c
base-commit: 1613e604df0cd359cf2a7fbd9be7a0bcfacfabd0
Signature · 2 lines
https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git
Stephen Boyd
maintainerPATCH v8 1/8 of/platform: Allow overlays to create platform devices from the root node
We'd like to apply overlays to the root node in KUnit so we can test platform devices created as children of the root node.
On some architectures (powerpc), the root node isn't marked with OF_POPULATED_BUS. If an overlay tries to modify the root node on these platforms it will fail, while on other platforms, such as ARM, it will succeed. This is because the root node is marked with OF_POPULATED_BUS by of_platform_default_populate_init() calling of_platform_default_populate() with NULL as the first argument.
Loosen the requirement here so that platform devices can be created for nodes created as children of the root node via DT overlays even if the platform bus wasn't populated for the root node.
--- drivers/of/platform.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/of/platform.c +6 -3
@@ -732,11 +732,14 @@ static int of_platform_notify(struct notifier_block *nb,struct of_reconfig_data *rd = arg;struct platform_device *pdev_parent, *pdev;bool children_left; +struct device_node *parent;switch (of_reconfig_get_state_change (action, rd)) {case OF_RECONFIG_CHANGE_ADD : -/* verify that the parent is a bus */ -if (!of_node_check_flag (rd->dn->parent,OF_POPULATED_BUS )) + parent = rd->dn->parent; +/* verify that the parent is a bus (or the root node) */ +if (!of_node_is_root (parent) && + !of_node_check_flag (parent,OF_POPULATED_BUS ))return NOTIFY_OK ;/* not for us */ /* already populated? (driver using of_populate manually) */
@@ -749,7 +752,7 @@ static int of_platform_notify(struct notifier_block *nb,*/ rd->dn->fwnode.flags &= ~FWNODE_FLAG_NOT_DEVICE ;/* pdev_parent may be NULL when no bus platform device */ - pdev_parent =of_find_device_by_node (rd->dn->parent); + pdev_parent =of_find_device_by_node (parent); pdev =of_platform_device_create (rd->dn,NULL , pdev_parent ? &pdev_parent->dev :NULL );platform_device_put (pdev_parent);
Signature · 2 lines
https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git
Re: [PATCH v8 1/8] of/platform: Allow overlays to create platform devices from the root node
Quoting Stephen Boyd (2024-07-18 14:05:00)
Quoted 14 lines
We'd like to apply overlays to the root node in KUnit so we can test platform devices created as children of the root node.
On some architectures (powerpc), the root node isn't marked with
OF_POPULATED_BUS. If an overlay tries to modify the root node on these platforms it will fail, while on other platforms, such as ARM, it will succeed. This is because the root node is marked withOF_POPULATED_BUSbyof_platform_default_populate_init()callingof_platform_default_populate()with NULL as the first argument.Loosen the requirement here so that platform devices can be created for nodes created as children of the root node via DT overlays even if the platform bus wasn't populated for the root node.
Quoted 6 lines
Reviewed-by Rob Herring (Arm) <[email protected]>Cc Saravana Kannan <[email protected]>Signed-off-by Geert Uytterhoeven <[email protected]>[[email protected]: Folded in condition fix]Signed-off-by Stephen Boyd <[email protected]>---
Applied to clk-next
Stephen Boyd
maintainerPATCH v8 2/8 of: Add test managed wrappers for of_overlay_apply()/of_node_put()
In reply to Stephen BoydAdd test managed wrappers for of_overlay_apply() that automatically removes the overlay when the test is finished. This API is intended for use by KUnit tests that test code which relies on 'struct device_node's and of_*() APIs.
KUnit tests will call of_overlay_apply_kunit() to load an overlay that's been built into the kernel image. When the test is complete, the overlay will be removed.
This has a few benefits:
1) It keeps the tests hermetic because the overlay is removed when the test is complete. Tests won't even be aware that an overlay was loaded in another test.
2) The overlay code can live right next to the unit test that loads it. The overlay and the unit test can be compiled into one kernel module if desired.
3) We can test different device tree configurations by loading different overlays. The overlays can be written for a specific test, and there can be many of them loaded per-test without needing to jam all possible combinations into one DTB.
4) It also allows KUnit to test device tree dependent code on any architecture, not just UML. This allows KUnit tests to test architecture specific device tree code.
There are some potential pitfalls though. Test authors need to be careful to not overwrite properties in the live tree. The easiest way to do this is to add and remove nodes with a 'kunit-' prefix, almost guaranteeing that the same node won't be present in the tree loaded at boot.
--- Documentation/dev-tools/kunit/api/index.rst | 11 ++ Documentation/dev-tools/kunit/api/of.rst | 13 +++ drivers/of/Makefile | 1 + drivers/of/of_kunit_helpers.c | 77 +++++++++++++ include/kunit/of.h | 115 ++++++++++++++++++++ 5 files changed, 217 insertions(+) create mode 100644 Documentation/dev-tools/kunit/api/of.rst create mode 100644 drivers/of/of_kunit_helpers.c create mode 100644 include/kunit/of.h
Documentation/dev-tools/kunit/api/index.rst +11 -0
@@ -9,11 +9,15 @@ API Reference test resource functionredirection + of This page documents the KUnit kernel testing API. It is divided into the following sections: +Core KUnit API +============== + Documentation/dev-tools/kunit/api/test.rst - Documents all of the standard testing API
@@ -25,3 +29,10 @@ Documentation/dev-tools/kunit/api/resource.rst Documentation/dev-tools/kunit/api/functionredirection.rst - Documents the KUnit Function Redirection API + +Driver KUnit API +================ + +Documentation/dev-tools/kunit/api/of.rst + + - Documents the KUnit device tree (OF) API
Documentation/dev-tools/kunit/api/of.rst new file +13 -0
@@ -0,0 +1,13 @@ +.. SPDX-License-Identifier: GPL-2.0 + +==================== +Device Tree (OF) API +==================== + +The KUnit device tree API is used to test device tree (of_*) dependent code. + +.. kernel-doc:: include/kunit/of.h + :internal: + +.. kernel-doc:: drivers/of/of_kunit_helpers.c + :export:
drivers/of/Makefile +1 -0
@@ -19,6 +19,7 @@ obj-y += kexec.o endif endif +obj-$(CONFIG_KUNIT) += of_kunit_helpers.o obj-$(CONFIG_OF_KUNIT_TEST) += of_test.o obj-$(CONFIG_OF_UNITTEST) += unittest-data/
drivers/of/of_kunit_helpers.c new file +77 -0
77 lines not on this page · raw message
include/kunit/of.h new file +115 -0
115 lines not on this page · raw message
Signature · 2 lines
https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git
Re: [PATCH v8 2/8] of: Add test managed wrappers for of_overlay_apply()/of_node_put()
Quoting Stephen Boyd (2024-07-18 14:05:01)
Quoted 34 lines
Add test managed wrappers for
of_overlay_apply()that automatically removes the overlay when the test is finished. This API is intended for use by KUnit tests that test code which relies on 'struct device_node's and of_*() APIs.KUnit tests will call
of_overlay_apply_kunit()to load an overlay that's been built into the kernel image. When the test is complete, the overlay will be removed.This has a few benefits:
1) It keeps the tests hermetic because the overlay is removed when the test is complete. Tests won't even be aware that an overlay was loaded in another test.
2) The overlay code can live right next to the unit test that loads it. The overlay and the unit test can be compiled into one kernel module if desired.
3) We can test different device tree configurations by loading different overlays. The overlays can be written for a specific test, and there can be many of them loaded per-test without needing to jam all possible combinations into one DTB.
4) It also allows KUnit to test device tree dependent code on any architecture, not just UML. This allows KUnit tests to test architecture specific device tree code.
There are some potential pitfalls though. Test authors need to be careful to not overwrite properties in the live tree. The easiest way to do this is to add and remove nodes with a 'kunit-' prefix, almost guaranteeing that the same node won't be present in the tree loaded at boot.
Quoted 7 lines
Suggested-by Rob Herring <[email protected]>Cc Rob Herring <[email protected]>Cc Saravana Kannan <[email protected]>Reviewed-by Rob Herring (Arm) <[email protected]>Reviewed-by David Gow <[email protected]>Signed-off-by Stephen Boyd <[email protected]>---
Applied to clk-next
Stephen Boyd
maintainerPATCH v8 3/8 dt-bindings: vendor-prefixes: Add "test" vendor for KUnit and friends
In reply to Stephen BoydAdd the vendor prefix "test" to reserve a vendor prefix for bindings that are purely for testing device tree code. This allows test code to write bindings that can be checked by the schema validator.
--- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/vendor-prefixes.yaml +2 -0
@@ -1456,6 +1456,8 @@ patternProperties: description: Terasic Inc. "^tesla,.*": description: Tesla, Inc. + "^test,.*": + description: Reserved for use by tests. For example, KUnit. "^tfc,.*": description: Three Five Corp "^thead,.*":
Signature · 2 lines
https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git
Re: [PATCH v8 3/8] dt-bindings: vendor-prefixes: Add "test" vendor for KUnit and friends
Quoting Stephen Boyd (2024-07-18 14:05:02)
Quoted 10 lines
Add the vendor prefix "test" to reserve a vendor prefix for bindings that are purely for testing device tree code. This allows test code to write bindings that can be checked by the schema validator.
Reviewed-by Rob Herring <[email protected]>Reviewed-by David Gow <[email protected]>Cc Krzysztof Kozlowski <[email protected]>Cc Conor Dooley <[email protected]>Signed-off-by Stephen Boyd <[email protected]>---
Applied to clk-next
Stephen Boyd
maintainerPATCH v8 4/8 of: Add a KUnit test for overlays and test managed APIs
In reply to Stephen BoydTest the KUnit test managed overlay APIs. Confirm that platform devices are created and destroyed properly. This provides us confidence that the test managed APIs work correctly and can be relied upon to provide tests with fake platform devices and device nodes via overlays compiled into the kernel image.
--- drivers/of/.kunitconfig | 1 + drivers/of/Kconfig | 10 +++ drivers/of/Makefile | 2 + drivers/of/kunit_overlay_test.dtso | 9 +++ drivers/of/overlay_test.c | 115 +++++++++++++++++++++++++++++ 5 files changed, 137 insertions(+) create mode 100644 drivers/of/kunit_overlay_test.dtso create mode 100644 drivers/of/overlay_test.c
drivers/of/.kunitconfig +1 -0
@@ -1,3 +1,4 @@ CONFIG_KUNIT=y CONFIG_OF=y CONFIG_OF_KUNIT_TEST=y +CONFIG_OF_OVERLAY_KUNIT_TEST=y
drivers/of/Kconfig +10 -0
@@ -107,6 +107,16 @@ config OF_OVERLAY While this option is selected automatically when needed, you can enable it manually to improve device tree unit test coverage. +config OF_OVERLAY_KUNIT_TEST + tristate "Device Tree overlay KUnit tests" if !KUNIT_ALL_TESTS + depends on KUNIT + default KUNIT_ALL_TESTS + select OF_OVERLAY + help + This option builds KUnit unit tests for the device tree overlay code. + + If unsure, say N here, but this option is safe to enable. + config OF_NUMA bool
drivers/of/Makefile +2 -0
@@ -21,5 +21,7 @@ endif obj-$(CONFIG_KUNIT) += of_kunit_helpers.o obj-$(CONFIG_OF_KUNIT_TEST) += of_test.o +obj-$(CONFIG_OF_OVERLAY_KUNIT_TEST) += overlay-test.o +overlay-test-y := overlay_test.o kunit_overlay_test.dtbo.o obj-$(CONFIG_OF_UNITTEST) += unittest-data/
drivers/of/kunit_overlay_test.dtso new file +9 -0
@@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0 +/dts-v1/; +/plugin/; + +&{/} { + kunit-test { + compatible = "test,empty"; + }; +};
drivers/of/overlay_test.c new file +115 -0
115 lines not on this page · raw message
Signature · 2 lines
https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git
Re: [PATCH v8 4/8] of: Add a KUnit test for overlays and test managed APIs
Quoting Stephen Boyd (2024-07-18 14:05:03)
Quoted 14 lines
Test the KUnit test managed overlay APIs. Confirm that platform devices are created and destroyed properly. This provides us confidence that the test managed APIs work correctly and can be relied upon to provide tests with fake platform devices and device nodes via overlays compiled into the kernel image.
Cc Rob Herring <[email protected]>Cc Saravana Kannan <[email protected]>Cc Daniel Latypov <[email protected]>Cc Brendan Higgins <[email protected]>Reviewed-by David Gow <[email protected]>Cc Rae Moar <[email protected]>Reviewed-by Rob Herring (Arm) <[email protected]>Signed-off-by Stephen Boyd <[email protected]>
Quoted 1 line
---
Applied to clk-next
Stephen Boyd
maintainerPATCH v8 5/8 platform: Add test managed platform_device/driver APIs
In reply to Stephen BoydIntroduce KUnit resource wrappers around platform_driver_register(), platform_device_alloc(), and platform_device_add() so that test authors can register platform drivers/devices from their tests and have the drivers/devices automatically be unregistered when the test is done.
This makes test setup code simpler when a platform driver or platform device is needed. Add a few test cases at the same time to make sure the APIs work as intended.
--- Documentation/dev-tools/kunit/api/index.rst | 5 + .../dev-tools/kunit/api/platformdevice.rst | 10 + drivers/base/dd.c | 1 + include/kunit/platform_device.h | 20 ++ lib/kunit/Makefile | 4 +- lib/kunit/platform-test.c | 224 +++++++++++++ lib/kunit/platform.c | 302 ++++++++++++++++++ 7 files changed, 565 insertions(+), 1 deletion(-) create mode 100644 Documentation/dev-tools/kunit/api/platformdevice.rst create mode 100644 include/kunit/platform_device.h create mode 100644 lib/kunit/platform-test.c create mode 100644 lib/kunit/platform.c
Documentation/dev-tools/kunit/api/index.rst +5 -0
@@ -10,6 +10,7 @@ API Reference resource functionredirection of + platformdevice This page documents the KUnit kernel testing API. It is divided into the
@@ -36,3 +37,7 @@ Driver KUnit API Documentation/dev-tools/kunit/api/of.rst - Documents the KUnit device tree (OF) API + +Documentation/dev-tools/kunit/api/platformdevice.rst + + - Documents the KUnit platform device API
Documentation/dev-tools/kunit/api/platformdevice.rst new file +10 -0
@@ -0,0 +1,10 @@ +.. SPDX-License-Identifier: GPL-2.0 + +=================== +Platform Device API +=================== + +The KUnit platform device API is used to test platform devices. + +.. kernel-doc:: lib/kunit/platform.c + :export:
drivers/base/dd.c +1 -0
@@ -393,6 +393,7 @@ bool device_is_bound(struct device *dev) {return dev->p &&klist_node_attached (&dev->p->knode_driver); } +EXPORT_SYMBOL_GPL (device_is_bound);static void driver_bound (struct device *dev) {
include/kunit/platform_device.h new file +20 -0
@@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _KUNIT_PLATFORM_DRIVER_H +#define _KUNIT_PLATFORM_DRIVER_H + +struct kunit ; +struct platform_device ; +struct platform_driver ; + +struct platform_device * +kunit_platform_device_alloc (struct kunit *test,const char *name,int id); +int kunit_platform_device_add (struct kunit *test,struct platform_device *pdev); + +int kunit_platform_device_prepare_wait_for_probe (struct kunit *test, +struct platform_device *pdev, +struct completion *x); + +int kunit_platform_driver_register (struct kunit *test, +struct platform_driver *drv); + +#endif
lib/kunit/Makefile +3 -1
@@ -8,7 +8,8 @@ kunit-objs += test.o \ try-catch.o \ executor.o \ attributes.o \ - device.o + device.o \ + platform.o ifeq ($(CONFIG_KUNIT_DEBUGFS),y) kunit-objs += debugfs.o
@@ -18,6 +19,7 @@ endif obj-y += hooks.o obj-$(CONFIG_KUNIT_TEST) += kunit-test.o +obj-$(CONFIG_KUNIT_TEST) += platform-test.o # string-stream-test compiles built-in only. ifeq ($(CONFIG_KUNIT_TEST),y)
lib/kunit/platform-test.c new file +224 -0
224 lines not on this page · raw message
lib/kunit/platform.c new file +302 -0
302 lines not on this page · raw message
Signature · 2 lines
https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git
Re: [PATCH v8 5/8] platform: Add test managed platform_device/driver APIs
Quoting Stephen Boyd (2024-07-18 14:05:04)
Quoted 9 lines
Introduce KUnit resource wrappers around
platform_driver_register(),platform_device_alloc(), andplatform_device_add()so that test authors can register platformdrivers/devicesfrom their tests and have thedrivers/devicesautomatically be unregistered when the test is done.This makes test setup code simpler when a platform driver or platform device is needed. Add a few test cases at the same time to make sure the APIs work as intended.
Quoted 7 lines
Cc Brendan Higgins <[email protected]>Reviewed-by David Gow <[email protected]>Cc Rae Moar <[email protected]>Reviewed-by Greg Kroah-Hartman <[email protected]>Cc "Rafael J. Wysocki" <[email protected]>Signed-off-by Stephen Boyd <[email protected]>---
Applied to clk-next
Re: [PATCH v8 5/8] platform: Add test managed platform_device/driver APIs
In reply to Stephen BoydQuoted 9 lines · Stephen Boyd
Introduce KUnit resource wrappers around
platform_driver_register(),platform_device_alloc(), andplatform_device_add()so that test authors can register platformdrivers/devicesfrom their tests and have thedrivers/devicesautomatically be unregistered when the test is done.This makes test setup code simpler when a platform driver or platform device is needed. Add a few test cases at the same time to make sure the APIs work as intended.
Quoted 6 lines
Cc Brendan Higgins <[email protected]>Reviewed-by David Gow <[email protected]>Cc Rae Moar <[email protected]>Reviewed-by Greg Kroah-Hartman <[email protected]>Cc "Rafael J. Wysocki" <[email protected]>Signed-off-by Stephen Boyd <[email protected]>
This patch adds another intentional warning traceback seen whenever CONFIG_KUNIT_TEST is enabled.
sysfs: cannot create duplicate filename '/devices/platform/kunit-platform-add-2'
CPU: 0 UID: 0 PID: 421 Comm: kunit_try_catch Tainted: G N 6.11.0-mac-09967-g2ece55614b92 #1
Tainted: [N]=TEST
Stack from 015a9de0:
015a9de0 006168ac 006168ac 0158c000 026e8ea0 00c4a6b8 004bbe32 006168ac
00166cd4 005fa210 0158c000 026e8ea0 ffffffef 00c4a6b8 0067a18c 00166dc0
00c4a6b8 026e8ea0 01a6ac0e 006cb3c8 01a6ac0a 006cb3c8 00000000 00000000
0049b6de 01a6ac0a 00000000 01a6ac0a 00000000 006cb3c8 01a6ac0a 006cb3c8
01a6ac0a 015a9e78 0049b8b4 01a6ac0a 01a6ac00 01a6ac0a 0001bbfa 00321592
01a6ac0a 006cb3c8 00000000 01a6ac00 00000000 0067a18c 0002d21c 00000000
Call Trace: [<004bbe32>] dump_stack+0xc/0x10
[<00166cd4>] sysfs_warn_dup+0x52/0x64
[<00166dc0>] sysfs_create_dir_ns+0x9a/0xac
[<0049b6de>] kobject_add_internal+0xdc/0x238
[<0049b8b4>] kobject_add+0x7a/0x7e
[<0001bbfa>] insert_resource+0x0/0x1a
[<00321592>] device_add+0x104/0x588
[<0002d21c>] list_del_init+0x0/0x2a
[<0001bbfa>] insert_resource+0x0/0x1a
[<00326358>] platform_device_add+0x58/0x180
[<00326378>] platform_device_add+0x78/0x180
[<00273234>] IS_ERR_OR_NULL+0x0/0x1c
[<00270c58>] kunit_platform_device_add+0x14/0x118
[<0002d21c>] list_del_init+0x0/0x2a
[<00270c44>] kunit_platform_device_add+0x0/0x118
[<00273234>] IS_ERR_OR_NULL+0x0/0x1c
[<002733de>] kunit_platform_device_add_twice_fails_test+0x118/0x170
[<00050e44>] ktime_get_ts64+0x0/0xd8
[<00050e44>] ktime_get_ts64+0x0/0xd8
[<004b04d0>] memset+0x0/0x8c
[<0026cc3e>] kunit_try_run_case+0xa0/0x176
[<0002d21c>] list_del_init+0x0/0x2a
[<0002cfaa>] kthread_exit+0x0/0x14
[<0026e3d0>] kunit_generic_run_threadfn_adapter+0x0/0x2a
[<0026e3e6>] kunit_generic_run_threadfn_adapter+0x16/0x2a
[<0002d2d6>] kthread+0x90/0x9a
[<0002d246>] kthread+0x0/0x9a
[<0000252c>] ret_from_kernel_thread+0xc/0x14kobject: kobject_add_internal failed for kunit-platform-add-2 with -EEXIST, don't try to register things with the same name in the same directory.
# kunit_platform_device_add_twice_fails_test: pass:1 fail:0 skip:0 total:1
ok 3 kunit_platform_device_add_twice_fails_test
# kunit_platform_device_add_cleans_up: pass:1 fail:0 skip:0 total:1
ok 4 kunit_platform_device_add_cleans_up
# kunit_platform_device: pass:4 fail:0 skip:0 total:4
I have said several times that my test system can and will not handle intentional warning backtraces. I strongly believe that it is wrong to expect that testbed maintainers have to keep track of intentional backtraces. That means that I now also disabled CONFIG_KUNIT_TEST in my testbed.
Guenter
Stephen Boyd
maintainerPATCH v8 6/8 clk: Add test managed clk provider/consumer APIs
In reply to Stephen BoydUnit tests are more ergonomic and simpler to understand if they don't have to hoist a bunch of code into the test harness init and exit functions. Add some test managed wrappers for the clk APIs so that clk unit tests can write more code in the actual test and less code in the harness.
Only add APIs that are used for now. More wrappers can be added in the future as necessary.
--- Documentation/dev-tools/kunit/api/clk.rst | 10 + Documentation/dev-tools/kunit/api/index.rst | 5 + drivers/clk/Makefile | 5 + drivers/clk/clk_kunit_helpers.c | 207 ++++++++++++++++++++ include/kunit/clk.h | 28 +++ 5 files changed, 255 insertions(+) create mode 100644 Documentation/dev-tools/kunit/api/clk.rst create mode 100644 drivers/clk/clk_kunit_helpers.c create mode 100644 include/kunit/clk.h
Documentation/dev-tools/kunit/api/clk.rst new file +10 -0
@@ -0,0 +1,10 @@ +.. SPDX-License-Identifier: GPL-2.0 + +======== +Clk API +======== + +The KUnit clk API is used to test clk providers and clk consumers. + +.. kernel-doc:: drivers/clk/clk_kunit_helpers.c + :export:
Documentation/dev-tools/kunit/api/index.rst +5 -0
@@ -9,6 +9,7 @@ API Reference test resource functionredirection + clk of platformdevice
@@ -34,6 +35,10 @@ Documentation/dev-tools/kunit/api/functionredirection.rst Driver KUnit API ================ +Documentation/dev-tools/kunit/api/clk.rst + + - Documents the KUnit clk API + Documentation/dev-tools/kunit/api/of.rst - Documents the KUnit device tree (OF) API
drivers/clk/Makefile +5 -0
@@ -18,6 +18,11 @@ ifeq ($(CONFIG_OF), y) obj-$(CONFIG_COMMON_CLK) += clk-conf.o endif +# KUnit specific helpers +ifeq ($(CONFIG_COMMON_CLK), y) +obj-$(CONFIG_KUNIT) += clk_kunit_helpers.o +endif + # hardware specific clock types # please keep this section sorted lexicographically by file path name obj-$(CONFIG_COMMON_CLK_APPLE_NCO) += clk-apple-nco.o
drivers/clk/clk_kunit_helpers.c new file +207 -0
207 lines not on this page · raw message
include/kunit/clk.h new file +28 -0
@@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _CLK_KUNIT_H +#define _CLK_KUNIT_H + +struct clk ; +struct clk_hw ; +struct device ; +struct device_node ; +struct kunit ; + +struct clk * +clk_get_kunit (struct kunit *test,struct device *dev,const char *con_id); +struct clk * +of_clk_get_kunit (struct kunit *test,struct device_node *np,int index); + +struct clk * +clk_hw_get_clk_kunit (struct kunit *test,struct clk_hw *hw,const char *con_id); +struct clk * +clk_hw_get_clk_prepared_enabled_kunit (struct kunit *test,struct clk_hw *hw, +const char *con_id); + +int clk_prepare_enable_kunit (struct kunit *test,struct clk *clk); + +int clk_hw_register_kunit (struct kunit *test,struct device *dev,struct clk_hw *hw); +int of_clk_hw_register_kunit (struct kunit *test,struct device_node *node, +struct clk_hw *hw); + +#endif
Signature · 2 lines
https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git
Re: [PATCH v8 6/8] clk: Add test managed clk provider/consumer APIs
Quoting Stephen Boyd (2024-07-18 14:05:05)
Quoted 6 lines
Unit tests are more ergonomic and simpler to understand if they don't have to hoist a bunch of code into the test harness init and exit functions. Add some test managed wrappers for the clk APIs so that clk unit tests can write more code in the actual test and less code in the harness.
Quoted 8 lines
Only add APIs that are used for now. More wrappers can be added in the future as necessary.
Cc Brendan Higgins <[email protected]>Cc David Gow <[email protected]>Cc Rae Moar <[email protected]>Signed-off-by Stephen Boyd <[email protected]>---
Applied to clk-next
Stephen Boyd
maintainerPATCH v8 7/8 clk: Add KUnit tests for clk fixed rate basic type
In reply to Stephen BoydTest that the fixed rate basic type clk works as intended.
--- drivers/clk/.kunitconfig | 2 + drivers/clk/Kconfig | 9 + drivers/clk/Makefile | 2 + drivers/clk/clk-fixed-rate_test.c | 380 +++++++++++++++++++++ drivers/clk/clk-fixed-rate_test.h | 8 + drivers/clk/kunit_clk_fixed_rate_test.dtso | 19 ++ 6 files changed, 420 insertions(+) create mode 100644 drivers/clk/clk-fixed-rate_test.c create mode 100644 drivers/clk/clk-fixed-rate_test.h create mode 100644 drivers/clk/kunit_clk_fixed_rate_test.dtso
drivers/clk/.kunitconfig +2 -0
@@ -1,6 +1,8 @@ CONFIG_KUNIT=y +CONFIG_OF=y CONFIG_COMMON_CLK=y CONFIG_CLK_KUNIT_TEST=y +CONFIG_CLK_FIXED_RATE_KUNIT_TEST=y CONFIG_CLK_GATE_KUNIT_TEST=y CONFIG_CLK_FD_KUNIT_TEST=y CONFIG_UML_PCI_OVER_VIRTIO=n
drivers/clk/Kconfig +9 -0
@@ -511,6 +511,15 @@ config CLK_KUNIT_TEST help Kunit tests for the common clock framework. +config CLK_FIXED_RATE_KUNIT_TEST + tristate "Basic fixed rate clk type KUnit test" if !KUNIT_ALL_TESTS + depends on KUNIT + default KUNIT_ALL_TESTS + select OF_OVERLAY if OF + select DTC + help + KUnit tests for the basic fixed rate clk type. + config CLK_GATE_KUNIT_TEST tristate "Basic gate type Kunit test" if !KUNIT_ALL_TESTS depends on KUNIT
drivers/clk/Makefile +2 -0
@@ -6,6 +6,8 @@ obj-$(CONFIG_CLK_KUNIT_TEST) += clk_test.o obj-$(CONFIG_COMMON_CLK) += clk-divider.o obj-$(CONFIG_COMMON_CLK) += clk-fixed-factor.o obj-$(CONFIG_COMMON_CLK) += clk-fixed-rate.o +obj-$(CONFIG_CLK_FIXED_RATE_KUNIT_TEST) += clk-fixed-rate-test.o +clk-fixed-rate-test-y := clk-fixed-rate_test.o kunit_clk_fixed_rate_test.dtbo.o obj-$(CONFIG_COMMON_CLK) += clk-gate.o obj-$(CONFIG_CLK_GATE_KUNIT_TEST) += clk-gate_test.o obj-$(CONFIG_COMMON_CLK) += clk-multiplier.o
drivers/clk/clk-fixed-rate_test.c new file +380 -0
380 lines not on this page · raw message
drivers/clk/clk-fixed-rate_test.h new file +8 -0
@@ -0,0 +1,8 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _CLK_FIXED_RATE_TEST_H +#define _CLK_FIXED_RATE_TEST_H + +#define TEST_FIXED_FREQUENCY 50000000 +#define TEST_FIXED_ACCURACY 300 + +#endif
drivers/clk/kunit_clk_fixed_rate_test.dtso new file +19 -0
@@ -0,0 +1,19 @@ +// SPDX-License-Identifier: GPL-2.0 +/dts-v1/; +/plugin/; + +#include "clk-fixed-rate_test.h" + +&{/} { + fixed_50MHz: kunit-clock { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <TEST_FIXED_FREQUENCY>; + clock-accuracy = <TEST_FIXED_ACCURACY>; + }; + + kunit-clock-consumer { + compatible = "test,single-clk-consumer"; + clocks = <&fixed_50MHz>; + }; +};
Signature · 2 lines
https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git
Re: [PATCH v8 7/8] clk: Add KUnit tests for clk fixed rate basic type
Quoting Stephen Boyd (2024-07-18 14:05:06)
Quoted 7 lines
Test that the fixed rate basic type clk works as intended.
Cc Brendan Higgins <[email protected]>Cc David Gow <[email protected]>Cc Rae Moar <[email protected]>Signed-off-by Stephen Boyd <[email protected]>---
Applied to clk-next
Stephen Boyd
maintainerPATCH v8 8/8 clk: Add KUnit tests for clks registered with struct clk_parent_data
In reply to Stephen BoydTest that clks registered with 'struct clk_parent_data' work as intended and can find their parents.
--- drivers/clk/Kconfig | 2 + drivers/clk/Makefile | 4 +- drivers/clk/clk_parent_data_test.h | 10 + drivers/clk/clk_test.c | 453 +++++++++++++++++++- drivers/clk/kunit_clk_parent_data_test.dtso | 28 ++ 5 files changed, 495 insertions(+), 2 deletions(-) create mode 100644 drivers/clk/clk_parent_data_test.h create mode 100644 drivers/clk/kunit_clk_parent_data_test.dtso
drivers/clk/Kconfig +2 -0
@@ -508,6 +508,8 @@ config CLK_KUNIT_TEST tristate "Basic Clock Framework Kunit Tests" if !KUNIT_ALL_TESTS depends on KUNIT default KUNIT_ALL_TESTS + select OF_OVERLAY if OF + select DTC help Kunit tests for the common clock framework.
drivers/clk/Makefile +3 -1
@@ -2,7 +2,9 @@ # common clock types obj-$(CONFIG_HAVE_CLK) += clk-devres.o clk-bulk.o clkdev.o obj-$(CONFIG_COMMON_CLK) += clk.o -obj-$(CONFIG_CLK_KUNIT_TEST) += clk_test.o +obj-$(CONFIG_CLK_KUNIT_TEST) += clk-test.o +clk-test-y := clk_test.o \ + kunit_clk_parent_data_test.dtbo.o obj-$(CONFIG_COMMON_CLK) += clk-divider.o obj-$(CONFIG_COMMON_CLK) += clk-fixed-factor.o obj-$(CONFIG_COMMON_CLK) += clk-fixed-rate.o
drivers/clk/clk_parent_data_test.h new file +10 -0
@@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _CLK_PARENT_DATA_TEST_H +#define _CLK_PARENT_DATA_TEST_H + +#define CLK_PARENT_DATA_1MHZ_NAME "1mhz_fixed_legacy" +#define CLK_PARENT_DATA_PARENT1 "parent_fwname" +#define CLK_PARENT_DATA_PARENT2 "50" +#define CLK_PARENT_DATA_50MHZ_NAME "50_clk" + +#endif
drivers/clk/clk_test.c +452 -1
477 lines not on this page · raw message
drivers/clk/kunit_clk_parent_data_test.dtso new file +28 -0
@@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-2.0 +/dts-v1/; +/plugin/; + +#include "clk_parent_data_test.h" + +&{/} { + fixed_50: kunit-clock-50MHz { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <50000000>; + clock-output-names = CLK_PARENT_DATA_50MHZ_NAME; + }; + + fixed_parent: kunit-clock-1MHz { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <1000000>; + clock-output-names = CLK_PARENT_DATA_1MHZ_NAME; + }; + + kunit-clock-controller { + compatible = "test,clk-parent-data"; + clocks = <&fixed_parent>, <&fixed_50>; + clock-names = CLK_PARENT_DATA_PARENT1, CLK_PARENT_DATA_PARENT2; + #clock-cells = <1>; + }; +};
Signature · 2 lines
https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git
Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data
Quoting Stephen Boyd (2024-07-18 14:05:07)
Quoted 9 lines
Test that clks registered with 'struct
clk_parent_data' work as intended and can find their parents.Cc Christian Marangi <[email protected]>Cc Brendan Higgins <[email protected]>Reviewed-by David Gow <[email protected]>Cc Rae Moar <[email protected]>Signed-off-by Stephen Boyd <[email protected]>---
Applied to clk-next
Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data
In reply to Stephen BoydHi Stephen,
Quoted 3 lines · Stephen Boyd
Test that clks registered with 'struct
clk_parent_data' work as intended and can find their parents.
When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.
Any idea what might cause the problem ?
Thanks,
Guenter
---
[ 20.464809] KTAP version 1
[ 20.464865] # Subtest: clk_register_clk_parent_data_of
[ 20.464936] # module: clk_test
[ 20.464979] 1..1
[ 20.465098] KTAP version 1
[ 20.465208] # Subtest: clk_register_clk_parent_data_of_test
[ 20.468964] OF: overlay: find target, node: /fragment@0, path '/' not found
[ 20.469558] OF: overlay: init_overlay_changeset() failed, ret = -22
[ 20.470177] # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760
[ 20.470177] Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but
[ 20.470177] ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea)
[ 20.471793] not ok 1 clk_parent_data_of_index_test
[ 20.474095] OF: overlay: find target, node: /fragment@0, path '/' not found
[ 20.474373] OF: overlay: init_overlay_changeset() failed, ret = -22
[ 20.474737] # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760
[ 20.474737] Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but
[ 20.474737] ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea)
[ 20.477677] not ok 2 clk_parent_data_of_fwname_test
[ 20.479773] OF: overlay: find target, node: /fragment@0, path '/' not found
[ 20.479941] OF: overlay: init_overlay_changeset() failed, ret = -22
[ 20.480160] # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760
[ 20.480160] Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but
[ 20.480160] ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea)
[ 20.481513] not ok 3 clk_parent_data_of_name_test
[ 20.483711] OF: overlay: find target, node: /fragment@0, path '/' not found
[ 20.483878] OF: overlay: init_overlay_changeset() failed, ret = -22
[ 20.484100] # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760
[ 20.484100] Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but
[ 20.484100] ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea)
[ 20.485444] not ok 4 clk_parent_data_of_fwname_name_test
[ 20.487432] OF: overlay: find target, node: /fragment@0, path '/' not found
[ 20.487600] OF: overlay: init_overlay_changeset() failed, ret = -22
[ 20.487841] # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760
[ 20.487841] Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but
[ 20.487841] ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea)
[ 20.489207] not ok 5 clk_parent_data_of_index_name_priority_test
[ 20.490998] OF: overlay: find target, node: /fragment@0, path '/' not found
[ 20.491504] OF: overlay: init_overlay_changeset() failed, ret = -22
[ 20.491725] # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760
[ 20.491725] Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but
[ 20.491725] ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea)
[ 20.493053] not ok 6 clk_parent_data_of_index_fwname_name_priority_test
[ 20.493583] # clk_register_clk_parent_data_of_test: pass:0 fail:6 skip:0 total:6
[ 20.493701] not ok 1 clk_register_clk_parent_data_of_test
[ 20.493822] # clk_register_clk_parent_data_of: pass:0 fail:1 skip:0 total:1
[ 20.493920] # Totals: pass:0 fail:6 skip:0 total:6
[ 20.494032] not ok 49 clk_register_clk_parent_data_ofRe: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data
Quoted 7 lines · Guenter Roeck
Hi Stephen,
Quoted 3 lines · Stephen Boyd
Test that clks registered with 'struct
clk_parent_data' work as intended and can find their parents.
Quoted 6 lines
When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.
Any idea what might cause the problem ?
I noticed that the new overlay tests fail as well, also with "path '/' not found".
[Maybe] answering my own question: I think the problem may be that there is no devicetree file and thus no devicetree root when booting through efi (in other words, of_root is NULL). Would it make sense to skip the tests in that case ?
Thanks,
Guenter
Quoted 51 lines
Thanks,
Guenter---
[ 20.464809] KTAP version 1 [ 20.464865] # Subtest: clk_register_clk_parent_data_of [ 20.464936] # module: clk_test [ 20.464979] 1..1 [ 20.465098] KTAP version 1 [ 20.465208] # Subtest: clk_register_clk_parent_data_of_test [ 20.468964] OF: overlay: find target, node: /fragment@0, path '/' not found [ 20.469558] OF: overlay: init_overlay_changeset() failed, ret = -22 [ 20.470177] # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760 [ 20.470177] Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but [ 20.470177] ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea) [ 20.471793] not ok 1 clk_parent_data_of_index_test [ 20.474095] OF: overlay: find target, node: /fragment@0, path '/' not found [ 20.474373] OF: overlay: init_overlay_changeset() failed, ret = -22 [ 20.474737] # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760 [ 20.474737] Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but [ 20.474737] ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea) [ 20.477677] not ok 2 clk_parent_data_of_fwname_test [ 20.479773] OF: overlay: find target, node: /fragment@0, path '/' not found [ 20.479941] OF: overlay: init_overlay_changeset() failed, ret = -22 [ 20.480160] # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760 [ 20.480160] Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but [ 20.480160] ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea) [ 20.481513] not ok 3 clk_parent_data_of_name_test [ 20.483711] OF: overlay: find target, node: /fragment@0, path '/' not found [ 20.483878] OF: overlay: init_overlay_changeset() failed, ret = -22 [ 20.484100] # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760 [ 20.484100] Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but [ 20.484100] ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea) [ 20.485444] not ok 4 clk_parent_data_of_fwname_name_test [ 20.487432] OF: overlay: find target, node: /fragment@0, path '/' not found [ 20.487600] OF: overlay: init_overlay_changeset() failed, ret = -22 [ 20.487841] # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760 [ 20.487841] Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but [ 20.487841] ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea) [ 20.489207] not ok 5 clk_parent_data_of_index_name_priority_test [ 20.490998] OF: overlay: find target, node: /fragment@0, path '/' not found [ 20.491504] OF: overlay: init_overlay_changeset() failed, ret = -22 [ 20.491725] # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760 [ 20.491725] Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but [ 20.491725] ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea) [ 20.493053] not ok 6 clk_parent_data_of_index_fwname_name_priority_test [ 20.493583] # clk_register_clk_parent_data_of_test: pass:0 fail:6 skip:0 total:6 [ 20.493701] not ok 1 clk_register_clk_parent_data_of_test [ 20.493822] # clk_register_clk_parent_data_of: pass:0 fail:1 skip:0 total:1 [ 20.493920] # Totals: pass:0 fail:6 skip:0 total:6 [ 20.494032] not ok 49 clk_register_clk_parent_data_of
Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data
Copying devicetree maintainers.
Quoted 14 lines · Guenter Roeck
Quoted 7 lines · Guenter Roeck
Hi Stephen,
Quoted 3 lines · Stephen Boyd
Test that clks registered with 'struct
clk_parent_data' work as intended and can find their parents.Quoted 6 lines
When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.
Any idea what might cause the problem ?
Quoted 8 lines
I noticed that the new overlay tests fail as well, also with "path '/' not found".
[Maybe] answering my own question: I think the problem may be that there is no devicetree file and thus no devicetree root when booting through efi (in other words,
of_rootis NULL). Would it make sense to skip the tests in that case ?
The problem is that of_root is not initialized in arm64 boots if ACPI is enabled.
From arch/arm64/kernel/setup.c:setup_arch():
if (acpi_disabled) unflatten_device_tree(); // initializes of_root
ACPI is enabled if the system boots from EFI. This also affects CONFIG_OF_KUNIT_TEST, which explicitly checks if of_root exists and fails the test if it doesn't.
I think those tests need to add a check for this condition, or affected machines won't be able to run those unit tests. The obvious solution would be to check if of_root is set, but then the associated test case in CONFIG_OF_KUNIT_TEST would not make sense.
Any suggestions ?
Thanks,
Guenter
Shuah Khan
maintainerRe: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data
Quoted 38 lines · Guenter Roeck
Copying devicetree maintainers.
Quoted 14 lines · Guenter Roeck
Quoted 7 lines · Guenter Roeck
Hi Stephen,
Quoted 3 lines · Stephen Boyd
Test that clks registered with 'struct
clk_parent_data' work as intended and can find their parents.Quoted 6 lines
When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.
Any idea what might cause the problem ?
Quoted 8 lines
I noticed that the new overlay tests fail as well, also with "path '/' not found".
[Maybe] answering my own question: I think the problem may be that there is no devicetree file and thus no devicetree root when booting through efi (in other words,
of_rootis NULL). Would it make sense to skip the tests in that case ?The problem is that
of_rootis not initialized in arm64 boots if ACPI is enabled.From arch/arm64/kernel/setup.c:setup_arch():
if (acpi_disabled) unflatten_device_tree(); // initializes of_rootACPI is enabled if the system boots from EFI. This also affects
CONFIG_OF_KUNIT_TEST, which explicitly checks ifof_rootexists and fails the test if it doesn't.
Quoted 7 lines
I think those tests need to add a check for this condition, or affected machines won't be able to run those unit tests. The obvious solution would be to check if
of_rootis set, but then the associated test case inCONFIG_OF_KUNIT_TESTwould not make sense.Any suggestions ?
Would it work if these tests check if acpi_disabled and skip if it isn't disabled? It might be low overhead condition to check from these tests.
acpi_disabled is exported:
arch/arm64/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/loongarch/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/riscv/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/x86/kernel/acpi/boot.c:EXPORT_SYMBOL(acpi_disabled);
thanks,
-- Shuah
Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data
Quoted 50 lines · Shuah Khan
Quoted 38 lines · Guenter Roeck
Copying devicetree maintainers.
Quoted 14 lines · Guenter Roeck
Quoted 7 lines · Guenter Roeck
Hi Stephen,
Quoted 3 lines · Stephen Boyd
Test that clks registered with 'struct
clk_parent_data' work as intended and can find their parents.Quoted 6 lines
When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.
Any idea what might cause the problem ?
Quoted 8 lines
I noticed that the new overlay tests fail as well, also with "path '/' not found".
[Maybe] answering my own question: I think the problem may be that there is no devicetree file and thus no devicetree root when booting through efi (in other words,
of_rootis NULL). Would it make sense to skip the tests in that case ?The problem is that
of_rootis not initialized in arm64 boots if ACPI is enabled.From arch/arm64/kernel/setup.c:setup_arch():
if (
acpi_disabled)
unflatten_device_tree(); // initializesof_rootACPI is enabled if the system boots from EFI. This also affects
CONFIG_OF_KUNIT_TEST, which explicitly checks ifof_rootexists and fails the test if it doesn't.Quoted 7 lines
I think those tests need to add a check for this condition, or affected machines won't be able to run those unit tests. The obvious solution would be to check if
of_rootis set, but then the associated test case inCONFIG_OF_KUNIT_TESTwould not make sense.Any suggestions ?
Would it work if these tests check if
acpi_disabledand skip if it isn't disabled? It might be low overhead condition to check from these tests.
Quoted 7 lines
acpi_disabledis exported:arch/arm64/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/loongarch/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/riscv/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/x86/kernel/acpi/boot.c:EXPORT_SYMBOL(acpi_disabled);
I don't think that would work. Looking through the use of acpi_init, I don't think that of_root is always NULL when acpi_init is false; that just happens to be the case on arm64 when booting through efi. However, even arm64 has the following code.
if (acpi_disabled)
psci_dt_init();
else
psci_acpi_init();While psci_dt_init() doesn't set of_root, it does try to do a devicetree match. So there must be some other condition where acpi_disabled is set but of_root is set anyway. I just have not found that code path.
Guenter
Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data
Quoted 64 lines · Guenter Roeck
Quoted 50 lines · Shuah Khan
Quoted 38 lines · Guenter Roeck
Copying devicetree maintainers.
Quoted 14 lines · Guenter Roeck
Quoted 7 lines · Guenter Roeck
Hi Stephen,
Quoted 3 lines · Stephen Boyd
Test that clks registered with 'struct
clk_parent_data' work as intended and can find their parents.Quoted 6 lines
When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.
Any idea what might cause the problem ?
Quoted 8 lines
I noticed that the new overlay tests fail as well, also with "path '/' not found".
[Maybe] answering my own question: I think the problem may be that there is no devicetree file and thus no devicetree root when booting through efi (in other words,
of_rootis NULL). Would it make sense to skip the tests in that case ?The problem is that
of_rootis not initialized in arm64 boots if ACPI is enabled.From arch/arm64/kernel/setup.c:setup_arch():
if (
acpi_disabled)
unflatten_device_tree(); // initializesof_rootACPI is enabled if the system boots from EFI. This also affects
CONFIG_OF_KUNIT_TEST, which explicitly checks ifof_rootexists and fails the test if it doesn't.Quoted 7 lines
I think those tests need to add a check for this condition, or affected machines won't be able to run those unit tests. The obvious solution would be to check if
of_rootis set, but then the associated test case inCONFIG_OF_KUNIT_TESTwould not make sense.Any suggestions ?
Would it work if these tests check if
acpi_disabledand skip if it isn't disabled? It might be low overhead condition to check from these tests.Quoted 7 lines
acpi_disabledis exported:arch/arm64/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/loongarch/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/riscv/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/x86/kernel/acpi/boot.c:EXPORT_SYMBOL(acpi_disabled);
I don't think that would work. Looking through the use of
acpi_init, I don't think thatof_rootis always NULL whenacpi_initis false; that just happens to be the case on arm64 when booting through efi. However, even arm64 has the following code.
Quoted 9 lines
if (
acpi_disabled)
psci_dt_init();
else
psci_acpi_init();While
psci_dt_init()doesn't setof_root, it does try to do a devicetree match. So there must be some other condition whereacpi_disabledis set butof_rootis set anyway. I just have not found that code path.
I ended up disabling all affected unit tests for arm64. I'll do the same for other architectures if I encounter the problem there as well.
Unfortunately that includes all clock unit tests because the tests requiring devicetree support can not be enabled/disabled separately, but that can't be helped and is still better than "mandatory" failures.
Guenter
Shuah Khan
maintainerRe: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data
Quoted 75 lines · Guenter Roeck
Quoted 64 lines · Guenter Roeck
Quoted 50 lines · Shuah Khan
Quoted 38 lines · Guenter Roeck
Copying devicetree maintainers.
Quoted 14 lines · Guenter Roeck
Quoted 7 lines · Guenter Roeck
Hi Stephen,
Quoted 3 lines · Stephen Boyd
Test that clks registered with 'struct
clk_parent_data' work as intended and can find their parents.Quoted 6 lines
When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.
Any idea what might cause the problem ?
Quoted 8 lines
I noticed that the new overlay tests fail as well, also with "path '/' not found".
[Maybe] answering my own question: I think the problem may be that there is no devicetree file and thus no devicetree root when booting through efi (in other words,
of_rootis NULL). Would it make sense to skip the tests in that case ?The problem is that
of_rootis not initialized in arm64 boots if ACPI is enabled.From arch/arm64/kernel/setup.c:setup_arch():
if (
acpi_disabled)
unflatten_device_tree(); // initializesof_rootACPI is enabled if the system boots from EFI. This also affects
CONFIG_OF_KUNIT_TEST, which explicitly checks ifof_rootexists and fails the test if it doesn't.Quoted 7 lines
I think those tests need to add a check for this condition, or affected machines won't be able to run those unit tests. The obvious solution would be to check if
of_rootis set, but then the associated test case inCONFIG_OF_KUNIT_TESTwould not make sense.Any suggestions ?
Would it work if these tests check if
acpi_disabledand skip if it isn't disabled? It might be low overhead condition to check from these tests.Quoted 7 lines
acpi_disabledis exported:arch/arm64/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/loongarch/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/riscv/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/x86/kernel/acpi/boot.c:EXPORT_SYMBOL(acpi_disabled);
I don't think that would work. Looking through the use of
acpi_init, I don't think thatof_rootis always NULL whenacpi_initis false; that just happens to be the case on arm64 when booting through efi. However, even arm64 has the following code.Quoted 9 lines
if (
acpi_disabled)
psci_dt_init();
else
psci_acpi_init();While
psci_dt_init()doesn't setof_root, it does try to do a devicetree match. So there must be some other condition whereacpi_disabledis set butof_rootis set anyway. I just have not found that code path.
Quoted 7 lines
I ended up disabling all affected unit tests for arm64. I'll do the same for other architectures if I encounter the problem there as well.
Unfortunately that includes all clock unit tests because the tests requiring devicetree support can not be enabled/disabled separately, but that can't be helped and is still better than "mandatory" failures.
I am hoping Stephen will have a solution for this problem. In the meantime, I will look into this to see if we can find a check that works.
thanks,
-- Shuah
Shuah Khan
maintainerRe: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data
Quoted 76 lines · Shuah Khan
Quoted 75 lines · Guenter Roeck
Quoted 73 lines · Guenter Roeck
Quoted 50 lines · Shuah Khan
Quoted 38 lines · Guenter Roeck
Copying devicetree maintainers.
Quoted 14 lines · Guenter Roeck
Quoted 7 lines · Guenter Roeck
Hi Stephen,
Quoted 3 lines · Stephen Boyd
Test that clks registered with 'struct
clk_parent_data' work as intended and can find their parents.Quoted 6 lines
When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.
Any idea what might cause the problem ?
Quoted 8 lines
I noticed that the new overlay tests fail as well, also with "path '/' not found".
[Maybe] answering my own question: I think the problem may be that there is no devicetree file and thus no devicetree root when booting through efi (in other words,
of_rootis NULL). Would it make sense to skip the tests in that case ?The problem is that
of_rootis not initialized in arm64 boots if ACPI is enabled.From arch/arm64/kernel/setup.c:setup_arch():
if (
acpi_disabled)
unflatten_device_tree(); // initializesof_rootACPI is enabled if the system boots from EFI. This also affects
CONFIG_OF_KUNIT_TEST, which explicitly checks ifof_rootexists and fails the test if it doesn't.Quoted 7 lines
I think those tests need to add a check for this condition, or affected machines won't be able to run those unit tests. The obvious solution would be to check if
of_rootis set, but then the associated test case inCONFIG_OF_KUNIT_TESTwould not make sense.Any suggestions ?
Would it work if these tests check if
acpi_disabledand skip if it isn't disabled? It might be low overhead condition to check from these tests.Quoted 7 lines
acpi_disabledis exported:arch/arm64/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/loongarch/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/riscv/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/x86/kernel/acpi/boot.c:EXPORT_SYMBOL(acpi_disabled);
I don't think that would work. Looking through the use of
acpi_init, I don't think thatof_rootis always NULL whenacpi_initis false; that just happens to be the case on arm64 when booting through efi. However, even arm64 has the following code.if (
acpi_disabled)
psci_dt_init();
else
psci_acpi_init();While
psci_dt_init()doesn't setof_root, it does try to do a devicetree match. So there must be some other condition whereacpi_disabledis set butof_rootis set anyway. I just have not found that code path.
Quoted 8 lines
Quoted 7 lines
I ended up disabling all affected unit tests for arm64. I'll do the same for other architectures if I encounter the problem there as well.
Unfortunately that includes all clock unit tests because the tests requiring devicetree support can not be enabled/disabled separately, but that can't be helped and is still better than "mandatory" failures.
of_root is set in drivers/of/pdt.c when it creates the root node. This could be a definitive test for kunit tests that depend on devicetree support.
It is an exported symbol. drivers/of/base.c exports it.
thanks,
-- SHuah
Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data
Quoted 86 lines · Shuah Khan
Quoted 76 lines · Shuah Khan
Quoted 75 lines · Guenter Roeck
Quoted 73 lines · Guenter Roeck
Quoted 50 lines · Shuah Khan
Quoted 38 lines · Guenter Roeck
Copying devicetree maintainers.
Quoted 14 lines · Guenter Roeck
Quoted 7 lines · Guenter Roeck
Hi Stephen,
Quoted 3 lines · Stephen Boyd
Test that clks registered with 'struct
clk_parent_data' work as intended and can find their parents.Quoted 6 lines
When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.
Any idea what might cause the problem ?
Quoted 8 lines
I noticed that the new overlay tests fail as well, also with "path '/' not found".
[Maybe] answering my own question: I think the problem may be that there is no devicetree file and thus no devicetree root when booting through efi (in other words,
of_rootis NULL). Would it make sense to skip the tests in that case ?The problem is that
of_rootis not initialized in arm64 boots if ACPI is enabled.From arch/arm64/kernel/setup.c:setup_arch():
if (
acpi_disabled)
unflatten_device_tree(); // initializesof_rootACPI is enabled if the system boots from EFI. This also affects
CONFIG_OF_KUNIT_TEST, which explicitly checks ifof_rootexists and fails the test if it doesn't.Quoted 7 lines
I think those tests need to add a check for this condition, or affected machines won't be able to run those unit tests. The obvious solution would be to check if
of_rootis set, but then the associated test case inCONFIG_OF_KUNIT_TESTwould not make sense.Any suggestions ?
Would it work if these tests check if
acpi_disabledand skip if it isn't disabled? It might be low overhead condition to check from these tests.Quoted 7 lines
acpi_disabledis exported:arch/arm64/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/loongarch/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/riscv/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/x86/kernel/acpi/boot.c:EXPORT_SYMBOL(acpi_disabled);
I don't think that would work. Looking through the use of
acpi_init, I don't think thatof_rootis always NULL whenacpi_initis false; that just happens to be the case on arm64 when booting through efi. However, even arm64 has the following code.if (
acpi_disabled)
psci_dt_init();
else
psci_acpi_init();While
psci_dt_init()doesn't setof_root, it does try to do a devicetree match. So there must be some other condition whereacpi_disabledis set butof_rootis set anyway. I just have not found that code path.Quoted 8 lines
Quoted 7 lines
I ended up disabling all affected unit tests for arm64. I'll do the same for other architectures if I encounter the problem there as well.
Unfortunately that includes all clock unit tests because the tests requiring devicetree support can not be enabled/disabled separately, but that can't be helped and is still better than "mandatory" failures.
Quoted 4 lines
of_rootis set indrivers/of/pdt.cwhen it creates the root node. This could be a definitive test for kunit tests that depend on devicetree support.
That is not always the case, including arm64. It is primarily set in unflatten_devicetree(), which is not called on arm64 unless acpi_is disabled (see above).
Quoted 2 lines
It is an exported symbol.
drivers/of/base.cexports it.
Yes, checking if of_root is NULL and skipping the test in that case might help, but then there is the of_dtb_root_node_populates_of_root unit test which explicitly fails if of_root is NULL. The comment describing the test is
/*
* Test that the 'of_root' global variable is always populated when DT code is
* enabled. Remove this test once of_root is removed from global access. */
The devicetree unit test code explicitly assumes that of_root is set if CONFIG_OF_EARLY_FLATTREE is enabled, but that is not always the case (again, of_root is NULL on arm64 unless acpi is disabled).
Guenter
Stephen Boyd
maintainerRe: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data
Quoting Guenter Roeck (2024-09-28 14:32:35)
Quoted 32 lines · Shuah Khan
Quoted 31 lines · Shuah Khan
Quoted 30 lines · Guenter Roeck
Quoted 29 lines · Guenter Roeck
Quoted 28 lines · Shuah Khan
Quoted 27 lines · Guenter Roeck
Quoted 26 lines
Copying devicetree maintainers.
Quoted 22 lines · Guenter Roeck
Quoted 7 lines · Guenter Roeck
Hi Stephen,
Quoted 3 lines · Stephen Boyd
Test that clks registered with 'struct
clk_parent_data' work as intended and can find their parents.Quoted 6 lines
When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.
Any idea what might cause the problem ?
I noticed that the new overlay tests fail as well, also with "path '/' not found".
[Maybe] answering my own question: I think the problem may be that there is no devicetree file and thus no devicetree root when booting through efi (in other words,
of_rootis NULL). Would it make sense to skip the tests in that case ?
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
The problem is that
of_rootis not initialized in arm64 boots if ACPI is enabled.From arch/arm64/kernel/setup.c:setup_arch():
if (
acpi_disabled)
unflatten_device_tree(); // initializesof_root
Oof I forgot that Rob didn't apply the patch that let an empty root live on ARM64 ACPI systems. See this thread[1] for all the details.
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
ACPI is enabled if the system boots from EFI. This also affects
CONFIG_OF_KUNIT_TEST, which explicitly checks ifof_rootexists and fails the test if it doesn't.
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
I think those tests need to add a check for this condition, or affected machines won't be able to run those unit tests. The obvious solution would be to check if
of_rootis set, but then the associated test case inCONFIG_OF_KUNIT_TESTwould not make sense.Any suggestions ?
I think that's the best we can do for now. Basically add a check like
if (IS_ENABLED(CONFIG_ARM64) && acpi_disabled) kunit_skip(test, "ARM64 + ACPI rejects DT overlays");
to the overlay application function and the DT test.
Quoted 53 lines
Quoted 36 lines
Quoted 27 lines
Quoted 27 lines
Quoted 26 lines
Quoted 11 lines
Would it work if these tests check if
acpi_disabledand skip if it isn't disabled? It might be low overhead condition to check from these tests.
acpi_disabledis exported:arch/arm64/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/loongarch/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/riscv/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/x86/kernel/acpi/boot.c:EXPORT_SYMBOL(acpi_disabled);
I don't think that would work. Looking through the use of
acpi_init, I don't think thatof_rootis always NULL whenacpi_initis false; that just happens to be the case on arm64 when booting through efi. However, even arm64 has the following code.if (
acpi_disabled)
psci_dt_init();
else
psci_acpi_init();While
psci_dt_init()doesn't setof_root, it does try to do a devicetree match. So there must be some other condition whereacpi_disabledis set butof_rootis set anyway. I just have not found that code path.Quoted 8 lines
Quoted 7 lines
I ended up disabling all affected unit tests for arm64. I'll do the same for other architectures if I encounter the problem there as well.
Unfortunately that includes all clock unit tests because the tests requiring devicetree support can not be enabled/disabled separately, but that can't be helped and is still better than "mandatory" failures.
Quoted 4 lines
of_rootis set indrivers/of/pdt.cwhen it creates the root node. This could be a definitive test for kunit tests that depend on devicetree support.That is not always the case, including arm64. It is primarily set in
unflatten_devicetree(), which is not called on arm64 unlessacpi_isdisabled (see above).Quoted 2 lines
It is an exported symbol.
drivers/of/base.cexports it.Yes, checking if
of_rootis NULL and skipping the test in that case might help, but then there is theof_dtb_root_node_populates_of_rootunit test which explicitly fails ifof_rootis NULL. The comment describing the test is
Quoted 9 lines
/*
* Test that the 'of_root' global variable is always populated when DT code is
* enabled. Remove this test onceof_rootis removed from global access. */The devicetree unit test code explicitly assumes that
of_rootis set ifCONFIG_OF_EARLY_FLATTREEis enabled, but that is not always the case (again,of_rootis NULL on arm64 unless acpi is disabled).
That DT test has been there for a few releases. Is this the first time those tests have been run on arm64+acpi? I didn't try after sending the patches and forgot that the patch was dropped.
How are you running kunit tests? I installed the qemu-efi-aarch64 debian package to get QEMU_EFI.fd but passing that to the kunit.py run command with --qemu_args="-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd" didn't get me beyond the point that the EFI stub boots linux. I think the serial console must not be working and thus the kunit wrapper waits for something to show up but nothing ever does. I haven't dug any further though, so maybe you have a working command.
Here's my command that isn't working:
./tools/testing/kunit/kunit.py run --arch=arm64 --kunitconfig=drivers/of --qemu_args="-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd"
Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data
On 10/3/24 16:46, Stephen Boyd wrote:
[ ... ]
Quoted 4 lines
That DT test has been there for a few releases. Is this the first time those tests have been run on arm64+acpi? I didn't try after sending the patches and forgot that the patch was dropped.
Previously I had the affected tests disabled and never tracked down the problem. Since the problem is now spreading to additional tests, I finally tracked it down, that is all.
Quoted 8 lines
How are you running kunit tests? I installed the qemu-efi-aarch64 debian package to get QEMU_EFI.fd but passing that to the
kunit.pyrun command with --qemu_args="-bios/usr/share/qemu-efi-aarch64/QEMU_EFI.fd" didn't get me beyond the point that the EFI stub boots linux. I think the serial console must not be working and thus the kunit wrapper waits for something to show up but nothing ever does. I haven't dug any further though, so maybe you have a working command.
I run all tests during boot, not from the command line. I also use the -bios command but don't recall any issues with the console. I specify the console on the qemu command line; depending on the qemu machine it is either ttyS0 or ttyAMA0. The init script then finds and selects the active console.
Quoted 4 lines
Here's my command that isn't working:
./tools/testing/kunit/kunit.pyrun --arch=arm64 --kunitconfig=drivers/of --qemu_args="-bios/usr/share/qemu-efi-aarch64/QEMU_EFI.fd"
I can't really see what that command is actually doing ;-).
I'll just keep the affected tests disabled on arm64 for the time being.
Thanks,
Guenter
Stephen Boyd
maintainerRe: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data
Quoting Guenter Roeck (2024-10-03 17:25:37)
Quoted 10 lines · Stephen Boyd
[ ... ]
Quoted 4 lines
That DT test has been there for a few releases. Is this the first time those tests have been run on arm64+acpi? I didn't try after sending the patches and forgot that the patch was dropped.
Previously I had the affected tests disabled and never tracked down the problem. Since the problem is now spreading to additional tests, I finally tracked it down, that is all.
Ok great. Good to know this isn't a new problem. Thanks for tracking it down.
Quoted 10 lines
Quoted 9 lines
How are you running kunit tests? I installed the qemu-efi-aarch64 debian package to get QEMU_EFI.fd but passing that to the
kunit.pyrun command with --qemu_args="-bios/usr/share/qemu-efi-aarch64/QEMU_EFI.fd" didn't get me beyond the point that the EFI stub boots linux. I think the serial console must not be working and thus the kunit wrapper waits for something to show up but nothing ever does. I haven't dug any further though, so maybe you have a working command.
Quoted 4 lines
I run all tests during boot, not from the command line. I also use the -bios command but don't recall any issues with the console. I specify the console on the qemu command line; depending on the qemu machine it is either ttyS0 or ttyAMA0. The init script then finds and selects the active console.
Can you please describe how you run the kunit test? And provide the qemu command you run to boot arm64 with acpi?
Quoted 7 lines
Quoted 5 lines
Here's my command that isn't working:
./tools/testing/kunit/kunit.pyrun --arch=arm64 --kunitconfig=drivers/of --qemu_args="-bios/usr/share/qemu-efi-aarch64/QEMU_EFI.fd"I can't really see what that command is actually doing ;-).
It eventually runs this qemu command
qemu-system-aarch64 -nodefaults -m 1024 -kernel .kunit/arch/arm64/boot/Image.gz -append 'kunit.enable=1 console=ttyAMA0 kunit_shutdown=reboot' -no-reboot -nographic -serial stdio -machine virt -cpu max,pauth-impdef=on -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd
I see that it fails because the architected timer isn't there after I add an earlycon=pl011,0x9000000 to the kernel commandline. I suspect passing a bios like this is incorrect, but I rarely run qemu manually so I don't know what I'm doing wrong.
NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
rcu: srcu_init: Setting srcu_struct sizes based on contention.timer_probe: no matching timers found
Kernel panic - not syncing: Unable to initialise architected timer. CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted 6.11.0-rc1-00261-g497f7c30f184 #203 Call trace: dump_backtrace+0x94/0xec show_stack+0x18/0x24 dump_stack_lvl+0x38/0x90 dump_stack+0x18/0x24 panic+0x36c/0x380 early_brk64+0x0/0xa8 start_kernel+0x27c/0x558 __primary_switched+0x80/0x88 ---[ end Kernel panic - not syncing: Unable to initialise architected timer. ]---
Quoted 2 lines
I'll just keep the affected tests disabled on arm64 for the time being.
We should skip the tests on arm64+acpi, which is similar to disabling but not exactly the same. There will likely be more DT overlay usage in kunit and so that will lead to more test disabling. Skipping properly is the better solution.
Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data
Quoted 25 lines · Stephen Boyd
Quoting Guenter Roeck (2024-10-03 17:25:37)
Quoted 10 lines · Stephen Boyd
[ ... ]
Quoted 4 lines
That DT test has been there for a few releases. Is this the first time those tests have been run on arm64+acpi? I didn't try after sending the patches and forgot that the patch was dropped.
Previously I had the affected tests disabled and never tracked down the problem. Since the problem is now spreading to additional tests, I finally tracked it down, that is all.
Ok great. Good to know this isn't a new problem. Thanks for tracking it down.
Quoted 10 lines
Quoted 9 lines
How are you running kunit tests? I installed the qemu-efi-aarch64 debian package to get QEMU_EFI.fd but passing that to the
kunit.pyrun command with --qemu_args="-bios/usr/share/qemu-efi-aarch64/QEMU_EFI.fd" didn't get me beyond the point that the EFI stub boots linux. I think the serial console must not be working and thus the kunit wrapper waits for something to show up but nothing ever does. I haven't dug any further though, so maybe you have a working command.
Quoted 8 lines
Quoted 4 lines
I run all tests during boot, not from the command line. I also use the -bios command but don't recall any issues with the console. I specify the console on the qemu command line; depending on the qemu machine it is either ttyS0 or ttyAMA0. The init script then finds and selects the active console.
Can you please describe how you run the kunit test? And provide the qemu command you run to boot arm64 with acpi?
Example command line:
qemu-system-aarch64 -M virt -m 512 \
-kernel arch/arm64/boot/Image -no-reboot -nographic \
-snapshot \
-bios /opt/buildbot/rootfs/arm64/../firmware/QEMU_EFI-aarch64.fd \
-device virtio-blk-device,drive=d0 \
-drive file=rootfs.ext2,if=none,id=d0,format=raw \
-cpu cortex-a57 -serial stdio -monitor none -no-reboot \
--append "kunit.stats_enabled=2 kunit.filter=speed>slow root=/dev/vda rootwait earlycon=pl011,0x9000000 console=ttyAMA0"That works fine for me. Configuration is arm64 defconfig plus various debug and kunit options. I built the efi image myself from sources. The root file system is from buildroot with modified init script. kunit tests are all built into the kernel and run during boot.
Quoted 7 lines
Quoted 2 lines
I'll just keep the affected tests disabled on arm64 for the time being.
We should skip the tests on arm64+acpi, which is similar to disabling but not exactly the same. There will likely be more DT overlay usage in kunit and so that will lead to more test disabling. Skipping properly is the better solution.
Sure, but having those tests fail all the time doesn't help either. I'll re-enable the tests if / when they are skipped.
Thanks,
Guenter
Stephen Boyd
maintainerRe: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data
Quoting Guenter Roeck (2024-10-03 21:52:09)
Quoted 17 lines · Stephen Boyd
Quoted 4 lines
Can you please describe how you run the kunit test? And provide the qemu command you run to boot arm64 with acpi?
Example command line:
qemu-system-aarch64 -M virt -m 512 \ -kernel arch/arm64/boot/Image -no-reboot -nographic \ -snapshot \ -bios /opt/buildbot/rootfs/arm64/../firmware/QEMU_EFI-aarch64.fd \ -device virtio-blk-device,drive=d0 \ -drive file=rootfs.ext2,if=none,id=d0,format=raw \ -cpu cortex-a57 -serial stdio -monitor none -no-reboot \ --append "kunit.stats_enabled=2 kunit.filter=speed>slow root=/dev/vda rootwait earlycon=pl011,0x9000000 console=ttyAMA0"
Quoted 4 lines
That works fine for me. Configuration is arm64 defconfig plus various debug and kunit options. I built the efi image myself from sources. The root file system is from buildroot with modified init script. kunit tests are all built into the kernel and run during boot.
Thanks. I figured out that I was missing enabling CONFIG_ACPI. Here's my commandline
./tools/testing/kunit/kunit.py run --arch=arm64 \ --kunitconfig=drivers/of \ --qemu_args="-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd -smp 2" \ --kconfig_add="CONFIG_ACPI=y" \ --kernel_args="earlycon=pl011,0x9000000"
Now I can boot and reproduce the failure, but there's another problem. ACPI disables itself when it fails to find tables.
ACPI: Unable to load the System Description Tables
This calls disable_acpi() which sets acpi_disabled to 1. This happens before the unit test runs, meaning we can't reliably use 'acpi_disabled' as a method to skip.
The best I can come up with then is to test for a NULL of_root when CONFIG_ARM64 and CONFIG_ACPI are enabled, because the tests intentionally don't work when both those configs are enabled and the 'of_root' isn't populated. In all other cases the 'of_root' missing is a bug. I'll probably make this into some sort of kunit helper function in of_private.h and send it to DT maintainers.
---8<----
drivers/of/of_kunit_helpers.c +3 -0
@@ -36,6 +36,9 @@ int of_overlay_fdt_apply_kunit(struct kunit *test, void *overlay_fdt,int ret;int *copy_id; +if (IS_ENABLED (CONFIG_ARM64 ) &&IS_ENABLED (CONFIG_ACPI ) && !of_root) +kunit_skip (test,"arm64+acpi rejects overlays" ); + copy_id =kunit_kmalloc (test,sizeof (*copy_id),GFP_KERNEL );if (!copy_id)return -ENOMEM ;
drivers/of/of_test.c +2 -0
@@ -38,6 +38,8 @@ static int of_dtb_test_init(struct kunit *test) {if (!IS_ENABLED (CONFIG_OF_EARLY_FLATTREE ))kunit_skip (test,"requires CONFIG_OF_EARLY_FLATTREE" ); +if (IS_ENABLED (CONFIG_ARM64 ) &&IS_ENABLED (CONFIG_ACPI ) && !of_root) +kunit_skip (test,"arm64+acpi doesn't populate a root node on ACPI systems" );return 0 ; }
drivers/of/overlay_test.c +2 -0
@@ -64,6 +64,8 @@ static void of_overlay_apply_kunit_cleanup(struct kunit *test)if (!IS_ENABLED (CONFIG_OF_EARLY_FLATTREE ))kunit_skip (test,"requires CONFIG_OF_EARLY_FLATTREE for root node" ); +if (IS_ENABLED (CONFIG_ARM64 ) &&IS_ENABLED (CONFIG_ACPI ) && !of_root) +kunit_skip (test,"arm64+acpi rejects overlays" );kunit_init_test (&fake,"fake test" ,NULL );KUNIT_ASSERT_EQ (test, fake.status,KUNIT_SUCCESS );
Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data
Quoted 41 lines · Stephen Boyd
Quoting Guenter Roeck (2024-10-03 21:52:09)
Quoted 17 lines · Stephen Boyd
Quoted 4 lines
Can you please describe how you run the kunit test? And provide the qemu command you run to boot arm64 with acpi?
Example command line:
qemu-system-aarch64 -M virt -m 512 \ -kernel arch/arm64/boot/Image -no-reboot -nographic \ -snapshot \ -bios /opt/buildbot/rootfs/arm64/../firmware/QEMU_EFI-aarch64.fd \ -device virtio-blk-device,drive=d0 \ -drive file=rootfs.ext2,if=none,id=d0,format=raw \ -cpu cortex-a57 -serial stdio -monitor none -no-reboot \ --append "kunit.stats_enabled=2 kunit.filter=speed>slow root=/dev/vda rootwait earlycon=pl011,0x9000000 console=ttyAMA0"Quoted 4 lines
That works fine for me. Configuration is arm64 defconfig plus various debug and kunit options. I built the efi image myself from sources. The root file system is from buildroot with modified init script. kunit tests are all built into the kernel and run during boot.
Thanks. I figured out that I was missing enabling
CONFIG_ACPI. Here's my commandline./tools/testing/kunit/kunit.py run --arch=arm64 \ --kunitconfig=drivers/of \ --qemu_args="-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd -smp 2" \ --kconfig_add="CONFIG_ACPI=y" \ --kernel_args="earlycon=pl011,0x9000000"Now I can boot and reproduce the failure, but there's another problem. ACPI disables itself when it fails to find tables.
ACPI: Unable to load the System Description Tables
This calls
disable_acpi()which setsacpi_disabledto 1. This happens before the unit test runs, meaning we can't reliably use 'acpi_disabled' as a method to skip.
Quoted 6 lines
The best I can come up with then is to test for a NULL
of_rootwhenCONFIG_ARM64andCONFIG_ACPIare enabled, because the tests intentionally don't work when both those configs are enabled and the 'of_root' isn't populated. In all other cases the 'of_root' missing is a bug. I'll probably make this into some sort of kunit helper function inof_private.hand send it to DT maintainers.
Sounds good. Thanks a lot for tracking this down.
That makes me wonder though why only arm64 has that restriction. Both riscv and loongarch have ACPI enabled in their defconfig files but call unflatten_device_tree() unconditionally.
Oh well ...
Thanks,
Guenter
Stephen Boyd
maintainerRe: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data
Quoting Guenter Roeck (2024-10-08 16:27:37)
Quoted 9 lines · Stephen Boyd
Quoted 7 lines
The best I can come up with then is to test for a NULL
of_rootwhenCONFIG_ARM64andCONFIG_ACPIare enabled, because the tests intentionally don't work when both those configs are enabled and the 'of_root' isn't populated. In all other cases the 'of_root' missing is a bug. I'll probably make this into some sort of kunit helper function inof_private.hand send it to DT maintainers.
Quoted 7 lines
Sounds good. Thanks a lot for tracking this down.
That makes me wonder though why only arm64 has that restriction. Both riscv and loongarch have ACPI enabled in their defconfig files but call
unflatten_device_tree()unconditionally.Oh well ...
Some of the reason is described in the thread I linked earlier. In particular, this email from Mark[1]. There's also more comments from Mark on an earlier patchset[2]. Maybe arm64 will allow it later, and then we'll be able to revert this skip patch.
[1] https://lore.kernel.org/all/[email protected]/
[2] https://lore.kernel.org/all/ZaZtbU9hre3YhZam@FVFF77S0Q05N/