From: Florian Fainelli <f.fainelli@gmail.com>
To: Russell King <rmk+kernel@arm.linux.org.uk>,
"David S. Miller" <davem@davemloft.net>
Cc: netdev@vger.kernel.org
Subject: Re: [PATCH] net: phy: add locking to phy_read_mmd_indirect()/phy_write_mmd_indirect()
Date: Tue, 25 Aug 2015 07:08:24 -0700 [thread overview]
Message-ID: <55DC76D8.4090500@gmail.com> (raw)
In-Reply-To: <E1ZU9vP-0004nN-LW@rmk-PC.arm.linux.org.uk>
Le 08/25/15 01:49, Russell King a écrit :
> The phy layer is missing locking for the above two functions - it
> has been observed that two threads (userspace and the phy worker
> thread) can race, entering the bus ->write or ->read functions
> simultaneously.
>
> This causes the FEC driver to initialise a completion while another
> thread is waiting on it or while the interrupt is calling complete()
> on it, which causes spinlock unlock-without-lock, spinlock lockups,
> and completion timeouts.
>
> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Acked-by: Florian Fainelli <f.fainelli@gmail.com>
Fixes: a59a4d192 ("phy: add the EEE support and the way to access to the
MMD registers.")
Fixes: 0c1d77dfb ("net: libphy: Add phy specific function to access mmd
phy registers")
Thanks!
> ---
> drivers/net/phy/phy.c | 16 ++++++++++++----
> 1 file changed, 12 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
> index 1e1fbb049ec6..34fe339f4e80 100644
> --- a/drivers/net/phy/phy.c
> +++ b/drivers/net/phy/phy.c
> @@ -1038,10 +1038,14 @@ int phy_read_mmd_indirect(struct phy_device *phydev, int prtad,
> int value = -1;
>
> if (phydrv->read_mmd_indirect == NULL) {
> - mmd_phy_indirect(phydev->bus, prtad, devad, addr);
> + struct mii_bus *bus = phydev->bus;
> +
> + mutex_lock(&bus->mdio_lock);
> + mmd_phy_indirect(bus, prtad, devad, addr);
>
> /* Read the content of the MMD's selected register */
> - value = phydev->bus->read(phydev->bus, addr, MII_MMD_DATA);
> + value = bus->read(bus, addr, MII_MMD_DATA);
> + mutex_unlock(&bus->mdio_lock);
> } else {
> value = phydrv->read_mmd_indirect(phydev, prtad, devad, addr);
> }
> @@ -1071,10 +1075,14 @@ void phy_write_mmd_indirect(struct phy_device *phydev, int prtad,
> struct phy_driver *phydrv = phydev->drv;
>
> if (phydrv->write_mmd_indirect == NULL) {
> - mmd_phy_indirect(phydev->bus, prtad, devad, addr);
> + struct mii_bus *bus = phydev->bus;
> +
> + mutex_lock(&bus->mdio_lock);
> + mmd_phy_indirect(bus, prtad, devad, addr);
>
> /* Write the data into MMD's selected register */
> - phydev->bus->write(phydev->bus, addr, MII_MMD_DATA, data);
> + bus->write(bus, addr, MII_MMD_DATA, data);
> + mutex_unlock(&bus->mdio_lock);
> } else {
> phydrv->write_mmd_indirect(phydev, prtad, devad, addr, data);
> }
>
--
Florian
next parent reply other threads:[~2015-08-25 14:08 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <E1ZU9vP-0004nN-LW@rmk-PC.arm.linux.org.uk>
2015-08-25 14:08 ` Florian Fainelli [this message]
2015-08-25 14:18 ` [PATCH] net: phy: add locking to phy_read_mmd_indirect()/phy_write_mmd_indirect() Russell King - ARM Linux
2015-08-25 23:31 ` David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=55DC76D8.4090500@gmail.com \
--to=f.fainelli@gmail.com \
--cc=davem@davemloft.net \
--cc=netdev@vger.kernel.org \
--cc=rmk+kernel@arm.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.