Re: [PATCH] power: supply: core: Fix extension related lockdep warning

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2025-01-30 15:00:35+0100, Hans de Goede wrote:
> Since commit 6037802bbae8 ("power: supply: core: implement extension API")
> there is the following ABBA deadlock (simplified) between the LED trigger
> code and the power-supply code:
> 
> 1) When registering a power-supply class device, power_supply_register()
> calls led_trigger_register() from power_supply_create_triggers() in
> a scoped_guard(rwsem_read, &psy->extensions_sem) context.
> led_trigger_register() then in turn takes a LED subsystem lock.
> So here we have the following locking order:
> 
> * Read-lock extensions_sem
> * Lock LED subsystem lock(s)
> 
> 2) When registering a LED class device, with its default trigger set
> to a power-supply LED trigger (which has already been registered)
> The LED class code calls power_supply_led_trigger_activate() when
> setting up the default trigger. power_supply_led_trigger_activate()
> calls power_supply_get_property() to determine the initial value of
> to assign to the LED and that read-locks extensions_sem. So now we
> have the following locking order:
> 
> * Lock LED subsystem lock(s)
> * Read-lock extensions_sem
> 
> Fixing this is easy, there is no need to hold the extensions_sem when
> calling power_supply_create_triggers() since all triggers are always
> created rather then checking for the presence of certain attributes as
> power_supply_add_hwmon_sysfs() does. Move power_supply_create_triggers()
> out of the guard block to fix this.

<snip>

> Fixes: 6037802bbae8 ("power: supply: core: implement extension API")
> Cc: Thomas Weißschuh <linux@xxxxxxxxxxxxxx>
> Cc: Armin Wolf <W_Armin@xxxxxx>
> Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>

Thanks!
Reviewed-by: Thomas Weißschuh <linux@xxxxxxxxxxxxxx>




[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux