public inbox for linux-doc@vger.kernel.org
 help / color / mirror / Atom feed
From: Jakub Kicinski <kuba@kernel.org>
To: tariqt@nvidia.com
Cc: Jakub Kicinski <kuba@kernel.org>,
	edumazet@google.com, pabeni@redhat.com, andrew+netdev@lunn.ch,
	davem@davemloft.net, donald.hunter@gmail.com, horms@kernel.org,
	jiri@resnulli.us, corbet@lwn.net, skhan@linuxfoundation.org,
	saeedm@nvidia.com, leon@kernel.org, mbloch@nvidia.com,
	shuah@kernel.org, chuck.lever@oracle.com, matttbe@kernel.org,
	cjubran@nvidia.com, cratiu@nvidia.com, dtatulea@nvidia.com,
	jacob.e.keller@intel.com, shshitrit@nvidia.com,
	daniel.zahka@gmail.com, parav@nvidia.com,
	ajayachandra@nvidia.com, kees@kernel.org, shayd@nvidia.com,
	danielj@nvidia.com, moshe@nvidia.com, willemb@google.com,
	dw@davidwei.uk, petrm@nvidia.com, sdf@fomichev.me,
	daniel@iogearbox.net, joe@dama.to, razor@blackwall.org,
	vadim.fedorenko@linux.dev, mst@redhat.com, antonio@openvpn.net,
	allison.henderson@oracle.com, minhquangbui99@gmail.com,
	noren@nvidia.com, netdev@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org,
	linux-rdma@vger.kernel.org, linux-kselftest@vger.kernel.org,
	gal@nvidia.com, jiri@nvidia.com
Subject: Re: [PATCH net-next V9 07/14] devlink: Allow rate node parents from other devlinks
Date: Mon, 30 Mar 2026 19:08:14 -0700	[thread overview]
Message-ID: <20260331020814.3525053-1-kuba@kernel.org> (raw)
In-Reply-To: <20260326065949.44058-8-tariqt@nvidia.com>

This is an AI-generated review of your patch. The human sending this
email has considered the AI review valid, or at least plausible.
---
devlink: Allow rate node parents from other devlinks

This commit makes use of the building blocks previously added to
implement cross-device rate nodes.

> diff --git a/include/net/devlink.h b/include/net/devlink.h
> index 3038af6ec017e..8d5ad5d4f1d05 100644
> --- a/include/net/devlink.h
> +++ b/include/net/devlink.h
> @@ -1585,6 +1585,11 @@ struct devlink_ops {
>  				    struct devlink_rate *parent,
>  				    void *priv_child, void *priv_parent,
>  				    struct netlink_ext_ack *extack);
> +	/* Indicates if cross-device rate nodes are supported.
> +	 * This also requires a shared common ancestor object all devices that
> +	 * could share rate nodes are nested in.
> +	 */
> +	bool supported_cross_device_rate_nodes;

When a device acting as a cross-device rate parent is destroyed,
devl_rate_nodes_destroy() iterates the shared rate_list to detach its
children. If it encounters a child rate node belonging to a different device,
it invokes the child driver's ops->rate_node_parent_set or
ops->rate_leaf_parent_set callbacks.

Since the cleanup path only holds the parent's devlink lock and the shared
root devlink lock, does this allow the child driver's rate operations to
execute concurrently with other operations on the child device without holding
the child's devlink instance lock?

[ ... ]
> diff --git a/net/devlink/rate.c b/net/devlink/rate.c
> index 1949746fab291..f243cccc95bee 100644
> --- a/net/devlink/rate.c
> +++ b/net/devlink/rate.c
> @@ -30,19 +30,53 @@ devlink_rate_leaf_get_from_info(struct devlink *devlink, struct genl_info *info)
>  	return devlink_rate ?: ERR_PTR(-ENODEV);
>  }
>  
> +/* Repeatedly locks the nested-in devlink instances while cross device rate
> + * nodes are supported. Returns the devlink instance where rates should be
> + * stored.
> + */
>  static struct devlink *devl_rate_lock(struct devlink *devlink)
>  {
> -	return devlink;
> +	struct devlink *rate_devlink = devlink;
> +
> +	while (rate_devlink->ops &&
> +	       rate_devlink->ops->supported_cross_device_rate_nodes) {
> +		devlink = devlink_nested_in_get_lock(rate_devlink->rel);
> +		if (!devlink)
> +			break;
> +		rate_devlink = devlink;
> +	}
> +	return rate_devlink;
>  }

