From: "Russell King (Oracle)" <linux@armlinux.org.uk>
To: Jakub Kicinski <kuba@kernel.org>
Cc: Andrew Lunn <andrew@lunn.ch>,
Heiner Kallweit <hkallweit1@gmail.com>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Paolo Abeni <pabeni@redhat.com>,
Dan Carpenter <dan.carpenter@linaro.org>,
Oleksij Rempel <linux@rempel-privat.de>,
netdev@vger.kernel.org
Subject: Re: [PATCH net-next] net: phylib: fix phy_read*_poll_timeout()
Date: Fri, 2 Jun 2023 17:17:59 +0100 [thread overview]
Message-ID: <ZHoWN0uO30P/y9hv@shell.armlinux.org.uk> (raw)
In-Reply-To: <20230602090539.6a4fa374@kernel.org>
On Fri, Jun 02, 2023 at 09:05:39AM -0700, Jakub Kicinski wrote:
> On Fri, 2 Jun 2023 09:53:09 +0100 Russell King (Oracle) wrote:
> > > Yes it is :) All this to save the single line of assignment
> > > after the read_poll_timeout() "call" ?
> >
> > Okay, so it seems you don't like it. We can't fix it then, and we'll
> > have to go with the BUILD_BUG_ON() forcing all users to use a signed
> > varable (which better be larger than a s8 so negative errnos can fit)
> > or we just rely on Dan to report the problems.
>
> Wait, did the version I proposed not work?
>
> https://lore.kernel.org/all/20230530121910.05b9f837@kernel.org/
If we're into the business of throwing web URLs at each other for
messages we've already read, here's my one for you which contains
the explanation why your one is broken, and proposing my solution.
https://lore.kernel.org/all/ZHZmBBDSVMf1WQWI@shell.armlinux.org.uk/
To see exactly why yours is broken, see the paragraph starting
"The elephant in the room..."
If it needs yet more explanation, which clearly it does, then let's
look at what genphy_loopback is doing:
ret = phy_read_poll_timeout(phydev, MII_BMSR, val,
val & BMSR_LSTATUS,
5000, 500000, true);
Now, with your supposed "fix" of:
+ int __ret, __val; \
+ \
+ __ret = read_poll_timeout(phy_read, __val, __val < 0 || (cond), \
sleep_us, timeout_us, sleep_before_read, phydev, regnum); \
This ends up being:
int __ret, __val;
__ret = read_poll_timeout(phy_read, __val, __val < 0 || (val & BMSR_LSTATUS),
sleep_us, timeout_us, sleep_before_read, phydev, regnum);
and that expands to something that does this:
__val = phy_read(phydev, regnum);
if (__val < 0 || (val & BMSR_LSTATUS))
break;
Can you spot the bug yet? Where does "val" for the test "val & BMSR_LSTATUS"
come from?
A bigger hint. With the existing code, this would have been:
val = phy_read(phydev, regnum);
if (val < 0 || (val & BMSR_LSTATUS))
break;
See the difference? val & BMSR_LSTATUS is checking the value that was
returned from phy_read() here, but in yours, it's checking an
uninitialised variable.
With my proposal, this becomes:
val = __val = phy_read(phydev, regnum);
if (__val < 0 || (val & BMSR_LSTATUS))
break;
where "val" is whatever type the user chose, which has absolutely _no_
bearing what so ever on whether the test for __val < 0 can be correctly
evaluated, and makes that test totally independent of whatever type the
user chose.
--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!
next prev parent reply other threads:[~2023-06-02 16:18 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-01 15:48 [PATCH net-next] net: phylib: fix phy_read*_poll_timeout() Russell King (Oracle)
2023-06-02 4:33 ` Jakub Kicinski
2023-06-02 4:35 ` Jakub Kicinski
2023-06-02 8:53 ` Russell King (Oracle)
2023-06-02 16:05 ` Jakub Kicinski
2023-06-02 16:17 ` Russell King (Oracle) [this message]
2023-06-02 16:34 ` Russell King (Oracle)
2023-06-02 17:10 ` Jakub Kicinski
2023-06-03 6:40 ` patchwork-bot+netdevbpf
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=ZHoWN0uO30P/y9hv@shell.armlinux.org.uk \
--to=linux@armlinux.org.uk \
--cc=andrew@lunn.ch \
--cc=dan.carpenter@linaro.org \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=hkallweit1@gmail.com \
--cc=kuba@kernel.org \
--cc=linux@rempel-privat.de \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).