The lock pdata->phy_mutex may not be correctly released if the
function return in these two branches, which may lead to
deadlock if the lock is acquired again.

Cc: cy...@connect.ust.hk
Bugzilla ID: 776

Signed-off-by: Chengfeng Ye <cy...@connect.ust.hk>
---
 drivers/net/axgbe/axgbe_phy_impl.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/axgbe/axgbe_phy_impl.c 
b/drivers/net/axgbe/axgbe_phy_impl.c
index 02236ec192..cf39095ee4 100644
--- a/drivers/net/axgbe/axgbe_phy_impl.c
+++ b/drivers/net/axgbe/axgbe_phy_impl.c
@@ -418,8 +418,10 @@ static int axgbe_phy_get_comm_ownership(struct axgbe_port 
*pdata)
         */
        pthread_mutex_lock(&pdata->phy_mutex);
 
-       if (phy_data->comm_owned)
+       if (phy_data->comm_owned) {
+               pthread_mutex_unlock(&pdata->phy_mutex);
                return 0;
+       }
 
        /* Clear the mutexes */
        XP_IOWRITE(pdata, XP_I2C_MUTEX, AXGBE_MUTEX_RELEASE);
@@ -444,6 +446,7 @@ static int axgbe_phy_get_comm_ownership(struct axgbe_port 
*pdata)
                XP_IOWRITE(pdata, XP_MDIO_MUTEX, mutex_id);
 
                phy_data->comm_owned = 1;
+               pthread_mutex_unlock(&pdata->phy_mutex);
                return 0;
        }
 
-- 
2.17.1

Reply via email to