[ ... ]

> +/* Repeatedly unlocks the nested-in devlink instances of 'devlink' while cross
> + * device nodes are supported.
> + */
>  static void devl_rate_unlock(struct devlink *devlink)
>  {
> +	if (!devlink || !devlink->ops ||
> +	    !devlink->ops->supported_cross_device_rate_nodes)
> +		return;
> +
> +	devl_rate_unlock(devlink_nested_in_get_locked(devlink->rel));
> +	devlink_nested_in_put_unlock(devlink->rel);
>  }

If a parent devlink is not yet registered, devlink_nested_in_get_lock() can
return NULL in devl_rate_lock() and break the loop without taking a lock.

If another thread completes registering the parent devlink concurrently,
devlink_nested_in_get_locked() in devl_rate_unlock() will find it. 

Could this lead to unlocking a mutex that was never acquired and dropping a
reference that was never taken, resulting in a use-after-free or lock
corruption?

[ ... ]
> @@ -320,13 +371,14 @@ devlink_nl_rate_parent_node_set(struct devlink_rate *devlink_rate,
>  				struct genl_info *info,
>  				struct nlattr *nla_parent)
>  {
> -	struct devlink *devlink = devlink_rate->devlink;
> +	struct devlink *devlink = devlink_rate->devlink, *parent_devlink;
>  	const char *parent_name = nla_data(nla_parent);
>  	const struct devlink_ops *ops = devlink->ops;
>  	size_t len = strlen(parent_name);
>  	struct devlink_rate *parent;
>  	int err = -EOPNOTSUPP;
>  
> +	parent_devlink = devlink_nl_ctx(info)->parent_devlink ? : devlink;
>  	parent = devlink_rate->parent;
>  
>  	if (parent && !len) {
> @@ -344,7 +396,13 @@ devlink_nl_rate_parent_node_set(struct devlink_rate *devlink_rate,
>  		refcount_dec(&parent->refcnt);
>  		devlink_rate->parent = NULL;
>  	} else if (len) {
> -		parent = devlink_rate_node_get_by_name(devlink, parent_name);
> +		/* parent_devlink (when different than devlink) isn't locked,
> +		 * but the rate node devlink instance is, so nobody from the
> +		 * same group of devices sharing rates could change the used
> +		 * fields or unregister the parent.
> +		 */
> +		parent = devlink_rate_node_get_by_name(parent_devlink,
> +						       parent_name);

Is parent_devlink validated to ensure it shares the same common rate root
ancestor as devlink?

If an arbitrary unrelated parent_devlink is specified,
devlink_rate_node_get_by_name() could traverse an unrelated parent's
rate_list that was never locked by devl_rate_lock(), leading to a data race.

Additionally, if a rate node is found, its priv pointer is passed to the
target driver's ops->rate_node_parent_set. Could this cause the target driver
to cast a foreign priv pointer to its own private struct type, resulting in
type confusion and memory corruption?

  reply	other threads:[~2026-03-31  2:08 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-26  6:59 [PATCH net-next V9 00/14] devlink and mlx5: Support cross-function rate scheduling Tariq Toukan
2026-03-26  6:59 ` [PATCH net-next V9 01/14] devlink: Update nested instance locking comment Tariq Toukan
2026-03-26  6:59 ` [PATCH net-next V9 02/14] devlink: Add helpers to lock nested-in instances Tariq Toukan
2026-03-31  2:08   ` Jakub Kicinski
2026-03-31 12:20     ` Cosmin Ratiu
2026-03-31 23:55       ` Jacob Keller
2026-04-01 10:22         ` Cosmin Ratiu
2026-04-01 20:18           ` Jacob Keller
2026-03-26  6:59 ` [PATCH net-next V9 03/14] devlink: Migrate from info->user_ptr to info->ctx Tariq Toukan
2026-03-26  6:59 ` [PATCH net-next V9 04/14] devlink: Decouple rate storage from associated devlink object Tariq Toukan
2026-03-31  2:08   ` Jakub Kicinski
2026-03-31 12:28     ` Cosmin Ratiu
2026-03-26  6:59 ` [PATCH net-next V9 05/14] devlink: Add parent dev to devlink API Tariq Toukan
2026-03-26  6:59 ` [PATCH net-next V9 06/14] devlink: Allow parent dev for rate-set and rate-new Tariq Toukan
2026-03-26  6:59 ` [PATCH net-next V9 07/14] devlink: Allow rate node parents from other devlinks Tariq Toukan
2026-03-31  2:08   ` Jakub Kicinski [this message]
2026-03-31 12:44     ` Cosmin Ratiu
2026-03-26  6:59 ` [PATCH net-next V9 08/14] net/mlx5: qos: Use mlx5_lag_query_bond_speed to query LAG speed Tariq Toukan
2026-03-26  6:59 ` [PATCH net-next V9 09/14] net/mlx5: qos: Expose a function to clear a vport's parent Tariq Toukan
2026-03-26  6:59 ` [PATCH net-next V9 10/14] net/mlx5: qos: Model the root node in the scheduling hierarchy Tariq Toukan
2026-03-26  6:59 ` [PATCH net-next V9 11/14] net/mlx5: qos: Remove qos domains and use shd lock Tariq Toukan
2026-03-31  2:08   ` Jakub Kicinski
2026-03-31 12:53     ` Cosmin Ratiu
2026-03-31 16:37       ` Cosmin Ratiu
2026-03-26  6:59 ` [PATCH net-next V9 12/14] net/mlx5: qos: Support cross-device tx scheduling Tariq Toukan
2026-03-31  2:08   ` Jakub Kicinski
2026-03-31 12:57     ` Cosmin Ratiu
2026-03-26  6:59 ` [PATCH net-next V9 13/14] selftests: drv-net: Add test for cross-esw rate scheduling Tariq Toukan
2026-03-26  6:59 ` [PATCH net-next V9 14/14] net/mlx5: Document devlink rates Tariq Toukan

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=20260331020814.3525053-1-kuba@kernel.org \
    --to=kuba@kernel.org \
    --cc=ajayachandra@nvidia.com \
    --cc=allison.henderson@oracle.com \
    --cc=andrew+netdev@lunn.ch \
    --cc=antonio@openvpn.net \
    --cc=chuck.lever@oracle.com \
    --cc=cjubran@nvidia.com \
    --cc=corbet@lwn.net \
    --cc=cratiu@nvidia.com \
    --cc=daniel.zahka@gmail.com \
    --cc=daniel@iogearbox.net \
    --cc=danielj@nvidia.com \
    --cc=davem@davemloft.net \
    --cc=donald.hunter@gmail.com \
    --cc=dtatulea@nvidia.com \
    --cc=dw@davidwei.uk \
    --cc=edumazet@google.com \
    --cc=gal@nvidia.com \
    --cc=horms@kernel.org \
    --cc=jacob.e.keller@intel.com \
    --cc=jiri@nvidia.com \
    --cc=jiri@resnulli.us \
    --cc=joe@dama.to \
    --cc=kees@kernel.org \
    --cc=leon@kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-rdma@vger.kernel.org \
    --cc=matttbe@kernel.org \
    --cc=mbloch@nvidia.com \
    --cc=minhquangbui99@gmail.com \
    --cc=moshe@nvidia.com \
    --cc=mst@redhat.com \
    --cc=netdev@vger.kernel.org \
    --cc=noren@nvidia.com \
    --cc=pabeni@redhat.com \
    --cc=parav@nvidia.com \
    --cc=petrm@nvidia.com \
    --cc=razor@blackwall.org \
    --cc=saeedm@nvidia.com \
    --cc=sdf@fomichev.me \
    --cc=shayd@nvidia.com \
    --cc=shshitrit@nvidia.com \
    --cc=shuah@kernel.org \
    --cc=skhan@linuxfoundation.org \
    --cc=tariqt@nvidia.com \
    --cc=vadim.fedorenko@linux.dev \
    --cc=willemb@google.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