From: Jakub Kicinski <kuba@kernel.org>
To: Kory Maincent <kory.maincent@bootlin.com>
Cc: Florian Fainelli <florian.fainelli@broadcom.com>,
Broadcom internal kernel review list
<bcm-kernel-feedback-list@broadcom.com>,
Andrew Lunn <andrew@lunn.ch>,
Heiner Kallweit <hkallweit1@gmail.com>,
Russell King <linux@armlinux.org.uk>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Paolo Abeni <pabeni@redhat.com>,
Richard Cochran <richardcochran@gmail.com>,
Radu Pirea <radu-nicolae.pirea@oss.nxp.com>,
Jay Vosburgh <j.vosburgh@gmail.com>,
Andy Gospodarek <andy@greyhouse.net>,
Nicolas Ferre <nicolas.ferre@microchip.com>,
Claudiu Beznea <claudiu.beznea@tuxon.dev>,
Willem de Bruijn <willemdebruijn.kernel@gmail.com>,
Jonathan Corbet <corbet@lwn.net>,
Horatiu Vultur <horatiu.vultur@microchip.com>,
UNGLinuxDriver@microchip.com, Simon Horman <horms@kernel.org>,
Vladimir Oltean <vladimir.oltean@nxp.com>,
Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-doc@vger.kernel.org,
Maxime Chevallier <maxime.chevallier@bootlin.com>,
Rahul Rameshbabu <rrameshbabu@nvidia.com>
Subject: Re: [PATCH net-next v9 12/13] net: ethtool: tsinfo: Add support for hwtstamp provider and get/set hwtstamp config
Date: Mon, 4 Mar 2024 19:27:33 -0800 [thread overview]
Message-ID: <20240304192733.1e8e08cc@kernel.org> (raw)
In-Reply-To: <20240226-feature_ptp_netnext-v9-12-455611549f21@bootlin.com>
On Mon, 26 Feb 2024 14:40:03 +0100 Kory Maincent wrote:
> diff --git a/net/ethtool/common.c b/net/ethtool/common.c
> index b3f45c307301..37071929128a 100644
> --- a/net/ethtool/common.c
> +++ b/net/ethtool/common.c
> @@ -426,6 +426,7 @@ const char sof_timestamping_names[][ETH_GSTRING_LEN] = {
> [const_ilog2(SOF_TIMESTAMPING_OPT_TX_SWHW)] = "option-tx-swhw",
> [const_ilog2(SOF_TIMESTAMPING_BIND_PHC)] = "bind-phc",
> [const_ilog2(SOF_TIMESTAMPING_OPT_ID_TCP)] = "option-id-tcp",
> + [const_ilog2(SOF_TIMESTAMPING_GHWTSTAMP)] = "get-hwtstamp",
What is this new SOF_TIMESTAMPING_GHWTSTAMP? If there's
a good reason for it to exist it should be documented in
Documentation/networking/timestamping.rst
> +const struct nla_policy ethnl_tsinfo_get_policy[ETHTOOL_A_TSINFO_MAX + 1] = {
> [ETHTOOL_A_TSINFO_HEADER] =
> NLA_POLICY_NESTED(ethnl_header_policy),
> + [ETHTOOL_A_TSINFO_TIMESTAMPING] = { .type = NLA_NESTED },
> + [ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_NEST] = { .type = NLA_NESTED },
link the policy by NLA_POLICY_NESTED() so that user space can inspect
the sub-layers via the control family.
> };
>
> +static int
> +tsinfo_parse_request(struct ethnl_req_info *req_base, struct nlattr **tb,
> + struct netlink_ext_ack *extack)
> +{
> + struct nlattr *hwtst_tb[ARRAY_SIZE(ethnl_tsinfo_hwtstamp_provider_policy)];
> + struct tsinfo_req_info *req = TSINFO_REQINFO(req_base);
> + unsigned long val = 0, mask = 0;
> + int ret;
> +
> + req->hwtst.index = -1;
> +
> + if (tb[ETHTOOL_A_TSINFO_TIMESTAMPING]) {
> + ret = ethnl_parse_bitset(&val, &mask, __SOF_TIMESTAMPING_CNT,
> + tb[ETHTOOL_A_TSINFO_TIMESTAMPING],
> + sof_timestamping_names, extack);
> + if (ret < 0)
> + return ret;
> +
> + if (val & SOF_TIMESTAMPING_GHWTSTAMP) {
> + /* We support only the get of the current hwtstamp config
> + * for now.
> + */
> + if (tb[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_NEST])
NL_SET_ERR_MSG_ATTR(...)
> + return -EOPNOTSUPP;
> +
> + req->get_hwtstamp = true;
> + return 0;
> + }
> + }
> +
> + if (!tb[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_NEST])
> + return 0;
> +
> + ret = nla_parse_nested(hwtst_tb,
> + ARRAY_SIZE(ethnl_tsinfo_hwtstamp_provider_policy) - 1,
> + tb[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_NEST],
> + ethnl_tsinfo_hwtstamp_provider_policy, extack);
> + if (ret < 0)
> + return ret;
> +
> + if (!hwtst_tb[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_INDEX] ||
> + !hwtst_tb[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_QUALIFIER])
> + return -EINVAL;
NL_REQ_ATTR_CHECK()
> + ret = nla_get_u32(hwtst_tb[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_INDEX]);
> + if (ret < 0)
> + return -EINVAL;
How's the get_u32 going to return a negative value?
That's the purpose of this check?
The policy should contain the max expected value - NLA_POLICY_MAX().
> + req->hwtst.index = ret;
> +
> + ret = nla_get_u32(hwtst_tb[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_QUALIFIER]);
> + if (ret < 0 || HWTSTAMP_PROVIDER_QUALIFIER_CNT <= ret)
> + return -EINVAL;
> + req->hwtst.qualifier = ret;
> +
> + return 0;
> +}
> +
> static int tsinfo_prepare_data(const struct ethnl_req_info *req_base,
> struct ethnl_reply_data *reply_base,
> const struct genl_info *info)
> {
> struct tsinfo_reply_data *data = TSINFO_REPDATA(reply_base);
> + struct tsinfo_req_info *req = TSINFO_REQINFO(req_base);
> struct net_device *dev = reply_base->dev;
> int ret;
>
> ret = ethnl_ops_begin(dev);
> if (ret < 0)
> return ret;
> - ret = __ethtool_get_ts_info(dev, &data->ts_info);
> +
> + if (!netif_device_present(dev)) {
ethnl_ops_begin() checks for presence
> + ret = -ENODEV;
> + goto out;
> + }
> +
> + if (req->get_hwtstamp) {
> + struct kernel_hwtstamp_config cfg = {};
> +
> + if (!dev->netdev_ops->ndo_hwtstamp_get) {
> + ret = -EOPNOTSUPP;
> + goto out;
> + }
> +
> + ret = dev_get_hwtstamp_phylib(dev, &cfg);
> + data->hwtst_config.tx_type = BIT(cfg.tx_type);
> + data->hwtst_config.rx_filter = BIT(cfg.rx_filter);
> + data->hwtst_config.flags = BIT(cfg.flags);
> + goto out;
> + }
This goto could be an else
> + if (req->hwtst.index != -1) {
> + struct hwtstamp_provider hwtstamp;
> +
> + hwtstamp.ptp = ptp_clock_get_by_index(req->hwtst.index);
> + if (!hwtstamp.ptp) {
> + ret = -ENODEV;
> + goto out;
> + }
> + hwtstamp.qualifier = req->hwtst.qualifier;
> +
> + ret = ethtool_get_ts_info_by_phc(dev, &data->ts_info,
> + &hwtstamp);
> + } else {
> + ret = __ethtool_get_ts_info(dev, &data->ts_info);
Not sure I grok why we need 3 forms of getting the tstamp config.
Please make sure to always update
Documentation/networking/ethtool-netlink.rst
when extending ethtool-nl.
> + }
> +
> +out:
> ethnl_ops_complete(dev);
>
> return ret;
> }
> + if (ts_info->phc_index >= 0) {
> + /* _TSINFO_HWTSTAMP_PROVIDER_NEST */
> + len += nla_total_size(sizeof(u32) * 2);
That translates to two raw u32s into a single attribute.
Is that what you mean?
> len += nla_total_size(sizeof(u32)); /* _TSINFO_PHC_INDEX */
> + }
>
> return len;
> }
>
> + if (ts_info->phc_index >= 0) {
> + ret = nla_put_u32(skb, ETHTOOL_A_TSINFO_PHC_INDEX,
> + ts_info->phc_index);
> + if (ret)
> + return -EMSGSIZE;
> +
> + nest = nla_nest_start(skb, ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_NEST);
> + if (!nest)
> + return -EMSGSIZE;
> +
> + ret = nla_put_u32(skb,
> + ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_INDEX,
> + ts_info->phc_index);
You can assume nla_put_u32 only returns EMSGSIZE, so doing:
if (nla_put_u32(....) ||
nla_put_u32(....))
return -EMSGSIZE;
is generally considered to be fine.
> + if (ret) {
> + nla_nest_cancel(skb, nest);
> + return ret;
> + }
> +
> + ret = nla_put_u32(skb,
> + ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_QUALIFIER,
> + ts_info->phc_qualifier);
> + if (ret) {
> + nla_nest_cancel(skb, nest);
> + return ret;
> + }
> +
> + nla_nest_end(skb, nest);
> + }
> + return 0;
> +}
> +static int ethnl_set_tsinfo(struct ethnl_req_info *req_base,
> + struct genl_info *info)
> +{
> + struct nlattr *hwtst_tb[ARRAY_SIZE(ethnl_tsinfo_hwtstamp_provider_policy)];
> + unsigned long mask = 0, req_rx_filter, req_tx_type;
> + struct kernel_hwtstamp_config hwtst_config = {0};
> + struct net_device *dev = req_base->dev;
> + struct hwtstamp_provider hwtstamp;
> + struct nlattr **tb = info->attrs;
> + int ret, phc_index = 0;
> + bool mod = false;
> +
> + BUILD_BUG_ON(__HWTSTAMP_TX_CNT > 32);
> + BUILD_BUG_ON(__HWTSTAMP_FILTER_CNT > 32);
> +
> + if (!netif_device_present(dev))
> + return -ENODEV;
> +
> + if (tb[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_NEST]) {
> + ret = nla_parse_nested(hwtst_tb,
> + ARRAY_SIZE(ethnl_tsinfo_hwtstamp_provider_policy) - 1,
> + tb[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_NEST],
> + ethnl_tsinfo_hwtstamp_provider_policy, info->extack);
> + if (ret < 0)
> + return ret;
> +
> + if (!hwtst_tb[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_INDEX] ||
> + !hwtst_tb[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_QUALIFIER])
> + return -EINVAL;
> +
> + memcpy(&hwtstamp, &dev->hwtstamp, sizeof(hwtstamp));
> + if (hwtstamp.ptp)
> + phc_index = ptp_clock_index(hwtstamp.ptp);
> +
> + ethnl_update_u32(&phc_index,
> + hwtst_tb[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_INDEX],
> + &mod);
> + ethnl_update_u32(&hwtstamp.qualifier,
> + hwtst_tb[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_QUALIFIER],
> + &mod);
> +
> + /* Does the hwtstamp supported in the netdev topology */
> + if (mod) {
> + hwtstamp.ptp = ptp_clock_get_by_index(phc_index);
This just returns a pointer without any refcounting, right?
What guarantees the ptp object doesn't disappear?
> + if (!hwtstamp.ptp)
> + return -ENODEV;
> +
> + if (!netdev_support_hwtstamp(dev, &hwtstamp))
> + return -ENODEV;
these need extacks
> + }
> + }
next prev parent reply other threads:[~2024-03-05 3:27 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-26 13:39 [PATCH net-next v9 00/13] net: Make timestamping selectable Kory Maincent
2024-02-26 13:39 ` [PATCH net-next v9 01/13] net_tstamp: Add TIMESTAMPING SOFTWARE and HARDWARE mask Kory Maincent
2024-02-26 13:39 ` [PATCH net-next v9 02/13] net: Make dev_get_hwtstamp_phylib accessible Kory Maincent
2024-03-05 2:40 ` Jakub Kicinski
2024-03-05 9:56 ` Köry Maincent
2024-03-05 10:02 ` Köry Maincent
2024-03-05 15:05 ` Jakub Kicinski
2024-02-26 13:39 ` [PATCH net-next v9 03/13] net: Make net_hwtstamp_validate accessible Kory Maincent
2024-02-26 13:39 ` [PATCH net-next v9 04/13] net: Change the API of PHY default timestamp to MAC Kory Maincent
2024-02-26 13:39 ` [PATCH net-next v9 05/13] net: net_tstamp: Add unspec field to hwtstamp_source enumeration Kory Maincent
2024-02-26 13:39 ` [PATCH net-next v9 06/13] net: Add struct kernel_ethtool_ts_info Kory Maincent
2024-02-26 16:47 ` Alexandra Winter
2024-02-28 3:27 ` Jakub Kicinski
2024-02-29 9:17 ` Köry Maincent
2024-02-26 13:39 ` [PATCH net-next v9 07/13] ptp: Move from simple ida to xarray Kory Maincent
2024-03-05 2:47 ` Jakub Kicinski
2024-03-05 9:02 ` Köry Maincent
2024-03-05 15:03 ` Jakub Kicinski
2024-02-26 13:39 ` [PATCH net-next v9 08/13] ptp: Add phc source and helpers to register specific PTP clock or get information Kory Maincent
2024-03-05 2:57 ` Jakub Kicinski
2024-03-05 8:36 ` Russell King (Oracle)
2024-03-05 10:10 ` Köry Maincent
2024-03-05 14:59 ` Jakub Kicinski
2024-03-05 15:35 ` Köry Maincent
2024-03-05 16:39 ` Jakub Kicinski
2024-02-26 13:40 ` [PATCH net-next v9 09/13] net: Add the possibility to support a selected hwtstamp in netdevice Kory Maincent
2024-02-26 13:40 ` [PATCH net-next v9 10/13] net: netdevsim: ptp_mock: Convert to netdev_ptp_clock_register Kory Maincent
2024-02-26 13:40 ` [PATCH net-next v9 11/13] net: macb: " Kory Maincent
2024-02-26 13:40 ` [PATCH net-next v9 12/13] net: ethtool: tsinfo: Add support for hwtstamp provider and get/set hwtstamp config Kory Maincent
2024-03-05 3:27 ` Jakub Kicinski [this message]
2024-03-05 16:52 ` Köry Maincent
2024-03-05 18:04 ` Jakub Kicinski
2024-02-26 13:40 ` [PATCH net-next v9 13/13] netlink: specs: tsinfo: Enhance netlink attributes and add a set command Kory Maincent
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=20240304192733.1e8e08cc@kernel.org \
--to=kuba@kernel.org \
--cc=UNGLinuxDriver@microchip.com \
--cc=andrew@lunn.ch \
--cc=andy@greyhouse.net \
--cc=bcm-kernel-feedback-list@broadcom.com \
--cc=claudiu.beznea@tuxon.dev \
--cc=corbet@lwn.net \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=florian.fainelli@broadcom.com \
--cc=hkallweit1@gmail.com \
--cc=horatiu.vultur@microchip.com \
--cc=horms@kernel.org \
--cc=j.vosburgh@gmail.com \
--cc=kory.maincent@bootlin.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=maxime.chevallier@bootlin.com \
--cc=netdev@vger.kernel.org \
--cc=nicolas.ferre@microchip.com \
--cc=pabeni@redhat.com \
--cc=radu-nicolae.pirea@oss.nxp.com \
--cc=richardcochran@gmail.com \
--cc=rrameshbabu@nvidia.com \
--cc=thomas.petazzoni@bootlin.com \
--cc=vladimir.oltean@nxp.com \
--cc=willemdebruijn.kernel@gmail.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 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.