Patch "drivers: ethernet: cpsw: fix panic when interrupt coaleceing is set via ethtool" has been added to the 5.15-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

    drivers: ethernet: cpsw: fix panic when interrupt coaleceing is set via ethtool

to the 5.15-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:
     drivers-ethernet-cpsw-fix-panic-when-interrupt-coale.patch
and it can be found in the queue-5.15 subdirectory.

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



commit c277f16e591a9850749971b6f4fdde3c20e1f319
Author: Sondhauß, Jan <Jan.Sondhauss@xxxxxxxx>
Date:   Wed Mar 23 08:47:33 2022 +0000

    drivers: ethernet: cpsw: fix panic when interrupt coaleceing is set via ethtool
    
    [ Upstream commit 2844e2434385819f674d1fb4130c308c50ba681e ]
    
    cpsw_ethtool_begin directly returns the result of pm_runtime_get_sync
    when successful.
    pm_runtime_get_sync returns -error code on failure and 0 on successful
    resume but also 1 when the device is already active. So the common case
    for cpsw_ethtool_begin is to return 1. That leads to inconsistent calls
    to pm_runtime_put in the call-chain so that pm_runtime_put is called
    one too many times and as result leaving the cpsw dev behind suspended.
    
    The suspended cpsw dev leads to an access violation later on by
    different parts of the cpsw driver.
    
    Fix this by calling the return-friendly pm_runtime_resume_and_get
    function.
    
    Fixes: d43c65b05b84 ("ethtool: runtime-resume netdev parent in ethnl_ops_begin")
    Signed-off-by: Jan Sondhauss <jan.sondhauss@xxxxxxxx>
    Reviewed-by: Vignesh Raghavendra <vigneshr@xxxxxx>
    Link: https://lore.kernel.org/r/20220323084725.65864-1-jan.sondhauss@xxxxxxxx
    Signed-off-by: Jakub Kicinski <kuba@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/ti/cpsw_ethtool.c b/drivers/net/ethernet/ti/cpsw_ethtool.c
index 158c8d3793f4..b5bae6324970 100644
--- a/drivers/net/ethernet/ti/cpsw_ethtool.c
+++ b/drivers/net/ethernet/ti/cpsw_ethtool.c
@@ -364,11 +364,9 @@ int cpsw_ethtool_op_begin(struct net_device *ndev)
 	struct cpsw_common *cpsw = priv->cpsw;
 	int ret;
 
-	ret = pm_runtime_get_sync(cpsw->dev);
-	if (ret < 0) {
+	ret = pm_runtime_resume_and_get(cpsw->dev);
+	if (ret < 0)
 		cpsw_err(priv, drv, "ethtool begin failed %d\n", ret);
-		pm_runtime_put_noidle(cpsw->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