Patch "soundwire: bus: Fix unbalanced pm_runtime_put() causing usage count underflow" has been added to the 6.3-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

    soundwire: bus: Fix unbalanced pm_runtime_put() causing usage count underflow

to the 6.3-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:
     soundwire-bus-fix-unbalanced-pm_runtime_put-causing-.patch
and it can be found in the queue-6.3 subdirectory.

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



commit 6d39fa5de457ba9000aef8a9843f5e9c69cb16e0
Author: Richard Fitzgerald <rf@xxxxxxxxxxxxxxxxxxxxx>
Date:   Thu Apr 6 14:46:40 2023 +0100

    soundwire: bus: Fix unbalanced pm_runtime_put() causing usage count underflow
    
    [ Upstream commit e9537962519e88969f5f69cd0571eb4f6984403c ]
    
    This reverts commit
    443a98e649b4 ("soundwire: bus: use pm_runtime_resume_and_get()")
    
    Change calls to pm_runtime_resume_and_get() back to pm_runtime_get_sync().
    This fixes a usage count underrun caused by doing a pm_runtime_put() even
    though pm_runtime_resume_and_get() returned an error.
    
    The three affected functions ignore -EACCES error from trying to get
    pm_runtime, and carry on, including a put at the end of the function.
    But pm_runtime_resume_and_get() does not increment the usage count if it
    returns an error. So in the -EACCES case you must not call
    pm_runtime_put().
    
    The documentation for pm_runtime_get_sync() says:
     "Consider using pm_runtime_resume_and_get() ...  as this is likely to
     result in cleaner code."
    
    In this case I don't think it results in cleaner code because the
    pm_runtime_put() at the end of the function would have to be conditional on
    the return value from pm_runtime_resume_and_get() at the top of the
    function.
    
    pm_runtime_get_sync() doesn't have this problem because it always
    increments the count, so always needs a put. The code can just flow through
    and do the pm_runtime_put() unconditionally.
    
    Signed-off-by: Richard Fitzgerald <rf@xxxxxxxxxxxxxxxxxxxxx>
    Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@xxxxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230406134640.8582-1-rf@xxxxxxxxxxxxxxxxxxxxx
    Signed-off-by: Vinod Koul <vkoul@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c
index b6aca59c31300..7fd99e581a574 100644
--- a/drivers/soundwire/bus.c
+++ b/drivers/soundwire/bus.c
@@ -546,9 +546,11 @@ int sdw_nread(struct sdw_slave *slave, u32 addr, size_t count, u8 *val)
 {
 	int ret;
 
-	ret = pm_runtime_resume_and_get(&slave->dev);
-	if (ret < 0 && ret != -EACCES)
+	ret = pm_runtime_get_sync(&slave->dev);
+	if (ret < 0 && ret != -EACCES) {
+		pm_runtime_put_noidle(&slave->dev);
 		return ret;
+	}
 
 	ret = sdw_nread_no_pm(slave, addr, count, val);
 
@@ -570,9 +572,11 @@ int sdw_nwrite(struct sdw_slave *slave, u32 addr, size_t count, const u8 *val)
 {
 	int ret;
 
-	ret = pm_runtime_resume_and_get(&slave->dev);
-	if (ret < 0 && ret != -EACCES)
+	ret = pm_runtime_get_sync(&slave->dev);
+	if (ret < 0 && ret != -EACCES) {
+		pm_runtime_put_noidle(&slave->dev);
 		return ret;
+	}
 
 	ret = sdw_nwrite_no_pm(slave, addr, count, val);
 
@@ -1541,9 +1545,10 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave)
 
 	sdw_modify_slave_status(slave, SDW_SLAVE_ALERT);
 
-	ret = pm_runtime_resume_and_get(&slave->dev);
+	ret = pm_runtime_get_sync(&slave->dev);
 	if (ret < 0 && ret != -EACCES) {
 		dev_err(&slave->dev, "Failed to resume device: %d\n", ret);
+		pm_runtime_put_noidle(&slave->dev);
 		return ret;
 	}
 



[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