All of lore.kernel.org
 help / color / mirror / Atom feed
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 v15 13/14] net: ethtool: tsinfo: Add support for hwtstamp provider and get/set hwtstamp config
Date: Mon, 17 Jun 2024 18:43:31 -0700	[thread overview]
Message-ID: <20240617184331.0ddfd08e@kernel.org> (raw)
In-Reply-To: <20240612-feature_ptp_netnext-v15-13-b2a086257b63@bootlin.com>

On Wed, 12 Jun 2024 17:04:13 +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.

Could you split this up, a little bit? It's rather large for a core
change.

>  Desired behavior is passed into the kernel and to a specific device by
> -calling ioctl(SIOCSHWTSTAMP) with a pointer to a struct ifreq whose
> -ifr_data points to a struct hwtstamp_config. The tx_type and
> -rx_filter are hints to the driver what it is expected to do. If
> -the requested fine-grained filtering for incoming packets is not
> +calling the tsinfo netlink socket ETHTOOL_MSG_TSINFO_SET.
> +The ETHTOOL_A_TSINFO_TX_TYPES, ETHTOOL_A_TSINFO_RX_FILTERS and
> +ETHTOOL_A_TSINFO_HWTSTAMP_FLAGS netlink attributes are then used to set the
> +struct hwtstamp_config accordingly.

nit: EHTOOL_A* defines in `` `` quotes?

