* [PATCH 0/2] driver core: remove software node from platform devices on device release
@ 2026-04-10 11:50 Bartosz Golaszewski
2026-04-10 11:50 ` [PATCH 1/2] driver core: platform: remove software node on release() Bartosz Golaszewski
2026-04-10 11:50 ` [PATCH 2/2] driver core: platform: tests: add a test case for correct swnode removal Bartosz Golaszewski
0 siblings, 2 replies; 5+ messages in thread
From: Bartosz Golaszewski @ 2026-04-10 11:50 UTC (permalink / raw)
To: Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich, Dmitry Torokhov
Cc: brgl, driver-core, linux-kernel, Bartosz Golaszewski
This fixes an issue in platform device code where, if we specify a
software node for a platform device using struct platform_device_info,
it will not be removed on device .release().
The second patch adds a test-case that can be used to reproduce the
problem and prove that the fix works.
First patch should go into v7.1 while patch 2/2 can be queued for v7.2.
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
---
Bartosz Golaszewski (2):
driver core: platform: remove software node on release()
driver core: platform: tests: add a test case for correct swnode removal
drivers/base/platform.c | 1 +
drivers/base/test/platform-device-test.c | 62 ++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+)
---
base-commit: 3fa7d958829eb9bc3b469ed07f11de3d2804ef71
change-id: 20260410-swnode-remove-on-dev-unreg-42bfc4b23ba8
Best regards,
--
Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH 1/2] driver core: platform: remove software node on release() 2026-04-10 11:50 [PATCH 0/2] driver core: remove software node from platform devices on device release Bartosz Golaszewski @ 2026-04-10 11:50 ` Bartosz Golaszewski 2026-04-13 3:56 ` Dmitry Torokhov 2026-04-10 11:50 ` [PATCH 2/2] driver core: platform: tests: add a test case for correct swnode removal Bartosz Golaszewski 1 sibling, 1 reply; 5+ messages in thread From: Bartosz Golaszewski @ 2026-04-10 11:50 UTC (permalink / raw) To: Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich, Dmitry Torokhov Cc: brgl, driver-core, linux-kernel, Bartosz Golaszewski If we pass a software node to a newly created device using struct platform_device_info, it will not be removed when the device is released. This may happen when a module creating the device is removed or on failure in platform_device_add(). When we try to reuse that software node in a subsequent call to platform_device_register_full(), it will fails with -EBUSY. Add the missing call to device_remove_software_node() in release path. Fixes: 0fc434bc2c45 ("driver core: platform: allow attaching software nodes when creating devices") Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com> --- drivers/base/platform.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 75b4698d0e582e67adafa78c312d75c72fd654cf..a442abb4f1028a91f3c56b51211335678f7f18a2 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c @@ -600,6 +600,7 @@ static void platform_device_release(struct device *dev) pdev.dev); of_node_put(pa->pdev.dev.of_node); + device_remove_software_node(dev); kfree(pa->pdev.dev.platform_data); kfree(pa->pdev.mfd_cell); kfree(pa->pdev.resource); -- 2.47.3 ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] driver core: platform: remove software node on release() 2026-04-10 11:50 ` [PATCH 1/2] driver core: platform: remove software node on release() Bartosz Golaszewski @ 2026-04-13 3:56 ` Dmitry Torokhov 2026-04-21 8:44 ` Bartosz Golaszewski 0 siblings, 1 reply; 5+ messages in thread From: Dmitry Torokhov @ 2026-04-13 3:56 UTC (permalink / raw) To: Bartosz Golaszewski Cc: Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich, brgl, driver-core, linux-kernel Hi Bartosz, On Fri, Apr 10, 2026 at 01:50:45PM +0200, Bartosz Golaszewski wrote: > If we pass a software node to a newly created device using struct > platform_device_info, it will not be removed when the device is > released. This may happen when a module creating the device is removed > or on failure in platform_device_add(). > > When we try to reuse that software node in a subsequent call to > platform_device_register_full(), it will fails with -EBUSY. Add the > missing call to device_remove_software_node() in release path. Thank you for spotting this, but I do not believe the patch is correct as it stands. We need to differentiate between nodes registered by platform devices vs nodes that already registered where we simply use them. I think we need to mark nodes that platform_device_register_full() registers form swnodes as "managed = true" so that they are cleaned up properly. See also sashiko feedback. https://sashiko.dev/#/patchset/20260410-swnode-remove-on-dev-unreg-v1-0-cd7d305f3db2%40oss.qualcomm.com Thanks. -- Dmitry ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] driver core: platform: remove software node on release() 2026-04-13 3:56 ` Dmitry Torokhov @ 2026-04-21 8:44 ` Bartosz Golaszewski 0 siblings, 0 replies; 5+ messages in thread From: Bartosz Golaszewski @ 2026-04-21 8:44 UTC (permalink / raw) To: Dmitry Torokhov Cc: Bartosz Golaszewski, Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich, driver-core, linux-kernel On Mon, Apr 13, 2026 at 5:56 AM Dmitry Torokhov <dmitry.torokhov@gmail.com> wrote: > > Hi Bartosz, > > On Fri, Apr 10, 2026 at 01:50:45PM +0200, Bartosz Golaszewski wrote: > > If we pass a software node to a newly created device using struct > > platform_device_info, it will not be removed when the device is > > released. This may happen when a module creating the device is removed > > or on failure in platform_device_add(). > > > > When we try to reuse that software node in a subsequent call to > > platform_device_register_full(), it will fails with -EBUSY. Add the > > missing call to device_remove_software_node() in release path. > > Thank you for spotting this, but I do not believe the patch is correct > as it stands. We need to differentiate between nodes registered by > platform devices vs nodes that already registered where we simply use > them. > We already do: platform_device_release() is only set for devices dynamically allocated with platform_device_alloc() which is what happens in platform_device_register_full(). platform_device_alloc() already imposes limitations on the caller - like having to provide platform data that can be shallow-copied as platform_device_release() calls kfree() on it unconditionally. Even if the user adds the software node manually, it needs to be removed. > I think we need to mark nodes that platform_device_register_full() > registers form swnodes as "managed = true" so that they are cleaned up > properly. > > See also sashiko feedback. > > https://sashiko.dev/#/patchset/20260410-swnode-remove-on-dev-unreg-v1-0-cd7d305f3db2%40oss.qualcomm.com > I'll see about reproducing it and possibly adding a kunit test-case as well. Bart ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 2/2] driver core: platform: tests: add a test case for correct swnode removal 2026-04-10 11:50 [PATCH 0/2] driver core: remove software node from platform devices on device release Bartosz Golaszewski 2026-04-10 11:50 ` [PATCH 1/2] driver core: platform: remove software node on release() Bartosz Golaszewski @ 2026-04-10 11:50 ` Bartosz Golaszewski 1 sibling, 0 replies; 5+ messages in thread From: Bartosz Golaszewski @ 2026-04-10 11:50 UTC (permalink / raw) To: Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich, Dmitry Torokhov Cc: brgl, driver-core, linux-kernel, Bartosz Golaszewski Extend the kunit module for platform devices with a test case verifying that the same software node can be added to platform devices repeatedly. Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com> --- drivers/base/test/platform-device-test.c | 62 ++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/drivers/base/test/platform-device-test.c b/drivers/base/test/platform-device-test.c index 6355a2231b741791b54eb78af42e13f31f745184..9046be1cd0f68b57f70eddb15227609c925318ce 100644 --- a/drivers/base/test/platform-device-test.c +++ b/drivers/base/test/platform-device-test.c @@ -5,8 +5,10 @@ #include <linux/device.h> #include <linux/device/bus.h> +#include <linux/fwnode.h> #include <linux/of_platform.h> #include <linux/platform_device.h> +#include <linux/property.h> #define DEVICE_NAME "test" @@ -253,9 +255,69 @@ static struct kunit_suite platform_device_match_test_suite = { .test_cases = platform_device_match_tests, }; +static int platform_device_swnode_test_probe(struct platform_device *pdev) +{ + return 0; +} + +static struct platform_driver platform_swnode_test_driver = { + .probe = platform_device_swnode_test_probe, + .driver = { + .name = DEVICE_NAME, + }, +}; + +static const struct software_node platform_device_test_swnode = { }; + +static void platform_device_swnode_add_twice(struct kunit *test) +{ + struct platform_device_info pdevinfo; + struct platform_device *pdev; + struct fwnode_handle fwnode; + int ret; + + ret = kunit_platform_driver_register(test, &platform_swnode_test_driver); + KUNIT_ASSERT_EQ(test, ret, 0); + + fwnode_init(&fwnode, NULL); + pdevinfo = (struct platform_device_info){ + .name = DEVICE_NAME, + .id = PLATFORM_DEVID_NONE, + .fwnode = &fwnode, + .swnode = &platform_device_test_swnode, + }; + + pdev = platform_device_register_full(&pdevinfo); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, pdev); + + wait_for_device_probe(); + KUNIT_ASSERT_TRUE(test, device_is_bound(&pdev->dev)); + + platform_device_unregister(pdev); + + pdev = platform_device_register_full(&pdevinfo); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, pdev); + + wait_for_device_probe(); + KUNIT_ASSERT_TRUE(test, device_is_bound(&pdev->dev)); + + platform_device_unregister(pdev); +} + +static struct kunit_case platform_device_swnode_tests[] = { + KUNIT_CASE(platform_device_swnode_add_twice), + {} +}; + +static struct kunit_suite platform_device_swnode_test_suite = { + .name = "platform-device-swnode", + .test_cases = platform_device_swnode_tests, +}; + kunit_test_suites( &platform_device_devm_test_suite, &platform_device_match_test_suite, + &platform_device_swnode_test_suite, ); MODULE_DESCRIPTION("Test module for platform devices"); -- 2.47.3 ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-04-21 8:44 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-04-10 11:50 [PATCH 0/2] driver core: remove software node from platform devices on device release Bartosz Golaszewski 2026-04-10 11:50 ` [PATCH 1/2] driver core: platform: remove software node on release() Bartosz Golaszewski 2026-04-13 3:56 ` Dmitry Torokhov 2026-04-21 8:44 ` Bartosz Golaszewski 2026-04-10 11:50 ` [PATCH 2/2] driver core: platform: tests: add a test case for correct swnode removal Bartosz Golaszewski
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
Powered by JetHome