On 9/19/2019 12:01 PM, Pallantla Poornima wrote: > One issue caught by Coverity 340835 > *unlock: axgbe_phy_set_mode unlocks pdata->phy_mutex > *double_unlock: axgbe_phy_sfp_detect unlocks pdata->phy_mutex > while it is unlocked. > > In axgbe_phy_sfp_detect()/axgbe_phy_set_redrv_mode(), > axgbe_phy_get_comm_ownership() and axgbe_phy_put_comm_ownership() > are invoked subsequently. > > Currently in axgbe_phy_get_comm_ownership(), during one of the case > 'phy_data->comm_owned' is not protected and before returning 0, > lock is not called and unlock is called in axgbe_phy_put_comm_ownership() > directly which is incorrect. > > Ideally, the variable 'phy_data->comm_owned' needs to be protected. > During success scenario, lock is called in axgbe_phy_get_comm_ownership() > followed by unlock in axgbe_phy_put_comm_ownership(). > In failure case, unlock is invoked in axgbe_phy_get_comm_ownership() > itself appropriately. > > The fix is to protect 'phy_data->comm_owned' in the identified case > ensuring locks/unlocks properly exist. > > Coverity issue: 340835 > Fixes: a5c7273771 ("net/axgbe: add phy programming APIs") > Cc: sta...@dpdk.org > > Signed-off-by: Pallantla Poornima <pallantlax.poorn...@intel.com>
lgtm, 'axgbe_phy_put_comm_ownership()' expects 'axgbe_phy_get_comm_ownership()' gets the lock. Thanks for fixing the coverity issue. But still, Ravi can you please review/test the patch? Thanks, ferruh > --- > drivers/net/axgbe/axgbe_phy_impl.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/axgbe/axgbe_phy_impl.c > b/drivers/net/axgbe/axgbe_phy_impl.c > index 973177f69..2267c5f81 100644 > --- a/drivers/net/axgbe/axgbe_phy_impl.c > +++ b/drivers/net/axgbe/axgbe_phy_impl.c > @@ -412,15 +412,15 @@ static int axgbe_phy_get_comm_ownership(struct > axgbe_port *pdata) > uint64_t timeout; > unsigned int mutex_id; > > - if (phy_data->comm_owned) > - return 0; > - > /* The I2C and MDIO/GPIO bus is multiplexed between multiple devices, > * the driver needs to take the software mutex and then the hardware > * mutexes before being able to use the busses. > */ > pthread_mutex_lock(&pdata->phy_mutex); > > + if (phy_data->comm_owned) > + return 0; > + > /* Clear the mutexes */ > XP_IOWRITE(pdata, XP_I2C_MUTEX, AXGBE_MUTEX_RELEASE); > XP_IOWRITE(pdata, XP_MDIO_MUTEX, AXGBE_MUTEX_RELEASE); >