On Tue, Apr 30, 2024 at 05:49:55PM +0200, Kory Maincent wrote: > Enhance 'get' command to retrieve tsinfo of hwtstamp providers within a > network topology and read current hwtstamp configuration. > > Introduce support for ETHTOOL_MSG_TSINFO_SET ethtool netlink socket to > configure hwtstamp of a PHC provider. Note that simultaneous hwtstamp > isn't supported; configuring a new one disables the previous setting. > > Also, add support for a specific dump command to retrieve all hwtstamp > providers within the network topology, with added functionality for > filtered dump to target a single interface. > > Signed-off-by: Kory Maincent <kory.maincent@xxxxxxxxxxx> ... > diff --git a/net/core/dev_ioctl.c b/net/core/dev_ioctl.c > index acb0cadb7512..ec6dd81a5add 100644 > --- a/net/core/dev_ioctl.c > +++ b/net/core/dev_ioctl.c > @@ -270,10 +270,13 @@ static int dev_eth_ioctl(struct net_device *dev, > int dev_get_hwtstamp_phylib(struct net_device *dev, > struct kernel_hwtstamp_config *cfg) > { > - if (dev->hwtstamp) { > - struct ptp_clock *ptp = dev->hwtstamp->ptp; > + struct hwtstamp_provider *hwtstamp; > > - cfg->qualifier = dev->hwtstamp->qualifier; > + hwtstamp = rtnl_dereference(dev->hwtstamp); > + if (hwtstamp) { > + struct ptp_clock *ptp = hwtstamp->ptp; > + > + cfg->qualifier = hwtstamp->qualifier; > if (ptp_clock_from_phylib(ptp)) > return phy_hwtstamp_get(ptp_clock_phydev(ptp), cfg); > > @@ -340,13 +343,15 @@ int dev_set_hwtstamp_phylib(struct net_device *dev, > { > const struct net_device_ops *ops = dev->netdev_ops; > struct kernel_hwtstamp_config old_cfg = {}; > + struct hwtstamp_provider *hwtstamp; > struct phy_device *phydev; > bool changed = false; > bool phy_ts; > int err; > > - if (dev->hwtstamp) { > - struct ptp_clock *ptp = dev->hwtstamp->ptp; > + hwtstamp = rtnl_dereference(dev->hwtstamp); > + if (hwtstamp) { > + struct ptp_clock *ptp = hwtstamp->ptp; > > if (ptp_clock_from_phylib(ptp)) { > phy_ts = true; Hi Kory, A few lines beyond this hunk, within the "if (hwtstamp)" block, is the following: cfg->qualifier = dev->hwtstamp->qualifier; Now that dev->hwtstamp is managed using RCU, I don't think it is correct to dereference it directly like this. Rather, the hwtstamp local variable, which has rcu_dereference'd this pointer should be used: cfg->qualifier = hwtstamp->qualifier; Flagged by Sparse. ... > diff --git a/net/ethtool/tsinfo.c b/net/ethtool/tsinfo.c ... > +static int ethnl_tsinfo_dump_one_dev(struct sk_buff *skb, struct net_device *dev, > + struct netlink_callback *cb) > +{ > + struct ethnl_tsinfo_dump_ctx *ctx = (void *)cb->ctx; > + struct ptp_clock *ptp; > + int ret; > + > + netdev_for_each_ptp_clock_start(dev, ctx->pos_phcindex, ptp, > + ctx->pos_phcindex) { > + ret = ethnl_tsinfo_dump_one_ptp(skb, dev, cb, ptp); > + if (ret < 0 && ret != -EOPNOTSUPP) > + break; > + ctx->pos_phcqualifier = HWTSTAMP_PROVIDER_QUALIFIER_PRECISE; > + } > + > + return ret; Perhaps it is not possible, but if the loop iterates zero times then ret will be used uninitialised here. Flagged by Smatch. > +} ...