Patch "regulator: core: fix use_count leakage when handling boot-on" has been added to the 5.4-stable tree

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

 



This is a note to let you know that I've just added the patch titled

    regulator: core: fix use_count leakage when handling boot-on

to the 5.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     regulator-core-fix-use_count-leakage-when-handling-b.patch
and it can be found in the queue-5.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit e59c5cf1b56d040d448d1409894048d5ef0d187c
Author: Rui Zhang <zr.zhang@xxxxxxxx>
Date:   Thu Dec 1 11:38:06 2022 +0800

    regulator: core: fix use_count leakage when handling boot-on
    
    [ Upstream commit 0591b14ce0398125439c759f889647369aa616a0 ]
    
    I found a use_count leakage towards supply regulator of rdev with
    boot-on option.
    
    ┌───────────────────┐           ┌───────────────────┐
    │  regulator_dev A  │           │  regulator_dev B  │
    │     (boot-on)     │           │     (boot-on)     │
    │    use_count=0    │◀──supply──│    use_count=1    │
    │                   │           │                   │
    └───────────────────┘           └───────────────────┘
    
    In case of rdev(A) configured with `regulator-boot-on', the use_count
    of supplying regulator(B) will increment inside
    regulator_enable(rdev->supply).
    
    Thus, B will acts like always-on, and further balanced
    regulator_enable/disable cannot actually disable it anymore.
    
    However, B was also configured with `regulator-boot-on', we wish it
    could be disabled afterwards.
    
    Signed-off-by: Rui Zhang <zr.zhang@xxxxxxxx>
    Link: https://lore.kernel.org/r/20221201033806.2567812-1-zr.zhang@xxxxxxxx
    Signed-off-by: Mark Brown <broonie@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index 5dd17a341577..f2214e7c75b3 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -1387,7 +1387,13 @@ static int set_machine_constraints(struct regulator_dev *rdev)
 		if (rdev->supply_name && !rdev->supply)
 			return -EPROBE_DEFER;
 
-		if (rdev->supply) {
+		/* If supplying regulator has already been enabled,
+		 * it's not intended to have use_count increment
+		 * when rdev is only boot-on.
+		 */
+		if (rdev->supply &&
+		    (rdev->constraints->always_on ||
+		     !regulator_is_enabled(rdev->supply))) {
 			ret = regulator_enable(rdev->supply);
 			if (ret < 0) {
 				_regulator_put(rdev->supply);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux