On Wed, 21 May 2025 at 07:41, Claudiu Beznea <claudiu.beznea@xxxxxxxxx> wrote: > > Hi, Ulf, > > On 20.05.2025 15:09, Ulf Hansson wrote: > > For example, even if the order is made correctly, suppose a driver's > > ->remove() callback completes by turning off the resources for its > > device and leaves runtime PM enabled, as it relies on devres to do it > > some point later. Beyond this point, nothing would prevent userspace > > for runtime resuming/suspending the device via sysfs. > > If I'm not wrong, that can't happen? The driver_sysfs_remove() is called > before device_remove() (which calls the driver remove) is called, this > being the call path: > > device_driver_detach() -> > device_release_driver_internal() -> > __device_release_driver() -> > driver_sysfs_remove() > // ... > device_remove() > > And the driver_sysfs_remove() calls in the end __kernfs_remove() which > looks to me like the place that actually drops the entries from sysfs, this > being a call path for it: > > driver_sysfs_remove() -> > sysfs_remove_link() -> > kernfs_remove_by_name() -> > kernfs_remove_by_name_ns() -> > __kernfs_remove() -> > > activating the following line in __kernfs_remove(): > > pr_debug("kernfs %s: removing\n", kernfs_rcu_name(kn)); > > leads to the following prints when unbinding the watchdog device from its > watchdog driver (attached to platform bus) on my board: > https://p.fr33tux.org/935252 Indeed this is a very good point you make! I completely overlooked this fact, thanks a lot for clarifying this! However, my main point still stands. In the end, there is nothing preventing rpm_suspend|resume|idle() in drivers/base/power/runtime.c from running (don't forget runtime PM is asynchronous too) for the device in question. This could lead to that a ->runtime_suspend|resume|idle() callback becomes executed at any point in time, as long as we haven't called pm_runtime_disable() for the device. That's why the devm_pm_runtime_enable() should be avoided as it simply introduces a race-condition. Drivers need to be more careful and use pm_runtime_enable|disable() explicitly to control the behaviour. Kind regards Uffe