clk: Add kunit tests for fixed rate and parent data
Subsystems (7)
Stephen Boyd
maintainerv6 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 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/clk/.kunitconfig | 2 + drivers/clk/Kconfig | 11 + drivers/clk/Makefile | 9 +- drivers/clk/clk-fixed-rate_test.c | 379 +++++++++++++++ drivers/clk/clk-fixed-rate_test.h | 8 + drivers/clk/clk_kunit_helpers.c | 204 ++++++++ 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 | 2 + drivers/of/kunit_overlay_test.dtso | 9 + drivers/of/of_kunit_helpers.c | 74 +++ drivers/of/overlay_test.c | 114 +++++ 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 | 223 +++++++++ lib/kunit/platform.c | 302 ++++++++++++ 28 files changed, 2084 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 v6 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
Stephen Boyd
maintainerPATCH v6 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 | 74 +++++++++++++ include/kunit/of.h | 115 ++++++++++++++++++++ 5 files changed, 214 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 +74 -0
74 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
Stephen Boyd
maintainerPATCH v6 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
Stephen Boyd
maintainerPATCH v6 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 | 1 + drivers/of/kunit_overlay_test.dtso | 9 +++ drivers/of/overlay_test.c | 114 +++++++++++++++++++++++++++++ 5 files changed, 135 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 +1 -0
@@ -21,5 +21,6 @@ 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 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 +114 -0
114 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 v6 4/8] of: Add a KUnit test for overlays and test managed APIs
Quoted 5 lines · Stephen Boyd
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.
...
drivers/of/overlay_test.c line 114
Quoted 4 lines
drivers/of/overlay_test.c new file +4
-0+kunit_test_suites ( + &of_overlay_apply_kunit_suite, +); +MODULE_LICENSE ("GPL" );
Multiple patches in this series introduce new instances of MODULE_LICENSE() without an accompanying MODULE_DESCRIPTION().
Building a module without a MODULE_DESCRIPTION() will result in a warning when building with make W=1.
/jeff
Stephen Boyd
maintainerRe: [PATCH v6 4/8] of: Add a KUnit test for overlays and test managed APIs
Quoting Jeff Johnson (2024-07-09 07:49:40)
Quoted 17 lines · Stephen Boyd
Quoted 5 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.
...
drivers/of/overlay_test.c line 114
Quoted 4 lines
drivers/of/overlay_test.c new file +4
-0+kunit_test_suites ( + &of_overlay_apply_kunit_suite, +); +MODULE_LICENSE ("GPL" );Multiple patches in this series introduce new instances of
MODULE_LICENSE()without an accompanyingMODULE_DESCRIPTION().
Quoted 2 lines
Building a module without a
MODULE_DESCRIPTION()will result in a warning when building with make W=1.
Thanks! I'll add it.
Stephen Boyd
maintainerPATCH v6 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 + include/kunit/platform_device.h | 20 ++ lib/kunit/Makefile | 4 +- lib/kunit/platform-test.c | 223 +++++++++++++ lib/kunit/platform.c | 302 ++++++++++++++++++ 6 files changed, 563 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:
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 +223 -0
223 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 v6 5/8] platform: Add test managed platform_device/driver APIs
Quoted 10 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 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]>---
Hmm... this is failing under KASAN for me. I'll take a closer look next week, but in case there's anything super-obvious, here's the report:
Quoted 118 lines
[15:54:33] BUG: KASAN: slab-use-after-free in
kobject_put+0x224/0x280
[15:54:33] Read of size 1 at addrffff888002ca484cby task kunit_try_catch/226 [15:54:33]
[15:54:33] CPU: 0 PID: 226 Comm:kunit_try_catchTainted: G D N 6.10.0-rc1-g21fbb4cfd3cc #25
[15:54:33] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014 [15:54:33] Call Trace:[15:54:33] <TASK> [15:54:33] dump_stack_lvl+0x3f/0x50 [15:54:33] print_report+0xcd/0x620 [15:54:33] ? kobject_put+0x224/0x280 [15:54:33] kasan_report+0xde/0x110 [15:54:33] ? kobject_put+0x224/0x280 [15:54:33] kobject_put+0x224/0x280 [15:54:33] kunit_remove_resource+0x12c/0x1d0 [15:54:33] kunit_cleanup+0x8d/0x130 [15:54:33] ? __pfx_kunit_try_run_case_cleanup+0x10/0x10 [15:54:33] ? __pfx_kunit_generic_run_threadfn_adapter+0x10/0x10 [15:54:33] kunit_generic_run_threadfn_adapter+0x7b/0xe0 [15:54:33] kthread+0x289/0x360 [15:54:33] ? __pfx_kthread+0x10/0x10 [15:54:33] ret_from_fork+0x2f/0x70 [15:54:33] ? __pfx_kthread+0x10/0x10 [15:54:33] ret_from_fork_asm+0x19/0x30 [15:54:33] </TASK> [15:54:33] [15:54:33] Allocated by task 225: [15:54:33] kasan_save_stack+0x33/0x60 [15:54:33] kasan_save_track+0x14/0x30 [15:54:33] __kasan_kmalloc+0x8f/0xa0 [15:54:33] platform_device_alloc+0x26/0x200 [15:54:33] kunit_platform_device_alloc_init+0x52/0xc0 [15:54:33] __kunit_add_resource+0x98/0x1e0 [15:54:33] kunit_platform_device_alloc+0xe7/0x170 [15:54:33] kunit_platform_device_add_test+0x91/0x560 [15:54:33] kunit_try_run_case+0x1ad/0x490 [15:54:33] kunit_generic_run_threadfn_adapter+0x7b/0xe0 [15:54:33] kthread+0x289/0x360 [15:54:33] ret_from_fork+0x2f/0x70 [15:54:33] ret_from_fork_asm+0x19/0x30 [15:54:33] [15:54:33] Freed by task 226: [15:54:33] kasan_save_stack+0x33/0x60 [15:54:33] kasan_save_track+0x14/0x30 [15:54:33] kasan_save_free_info+0x3b/0x60 [15:54:33] __kasan_slab_free+0x101/0x160 [15:54:33] kfree+0x94/0x190 [15:54:33] device_release+0x9a/0x210 [15:54:33] kobject_put+0x150/0x280 [15:54:33] kunit_remove_resource+0x12c/0x1d0 [15:54:33] kunit_cleanup+0x8d/0x130 [15:54:33] kunit_generic_run_threadfn_adapter+0x7b/0xe0 [15:54:33] kthread+0x289/0x360 [15:54:33] ret_from_fork+0x2f/0x70 [15:54:33] ret_from_fork_asm+0x19/0x30[15:54:33]
[15:54:33] The buggy address belongs to the object atffff888002ca4800
[15:54:33] which belongs to the cache kmalloc-1k of size 1024
[15:54:33] The buggy address is located 76 bytes inside of
[15:54:33] freed 1024-byte region [ffff888002ca4800,ffff888002ca4c00)
[15:54:33]
[15:54:33] The buggy address belongs to the physical page:
[15:54:33] page: refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x2ca4
[15:54:33] head: order:2 mapcount:0 entire_mapcount:0 nr_pages_mapped:0 pincount:0
[15:54:33] flags: 0x4000000000000040(head|zone=1)
[15:54:33]page_type: 0xffffefff(slab)
[15:54:33] raw: 4000000000000040ffff888001041b00dead0000000001220000000000000000
[15:54:33] raw: 0000000000000000 000000008008000800000001ffffefff0000000000000000
[15:54:33] head: 4000000000000040ffff888001041b00dead0000000001220000000000000000
[15:54:33] head: 0000000000000000 000000008008000800000001ffffefff0000000000000000
[15:54:33] head: 4000000000000002ffffea00000b2901ffffffffffffffff 0000000000000000
[15:54:33] head: 0000000000000004 000000000000000000000000ffffffff0000000000000000
[15:54:33] page dumped because: kasan: bad access detected
[15:54:33]
[15:54:33] Memory state around the buggy address:
[15:54:33]ffff888002ca4700: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
[15:54:33]ffff888002ca4780: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
[15:54:33] >ffff888002ca4800: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
[15:54:33] ^
[15:54:33]ffff888002ca4880: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
[15:54:33]ffff888002ca4900: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
[15:54:33] ==================================================================
[15:54:33] ------------[ cut here ]------------
[15:54:33]refcount_t: underflow; use-after-free.
[15:54:33] WARNING: CPU: 0 PID: 226 atlib/refcount.c:28refcount_warn_saturate+0xf2/0x150
[15:54:33] CPU: 0 PID: 226 Comm:kunit_try_catchTainted: G B D N 6.10.0-rc1-g21fbb4cfd3cc #25
[15:54:33] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.3-debian-1.16.3-2 04/01/2014
[15:54:33] RIP: 0010:refcount_warn_saturate+0xf2/0x150
[15:54:33] Code: 3b aa cb 00 01 e8 3e c1 b0 ff 0f 0b eb 91 80 3d 2a aa cb 00 00 75 88 48 c7 c7 40 f3 88 ad c6 05 1a aa cb 00 01 e8 1e c1 b0 ff <0f> 0b e9 6e ff ff ff 80 3d 0a aa cb 00 00 0f 85 61 ff ff ff 48 c7 [15:54:33] RSP: 0018:ffff88800357fe58 EFLAGS: 00000286
[15:54:33] RAX: 0000000000000000 RBX:ffff888002ca4848RCX:1ffffffff5b920d4
[15:54:33] RDX: 0000000000000000 RSI: 0000000000000004 RDI:ffffffffadc906a0
[15:54:33] RBP: 0000000000000003 R08: 0000000000000000 R09:fffffbfff5b920d4
[15:54:33] R10: 0000000000000003 R11: 0000000000000001 R12:ffff88800111fb28
[15:54:33] R13:ffff88800111fb28R14:ffff88800111fb28R15: 0000000000000286
[15:54:33] FS: 0000000000000000(0000) GS:ffffffffadc6f000(0000) knlGS:0000000000000000
[15:54:33] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[15:54:33] CR2:dffffc0000000000CR3:000000000a25a000CR4:00000000000006f0
[15:54:33] Call Trace:[15:54:33] <TASK> [15:54:33] ? __warn+0xb0/0x170 [15:54:33] ? refcount_warn_saturate+0xf2/0x150 [15:54:33] ? report_bug+0x298/0x350 [15:54:33] ? handle_bug+0x6d/0x90 [15:54:33] ? exc_invalid_op+0x17/0x40 [15:54:33] ? asm_exc_invalid_op+0x1a/0x20 [15:54:33] ? refcount_warn_saturate+0xf2/0x150 [15:54:33] ? refcount_warn_saturate+0xf2/0x150 [15:54:33] kunit_remove_resource+0x12c/0x1d0 [15:54:33] kunit_cleanup+0x8d/0x130 [15:54:33] ? __pfx_kunit_try_run_case_cleanup+0x10/0x10 [15:54:33] ? __pfx_kunit_generic_run_threadfn_adapter+0x10/0x10 [15:54:33] kunit_generic_run_threadfn_adapter+0x7b/0xe0 [15:54:33] kthread+0x289/0x360 [15:54:33] ? __pfx_kthread+0x10/0x10 [15:54:33] ret_from_fork+0x2f/0x70 [15:54:33] ? __pfx_kthread+0x10/0x10 [15:54:33] ret_from_fork_asm+0x19/0x30 [15:54:33] </TASK>
Quoted 2 lines
[15:54:33] ---[ end trace 0000000000000000 ]--- [15:54:33] [FAILED]
kunit_platform_device_add_test
It repros here with:./tools/testing/kunit/kunit.py run --arch x86_64 --kconfig_add CONFIG_KASAN=y --kconfig_add CONFIG_KASAN_VMALLOC=y kunit_platform_driver
Seems to otherwise pass on all of my default configs/archs.
Cheers,
-- David
Stephen Boyd
maintainerRe: [PATCH v6 5/8] platform: Add test managed platform_device/driver APIs
Quoting David Gow (2024-07-06 01:04:25)
Quoted 19 lines · Stephen Boyd
Quoted 10 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]>---
Quoted 3 lines
Hmm... this is failing under KASAN for me. I'll take a closer look next week, but in case there's anything super-obvious, here's the report:
Thanks. I reproduced with your commandline and I'll take a look.
Stephen Boyd
maintainerRe: [PATCH v6 5/8] platform: Add test managed platform_device/driver APIs
Quoting Stephen Boyd (2024-07-07 11:02:06)
Quoted 20 lines
Quoting David Gow (2024-07-06 01:04:25)
Quoted 19 lines · Stephen Boyd
Quoted 17 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.
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]>---
Quoted 6 lines
Quoted 3 lines
Hmm... this is failing under KASAN for me. I'll take a closer look next week, but in case there's anything super-obvious, here's the report:
Thanks. I reproduced with your commandline and I'll take a look.
Seems that I forgot to fold this in when I was testing.
----8<---
lib/kunit/platform.c +1 -1
@@ -75,7 +75,7 @@ kunit_platform_device_alloc_match(struct kunit *test, {struct platform_device *pdev = match_data; -return res->data == pdev && res->free != kunit_platform_device_alloc_exit; +return res->data == pdev && res->free == kunit_platform_device_alloc_exit; } KUNIT_DEFINE_ACTION_WRAPPER(platform_device_unregister_wrapper,
Stephen Boyd
maintainerPATCH v6 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 | 204 ++++++++++++++++++++ include/kunit/clk.h | 28 +++ 5 files changed, 252 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 +204 -0
204 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
Stephen Boyd
maintainerPATCH v6 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 | 1 + drivers/clk/clk-fixed-rate_test.c | 379 +++++++++++++++++++++ drivers/clk/clk-fixed-rate_test.h | 8 + drivers/clk/kunit_clk_fixed_rate_test.dtso | 19 ++ 6 files changed, 418 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 +1 -0
@@ -6,6 +6,7 @@ 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 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 +379 -0
379 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
Stephen Boyd
maintainerPATCH v6 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 | 3 +- 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, 494 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 +2 -1
@@ -2,7 +2,8 @@ # 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 \ + 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