Messages in this thread Patch in this message | | | From | Jonathan Toppins <> | Subject | Re: [PATCHv2 net] bonding: fix missed rcu protection | Date | Tue, 17 May 2022 13:32:58 -0400 |
| |
Signed-off-by: Jonathan Toppins <jtoppins@redhat.com> --- RESEND, list still didn't receive my last version
The diffstat is slightly larger but IMO a slightly more readable version. When I was reading v2 I found myself jumping around. I only compile tested it, so YMMV.
If this amount of change is too much v2 from Hangbin looks correct to me.
drivers/net/bonding/bond_main.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-)
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 38e152548126..f9d27b63c454 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -5591,23 +5591,32 @@ static int bond_ethtool_get_ts_info(struct net_device *bond_dev, const struct ethtool_ops *ops; struct net_device *real_dev; struct phy_device *phydev; + int ret = 0; + rcu_read_lock(); real_dev = bond_option_active_slave_get_rcu(bond); - if (real_dev) { - ops = real_dev->ethtool_ops; - phydev = real_dev->phydev; - - if (phy_has_tsinfo(phydev)) { - return phy_ts_info(phydev, info); - } else if (ops->get_ts_info) { - return ops->get_ts_info(real_dev, info); - } - } + if (real_dev) + dev_hold(real_dev); + rcu_read_unlock(); + + if (!real_dev) + goto software; + ops = real_dev->ethtool_ops; + phydev = real_dev->phydev; + + if (phy_has_tsinfo(phydev)) + ret = phy_ts_info(phydev, info); + else if (ops->get_ts_info) + ret = ops->get_ts_info(real_dev, info); + + dev_put(real_dev); + return ret; + +software: info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE | SOF_TIMESTAMPING_SOFTWARE; info->phc_index = -1; - return 0; } -- 2.27.0
| |