> +		if (hwtstamp && ptp_clock_phydev(hwtstamp->ptp) == phydev) {
> +			rcu_assign_pointer(dev->hwtstamp, NULL);
> +			synchronize_rcu();
>  			kfree(hwtstamp);

Could you add an rcu_head to this struct and use kfree_rcu()
similarly later use an rcu call to do the dismantle?
synchronize_rcu() can be slow.

> +enum {
> +	ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_UNSPEC,
> +	ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_INDEX,		/* u32 */
> +	ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_QUALIFIER,		/* u32 */
> +
> +	__ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_CNT,
> +	ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_MAX = (__ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_CNT - 1)
> +};
> +
>  

nit: double new line

> +const struct nla_policy ethnl_tsinfo_get_policy[ETHTOOL_A_TSINFO_MAX + 1] = {
>  	[ETHTOOL_A_TSINFO_HEADER]		=
>  		NLA_POLICY_NESTED(ethnl_header_policy_stats),
> +	[ETHTOOL_A_TSINFO_GHWTSTAMP] =
> +		NLA_POLICY_MAX(NLA_U8, 1),

I think this can be an NLA_FLAG, but TBH I'm also confused about 
the semantics. Can you explain what it does from user perspective?

> +	[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER] =
> +		NLA_POLICY_NESTED(ethnl_tsinfo_hwtstamp_provider_policy),
>  };
>  
> +static int tsinfo_parse_hwtstamp_provider(const struct nlattr *nest,
> +					  struct hwtst_provider *hwtst,
> +					  struct netlink_ext_ack *extack,
> +					  bool *mod)
> +{
> +	struct nlattr *tb[ARRAY_SIZE(ethnl_tsinfo_hwtstamp_provider_policy)];

Could you find a more sensible name for this policy?

> +	int ret;
> +
> +	ret = nla_parse_nested(tb,
> +			       ARRAY_SIZE(ethnl_tsinfo_hwtstamp_provider_policy) - 1,
> +			       nest,
> +			       ethnl_tsinfo_hwtstamp_provider_policy, extack);
> +	if (ret < 0)
> +		return ret;
> +
> +	if (NL_REQ_ATTR_CHECK(extack, nest, tb, ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_INDEX) ||
> +	    NL_REQ_ATTR_CHECK(extack, nest, tb, ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_QUALIFIER))

nit: wrap at 80 chars, if you can, please

> +		return -EINVAL;
> +
> +	ethnl_update_u32(&hwtst->index,
> +			 tb[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_INDEX],
> +			 mod);
> +	ethnl_update_u32(&hwtst->qualifier,
> +			 tb[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_QUALIFIER],
> +			 mod);
> +
> +	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;
> +
> +	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 is wrong AFAICT, everything up to this point was a nit pick ;)
Please take a look at 89e281ebff72e6, I think you're reintroducing a
form of the same bug. If ETHTOOL_FLAG_STATS was set, you gotta run stats
init.

Perhaps you can move the stats getting up, and turn this code into if
/ else if / else, without the goto.

> +int ethnl_tsinfo_dumpit(struct sk_buff *skb, struct netlink_callback *cb)
> +{
> +	struct ethnl_tsinfo_dump_ctx *ctx = (void *)cb->ctx;
> +	struct net *net = sock_net(skb->sk);
> +	struct net_device *dev;
> +	int ret = 0;
> +
> +	rtnl_lock();
> +	if (ctx->req_info->base.dev) {
> +		ret = ethnl_tsinfo_dump_one_dev(skb,
> +						ctx->req_info->base.dev,
> +						cb);
> +	} else {
> +		for_each_netdev_dump(net, dev, ctx->pos_ifindex) {
> +			ret = ethnl_tsinfo_dump_one_dev(skb, dev, cb);
> +			if (ret < 0 && ret != -EOPNOTSUPP)
> +				break;
> +			ctx->pos_phcindex = 0;
> +		}
> +	}
> +	rtnl_unlock();
> +
> +	if (ret == -EMSGSIZE && skb->len)
> +		return skb->len;
> +	return ret;

You can just return ret without the if converting to skb->len
af_netlink will handle the EMSGSIZE errors in the same way.

  reply	other threads:[~2024-06-18  1:43 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-12 15:04 [PATCH net-next v15 00/14] net: Make timestamping selectable Kory Maincent
2024-06-12 15:04 ` [PATCH net-next v15 01/14] net_tstamp: Add TIMESTAMPING SOFTWARE and HARDWARE mask Kory Maincent
2024-06-12 15:04 ` [PATCH net-next v15 02/14] net: Move dev_set_hwtstamp_phylib to net/core/dev.h Kory Maincent
2024-06-18  1:26   ` Jakub Kicinski
2024-06-12 15:04 ` [PATCH net-next v15 03/14] net: Make dev_get_hwtstamp_phylib accessible Kory Maincent
2024-06-12 15:04 ` [PATCH net-next v15 04/14] net: Make net_hwtstamp_validate accessible Kory Maincent
2024-06-18  1:26   ` Jakub Kicinski
2024-06-12 15:04 ` [PATCH net-next v15 05/14] net: Change the API of PHY default timestamp to MAC Kory Maincent
2024-06-12 15:04 ` [PATCH net-next v15 06/14] net: net_tstamp: Add unspec field to hwtstamp_source enumeration Kory Maincent
2024-06-12 15:04 ` [PATCH net-next v15 07/14] net: Add struct kernel_ethtool_ts_info Kory Maincent
2024-06-14 14:02   ` Paolo Abeni
2024-06-14 17:46     ` Russell King (Oracle)
2024-06-12 15:04 ` [PATCH net-next v15 08/14] ptp: Add phc source and helpers to register specific PTP clock or get information Kory Maincent
2024-06-12 15:04 ` [PATCH net-next v15 09/14] net: Add the possibility to support a selected hwtstamp in netdevice Kory Maincent
2024-06-12 15:04 ` [PATCH net-next v15 10/14] net: netdevsim: ptp_mock: Convert to netdev_ptp_clock_register Kory Maincent
2024-06-12 15:04 ` [PATCH net-next v15 11/14] net: macb: " Kory Maincent
2024-06-12 15:04 ` [PATCH net-next v15 12/14] net: ptp: Move ptp_clock_index() to builtin symbol Kory Maincent
2024-06-12 15:04 ` [PATCH net-next v15 13/14] net: ethtool: tsinfo: Add support for hwtstamp provider and get/set hwtstamp config Kory Maincent
2024-06-18  1:43   ` Jakub Kicinski [this message]
2024-06-21  8:54     ` Kory Maincent
2024-06-21 15:56       ` Jakub Kicinski
2024-06-21 16:25         ` Kory Maincent
2024-06-12 15:04 ` [PATCH net-next v15 14/14] netlink: specs: tsinfo: Enhance netlink attributes and add a set command Kory Maincent
2024-06-18  1:50 ` [PATCH net-next v15 00/14] net: Make timestamping selectable 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=20240617184331.0ddfd08e@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.