From nobody Sun Feb 8 02:56:12 2026 Received: from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net [217.70.183.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2FEDF1DE3DC; Sat, 8 Mar 2025 15:54:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741449295; cv=none; b=rd9tFkzpJrL28NMr5f13RANYs2q8DVqG0pWMSW0xB7q9QtrLad6Sqsz3YZoJ9jn1R9TFSsePKi51EuyeKJyKQHirJWrXJ85iU88YUaBDaKfikGr4/jNW3TYmTraf8BxEYGajPIKh5C0UmJ05ia+Xtw8s1ZuQ9Ue8VFO4oijg7c8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741449295; c=relaxed/simple; bh=fqJVVd2/eraKWPgIGQ/4lIhI4jdqIcKF8O6qa6eMI/o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q6KuWoHJSkrHXY/7Px5NZ3VwNALA0BigSY0QFUAQPsoMqJguU69+TN8KdWjsBNR4ofu/JoWn646fTPihkG68n6mn9LJLhk9uWVCZUFxgCGDxDzswf1UOp6splCjYDAB03WtVnT2mmCOkEFbVe2m+hQlSbKVHRZMXfMMzwYhfArU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=Gpb4oegQ; arc=none smtp.client-ip=217.70.183.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="Gpb4oegQ" Received: by mail.gandi.net (Postfix) with ESMTPSA id E957620479; Sat, 8 Mar 2025 15:54:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1741449286; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2UwmBGloiWK5RwG3+9CXOmQkF8j2hUhncuhw9qjmriY=; b=Gpb4oegQ0coBIBM3ZWW/WpaeaMhPt0yPBi+WTZWqOqUqhppPHy734euH4mwL+78H7sHCvq 0ANkNlcCoHLXZOwaZHlzlYUcRwKrSC09UDWFEGBfKbSu3spc8Ka95ykhhwMrvdSIOL74dS rcO+EkhKob04QplJ2jtGL10y3UJxarW8Jega5Va+qqZmXhY1QKq0sTj2BrKLS9hBFraGpe QiiuR4YIgazL1uJHL6BMDAqlrMKtQ1Gb77DBouHftmMco+zmyi2KqZ24lm0LnZPsMS5Ulh kBBUBQ/AtibuODr1FhyKO6difcanpvR6TaINtHBu6hbM4pyhJZ6x/xrePqxjhQ== From: Maxime Chevallier To: davem@davemloft.net, Andrew Lunn , Jakub Kicinski , Eric Dumazet , Paolo Abeni , Heiner Kallweit Cc: Maxime Chevallier , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, thomas.petazzoni@bootlin.com, linux-arm-kernel@lists.infradead.org, Christophe Leroy , Herve Codina , Florian Fainelli , Russell King , Vladimir Oltean , =?UTF-8?q?K=C3=B6ry=20Maincent?= , Oleksij Rempel , Simon Horman , Romain Gantois , Piergiorgio Beruto , Stanislav Fomichev Subject: [PATCH net-next v2 1/7] net: ethtool: netlink: Allow per-netdevice DUMP operations Date: Sat, 8 Mar 2025 16:54:33 +0100 Message-ID: <20250308155440.267782-2-maxime.chevallier@bootlin.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250308155440.267782-1-maxime.chevallier@bootlin.com> References: <20250308155440.267782-1-maxime.chevallier@bootlin.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeefvddrtddtgdduudefleeiucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuifetpfffkfdpucggtfgfnhhsuhgsshgtrhhisggvnecuuegrihhlohhuthemuceftddunecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjughrpefhvfevufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeforgigihhmvgcuvehhvghvrghllhhivghruceomhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomheqnecuggftrfgrthhtvghrnhepveegtdffleffleevueellefgjeefvedvjefhheegfefgffdvfeetgeevudetffdtnecukfhppedvrgdtudemtggsudelmeekugegtgemlehftddtmegstgdvudemkeekleelmeehgedttgemvgehlegvnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehinhgvthepvdgrtddumegtsgduleemkegugegtmeelfhdttdemsggtvddumeekkeelleemheegtdgtmegvheelvgdphhgvlhhopehfvgguohhrrgdrhhhomhgvpdhmrghilhhfrhhomhepmhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomhdpnhgspghrtghpthhtohepvddvpdhrtghpthhtohepuggrvhgvmhesuggrvhgvmhhlohhfthdrnhgvthdprhgtphhtthhopegrnhgurhgvfieslhhunhhnrdgthhdprhgtphhtthhopehkuhgsrgeskhgvrhhnvghlrdhorhhgpdhrtghpthhtohepvgguuhhmr giivghtsehgohhoghhlvgdrtghomhdprhgtphhtthhopehprggsvghnihesrhgvughhrghtrdgtohhmpdhrtghpthhtohephhhkrghllhifvghithdusehgmhgrihhlrdgtohhmpdhrtghpthhtohepmhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomhdprhgtphhtthhopehnvghtuggvvhesvhhgvghrrdhkvghrnhgvlhdrohhrgh X-GND-Sasl: maxime.chevallier@bootlin.com Content-Type: text/plain; charset="utf-8" We have a number of netlink commands in the ethnl family that may have multiple objects to dump even for a single net_device, including : - PLCA, PSE-PD, phy: one message per PHY device - tsinfo: one message per timestamp source (netdev + phys) - rss: One per RSS context To get this behaviour, these netlink commands need to roll a custom ->dumpit(). To prepare making per-netdev DUMP more generic in ethnl, introduce a member in the ethnl ops to indicate if a given command may allow pernetdev DUMPs (also referred to as filtered DUMPs). Signed-off-by: Maxime Chevallier --- V2: - Rebase - Fix kdoc - Fix bissectabilitu by using the right function names net/ethtool/netlink.c | 45 ++++++++++++++++++++++++++++--------------- net/ethtool/netlink.h | 2 ++ 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c index 70834947f474..11e4122b7707 100644 --- a/net/ethtool/netlink.c +++ b/net/ethtool/netlink.c @@ -586,21 +586,34 @@ static int ethnl_default_dumpit(struct sk_buff *skb, int ret =3D 0; =20 rcu_read_lock(); - for_each_netdev_dump(net, dev, ctx->pos_ifindex) { - dev_hold(dev); + if (ctx->req_info->dev) { + dev =3D ctx->req_info->dev; rcu_read_unlock(); - - ret =3D ethnl_default_dump_one(skb, dev, ctx, genl_info_dump(cb)); - + /* Filtered DUMP request targeted to a single netdev. We already + * hold a ref to the netdev from ->start() + */ + ret =3D ethnl_default_dump_one(skb, dev, ctx, + genl_info_dump(cb)); rcu_read_lock(); - dev_put(dev); - - if (ret < 0 && ret !=3D -EOPNOTSUPP) { - if (likely(skb->len)) - ret =3D skb->len; - break; + netdev_put(ctx->req_info->dev, &ctx->req_info->dev_tracker); + } else { + for_each_netdev_dump(net, dev, ctx->pos_ifindex) { + dev_hold(dev); + rcu_read_unlock(); + + ret =3D ethnl_default_dump_one(skb, dev, ctx, + genl_info_dump(cb)); + + rcu_read_lock(); + dev_put(dev); + + if (ret < 0 && ret !=3D -EOPNOTSUPP) { + if (likely(skb->len)) + ret =3D skb->len; + break; + } + ret =3D 0; } - ret =3D 0; } rcu_read_unlock(); =20 @@ -634,10 +647,10 @@ static int ethnl_default_start(struct netlink_callbac= k *cb) } =20 ret =3D ethnl_default_parse(req_info, &info->info, ops, false); - if (req_info->dev) { - /* We ignore device specification in dump requests but as the - * same parser as for non-dump (doit) requests is used, it - * would take reference to the device if it finds one + if (req_info->dev && !ops->allow_pernetdev_dump) { + /* We ignore device specification in unfiltered dump requests + * but as the same parser as for non-dump (doit) requests is + * used, it would take reference to the device if it finds one */ netdev_put(req_info->dev, &req_info->dev_tracker); req_info->dev =3D NULL; diff --git a/net/ethtool/netlink.h b/net/ethtool/netlink.h index ec6ab5443a6f..4aaa73282d6a 100644 --- a/net/ethtool/netlink.h +++ b/net/ethtool/netlink.h @@ -331,6 +331,7 @@ int ethnl_sock_priv_set(struct sk_buff *skb, struct net= _device *dev, u32 portid, * @req_info_size: size of request info * @reply_data_size: size of reply data * @allow_nodev_do: allow non-dump request with no device identification + * @allow_pernetdev_dump: allow filtering dump requests with ifname/ifindex * @set_ntf_cmd: notification to generate on changes (SET) * @parse_request: * Parse request except common header (struct ethnl_req_info). Common @@ -388,6 +389,7 @@ struct ethnl_request_ops { unsigned int req_info_size; unsigned int reply_data_size; bool allow_nodev_do; + bool allow_pernetdev_dump; u8 set_ntf_cmd; =20 int (*parse_request)(struct ethnl_req_info *req_info, --=20 2.48.1 From nobody Sun Feb 8 02:56:12 2026 Received: from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net [217.70.183.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5B78E1DE2D4; Sat, 8 Mar 2025 15:54:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741449296; cv=none; b=TdIYEQPyWjDguAvLNS4kxXtp2z/X45ZuR729XzCqyx2V3J/9CazQZduWNR1GypxlZgFRO5ConpHhavujHmucxolJgWDsSk+V+EbEn5UaL3Yu8yEbiTnbxpBg/tCnXyarLNSBkC6Yw+xS4YtoB2KDfrkOa28cP4gnkD6gK5WkUpQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741449296; c=relaxed/simple; bh=+GVdI8ZYrds+o596hNQ8JWJLjKp22m3JfXDOnTxsfkU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DG4b/05IQixlXtA2J6otrwNCE417vLuh+t0Vj7QbukO2cfWSQkGiM9k1PAxw+FOCU4IVZsKL6o4++JxZUG717eGZtVyI1CJFawxAuKX9Hpa65TzsnftqlAwIKBS6GSnreX4bh7Nf8tRjcVNobNVSfQEiHTJmenWiUwSdAIfbi1k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=CKsLYps1; arc=none smtp.client-ip=217.70.183.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="CKsLYps1" Received: by mail.gandi.net (Postfix) with ESMTPSA id 473A8204CC; Sat, 8 Mar 2025 15:54:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1741449287; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=C/CgfC9bQQMQo7QYZcvRHcVFZ3LoI/EHR6DAT/jK644=; b=CKsLYps19CeEEQQCP47KdAvj2eK2Q90syFYkMMqrmOTO2ATe3GnEROyI8MkN8rE/UYP9G1 wxS2u1MDLXgNly56PP6deBJr6zGKqyvOsxaNbtzaraa/vH3exxbS/IrYBwA/ztKZ8RpK+N lHloe7NzOJR0IPTDxRG+5S/gqIqpQ5Rxv/xgNQ2Q3MnBKdKGJ6yuBK4Ydt/+hxhWct4/xN 0IkOVUUmQkhkl+vjVQQUljkoZ36UZfE6DaLfl0INx9Fn4tVhq5PxYBBqX0QZlsw9pceLor Ld9eX17446V4rP8SuG8GMs+VeNTU31VhICb1XEvTJvErDiZl9ID6Tx9RAlqugQ== From: Maxime Chevallier To: davem@davemloft.net, Andrew Lunn , Jakub Kicinski , Eric Dumazet , Paolo Abeni , Heiner Kallweit Cc: Maxime Chevallier , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, thomas.petazzoni@bootlin.com, linux-arm-kernel@lists.infradead.org, Christophe Leroy , Herve Codina , Florian Fainelli , Russell King , Vladimir Oltean , =?UTF-8?q?K=C3=B6ry=20Maincent?= , Oleksij Rempel , Simon Horman , Romain Gantois , Piergiorgio Beruto , Stanislav Fomichev Subject: [PATCH net-next v2 2/7] net: ethtool: netlink: Rename ethnl_default_dump_one Date: Sat, 8 Mar 2025 16:54:34 +0100 Message-ID: <20250308155440.267782-3-maxime.chevallier@bootlin.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250308155440.267782-1-maxime.chevallier@bootlin.com> References: <20250308155440.267782-1-maxime.chevallier@bootlin.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeefvddrtddtgdduudefleeiucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuifetpfffkfdpucggtfgfnhhsuhgsshgtrhhisggvnecuuegrihhlohhuthemuceftddunecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjughrpefhvfevufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeforgigihhmvgcuvehhvghvrghllhhivghruceomhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomheqnecuggftrfgrthhtvghrnhepudehudevhedvvdevkeetleeigeejtddvkeejueffieevudfgvdekjeelffetvdehnecuffhomhgrihhnpehishhsuhgvrdhnvghtnecukfhppedvrgdtudemtggsudelmeekugegtgemlehftddtmegstgdvudemkeekleelmeehgedttgemvgehlegvnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehinhgvthepvdgrtddumegtsgduleemkegugegtmeelfhdttdemsggtvddumeekkeelleemheegtdgtmegvheelvgdphhgvlhhopehfvgguohhrrgdrhhhomhgvpdhmrghilhhfrhhomhepmhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomhdpnhgspghrtghpthhtohepvddvpdhrtghpthhtohepuggrvhgvmhesuggrvhgvmhhlohhfthdrnhgvthdprhgtphhtthhopegrnhgurhgvfieslhhunhhnrdgthhdprhgtphhtthhopehkuhgsrgeskhgvrhhnv ghlrdhorhhgpdhrtghpthhtohepvgguuhhmrgiivghtsehgohhoghhlvgdrtghomhdprhgtphhtthhopehprggsvghnihesrhgvughhrghtrdgtohhmpdhrtghpthhtohephhhkrghllhifvghithdusehgmhgrihhlrdgtohhmpdhrtghpthhtohepmhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomhdprhgtphhtthhopehnvghtuggvvhesvhhgvghrrdhkvghrnhgvlhdrohhrgh X-GND-Sasl: maxime.chevallier@bootlin.com Content-Type: text/plain; charset="utf-8" As we work on getting more objects out of a per-netdev DUMP, rename ethnl_default_dump_one() into ethnl_default_dump_one_dev(), making it explicit that this dumps everything for one netdev. Signed-off-by: Maxime Chevallier --- V2: Rebase, Fix whitespace issue. net/ethtool/netlink.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c index 11e4122b7707..f391a11242de 100644 --- a/net/ethtool/netlink.c +++ b/net/ethtool/netlink.c @@ -539,9 +539,9 @@ static int ethnl_default_doit(struct sk_buff *skb, stru= ct genl_info *info) return ret; } =20 -static int ethnl_default_dump_one(struct sk_buff *skb, struct net_device *= dev, - const struct ethnl_dump_ctx *ctx, - const struct genl_info *info) +static int ethnl_default_dump_one_dev(struct sk_buff *skb, struct net_devi= ce *dev, + const struct ethnl_dump_ctx *ctx, + const struct genl_info *info) { void *ehdr; int ret; @@ -592,8 +592,8 @@ static int ethnl_default_dumpit(struct sk_buff *skb, /* Filtered DUMP request targeted to a single netdev. We already * hold a ref to the netdev from ->start() */ - ret =3D ethnl_default_dump_one(skb, dev, ctx, - genl_info_dump(cb)); + ret =3D ethnl_default_dump_one_dev(skb, dev, ctx, + genl_info_dump(cb)); rcu_read_lock(); netdev_put(ctx->req_info->dev, &ctx->req_info->dev_tracker); } else { @@ -601,8 +601,8 @@ static int ethnl_default_dumpit(struct sk_buff *skb, dev_hold(dev); rcu_read_unlock(); =20 - ret =3D ethnl_default_dump_one(skb, dev, ctx, - genl_info_dump(cb)); + ret =3D ethnl_default_dump_one_dev(skb, dev, ctx, + genl_info_dump(cb)); =20 rcu_read_lock(); dev_put(dev); --=20 2.48.1 From nobody Sun Feb 8 02:56:12 2026 Received: from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net [217.70.183.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 789011E5218; Sat, 8 Mar 2025 15:54:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741449298; cv=none; b=cNQiKEJ6oVXAfeHQvYp5090C/6IK4aaAACrsGzfIgKtYzXcSsrUvn7G45RVbsNOKFbcL98jWEWm2CDO3k61/lvhQf0LV221QCnsZz4zwoZ58xlyD4+sx17js6Kjv85qJR+l0wZk3RMUm76oJ7V8BbrMJWkHQeUOv9XGb4qCBsxc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741449298; c=relaxed/simple; bh=JoiarFVQVGLGhzgD8Yq6KutcgwP0a9ieZGlnLCfGaX0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=irqQGf1ZINnuXnMKE4MtcY7zJPw+edZsYuwtJES+kVfB6RZew1PRoMF7K2D9xccODNQuIyzvqRIGg0SUvqeb0lvFqMrYsjM69+L3PuAj8JWh7T9h2MPMhRrgc7dyIy+YJueosGqAMF575tPlPdqSM1SwxOuU/C5vH9xIUfU3CDk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=fXq86bdX; arc=none smtp.client-ip=217.70.183.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="fXq86bdX" Received: by mail.gandi.net (Postfix) with ESMTPSA id 972D8204CE; Sat, 8 Mar 2025 15:54:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1741449288; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=y8lTePh5igrJf98LbOL5d9KS99/l+mQeh0K7EPVRWoY=; b=fXq86bdXUirnhOxsT/MX/YCd60ZbNC125GoMRr+xobiWX1j2tWdpiFEPNw0+IBVxfcMizG VcowSAtjWuKj5Idvv6W4zAQIyE8W4T1AYXqswekR/qfftTPLDUIni3a5GLcKKUTBr/NG8k me7+iO/j+JKNTNT9HyMC0HCD0UzKI7urejNsYNmPBShTvBWt43WXtzZ+NzdAklpS2ouapO FUS8LFmUd8u3VdBH7eEs8i+2rhjwkM9bQFlij0u4V12EibmPbgJAiFdBb2kqut8tcpeHPg at5Ew9rCXQUJt6HW1vBCnSkPPnziXGBhJrJFzS7GNi+IuhJH3rdme3UR9h1Smw== From: Maxime Chevallier To: davem@davemloft.net, Andrew Lunn , Jakub Kicinski , Eric Dumazet , Paolo Abeni , Heiner Kallweit Cc: Maxime Chevallier , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, thomas.petazzoni@bootlin.com, linux-arm-kernel@lists.infradead.org, Christophe Leroy , Herve Codina , Florian Fainelli , Russell King , Vladimir Oltean , =?UTF-8?q?K=C3=B6ry=20Maincent?= , Oleksij Rempel , Simon Horman , Romain Gantois , Piergiorgio Beruto , Stanislav Fomichev Subject: [PATCH net-next v2 3/7] net: ethtool: netlink: Introduce command-specific dump_one_dev Date: Sat, 8 Mar 2025 16:54:35 +0100 Message-ID: <20250308155440.267782-4-maxime.chevallier@bootlin.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250308155440.267782-1-maxime.chevallier@bootlin.com> References: <20250308155440.267782-1-maxime.chevallier@bootlin.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeefvddrtddtgdduudefleeiucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuifetpfffkfdpucggtfgfnhhsuhgsshgtrhhisggvnecuuegrihhlohhuthemuceftddunecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjughrpefhvfevufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeforgigihhmvgcuvehhvghvrghllhhivghruceomhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomheqnecuggftrfgrthhtvghrnhepveegtdffleffleevueellefgjeefvedvjefhheegfefgffdvfeetgeevudetffdtnecukfhppedvrgdtudemtggsudelmeekugegtgemlehftddtmegstgdvudemkeekleelmeehgedttgemvgehlegvnecuvehluhhsthgvrhfuihiivgepudenucfrrghrrghmpehinhgvthepvdgrtddumegtsgduleemkegugegtmeelfhdttdemsggtvddumeekkeelleemheegtdgtmegvheelvgdphhgvlhhopehfvgguohhrrgdrhhhomhgvpdhmrghilhhfrhhomhepmhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomhdpnhgspghrtghpthhtohepvddvpdhrtghpthhtohepuggrvhgvmhesuggrvhgvmhhlohhfthdrnhgvthdprhgtphhtthhopegrnhgurhgvfieslhhunhhnrdgthhdprhgtphhtthhopehkuhgsrgeskhgvrhhnvghlrdhorhhgpdhrtghpthhtohepvgguuhhmr giivghtsehgohhoghhlvgdrtghomhdprhgtphhtthhopehprggsvghnihesrhgvughhrghtrdgtohhmpdhrtghpthhtohephhhkrghllhifvghithdusehgmhgrihhlrdgtohhmpdhrtghpthhtohepmhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomhdprhgtphhtthhopehnvghtuggvvhesvhhgvghrrdhkvghrnhgvlhdrohhrgh X-GND-Sasl: maxime.chevallier@bootlin.com Content-Type: text/plain; charset="utf-8" Prepare more generic ethnl DUMP hanldling, by allowing netlink commands to register their own dump_one_dev() callback. This avoids having to roll with a fully custom genl ->dumpit callback, allowing the re-use of some ethnl plumbing. Fallback to the default dump_one_dev behaviour when no custom callback is found. The command dump context is maintained within the ethnl_dump_ctx, that we move in netlink.h so that command handlers can access it. This context can be allocated/freed in new ->dump_start() and ->dump_done() callbacks. Signed-off-by: Maxime Chevallier --- V2: - Fix kdoc net/ethtool/netlink.c | 62 +++++++++++++++++++++++++------------------ net/ethtool/netlink.h | 35 ++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 26 deletions(-) diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c index f391a11242de..ae06b72239a8 100644 --- a/net/ethtool/netlink.c +++ b/net/ethtool/netlink.c @@ -338,24 +338,6 @@ int ethnl_multicast(struct sk_buff *skb, struct net_de= vice *dev) =20 /* GET request helpers */ =20 -/** - * struct ethnl_dump_ctx - context structure for generic dumpit() callback - * @ops: request ops of currently processed message type - * @req_info: parsed request header of processed request - * @reply_data: data needed to compose the reply - * @pos_ifindex: saved iteration position - ifindex - * - * These parameters are kept in struct netlink_callback as context preserv= ed - * between iterations. They are initialized by ethnl_default_start() and u= sed - * in ethnl_default_dumpit() and ethnl_default_done(). - */ -struct ethnl_dump_ctx { - const struct ethnl_request_ops *ops; - struct ethnl_req_info *req_info; - struct ethnl_reply_data *reply_data; - unsigned long pos_ifindex; -}; - static const struct ethnl_request_ops * ethnl_default_requests[__ETHTOOL_MSG_USER_CNT] =3D { [ETHTOOL_MSG_STRSET_GET] =3D ðnl_strset_request_ops, @@ -539,9 +521,9 @@ static int ethnl_default_doit(struct sk_buff *skb, stru= ct genl_info *info) return ret; } =20 -static int ethnl_default_dump_one_dev(struct sk_buff *skb, struct net_devi= ce *dev, - const struct ethnl_dump_ctx *ctx, - const struct genl_info *info) +static int ethnl_default_dump_one(struct sk_buff *skb, + const struct ethnl_dump_ctx *ctx, + const struct genl_info *info) { void *ehdr; int ret; @@ -552,15 +534,15 @@ static int ethnl_default_dump_one_dev(struct sk_buff = *skb, struct net_device *de if (!ehdr) return -EMSGSIZE; =20 - ethnl_init_reply_data(ctx->reply_data, ctx->ops, dev); rtnl_lock(); - netdev_lock_ops(dev); + netdev_lock_ops(ctx->reply_data->dev); ret =3D ctx->ops->prepare_data(ctx->req_info, ctx->reply_data, info); - netdev_unlock_ops(dev); + netdev_unlock_ops(ctx->reply_data->dev); rtnl_unlock(); if (ret < 0) goto out; - ret =3D ethnl_fill_reply_header(skb, dev, ctx->ops->hdr_attr); + ret =3D ethnl_fill_reply_header(skb, ctx->reply_data->dev, + ctx->ops->hdr_attr); if (ret < 0) goto out; ret =3D ctx->ops->fill_reply(skb, ctx->req_info, ctx->reply_data); @@ -568,11 +550,29 @@ static int ethnl_default_dump_one_dev(struct sk_buff = *skb, struct net_device *de out: if (ctx->ops->cleanup_data) ctx->ops->cleanup_data(ctx->reply_data); - ctx->reply_data->dev =3D NULL; + if (ret < 0) genlmsg_cancel(skb, ehdr); else genlmsg_end(skb, ehdr); + + return ret; +} + +static int ethnl_default_dump_one_dev(struct sk_buff *skb, struct net_devi= ce *dev, + struct ethnl_dump_ctx *ctx, + const struct genl_info *info) +{ + int ret; + + ethnl_init_reply_data(ctx->reply_data, ctx->ops, dev); + + if (ctx->ops->dump_one_dev) + ret =3D ctx->ops->dump_one_dev(skb, ctx, info); + else + ret =3D ethnl_default_dump_one(skb, ctx, info); + + ctx->reply_data->dev =3D NULL; return ret; } =20 @@ -601,6 +601,7 @@ static int ethnl_default_dumpit(struct sk_buff *skb, dev_hold(dev); rcu_read_unlock(); =20 + ctx->req_info->dev =3D dev; ret =3D ethnl_default_dump_one_dev(skb, dev, ctx, genl_info_dump(cb)); =20 @@ -663,6 +664,12 @@ static int ethnl_default_start(struct netlink_callback= *cb) ctx->reply_data =3D reply_data; ctx->pos_ifindex =3D 0; =20 + if (ctx->ops->dump_start) { + ret =3D ctx->ops->dump_start(ctx); + if (ret) + goto free_reply_data; + } + return 0; =20 free_reply_data: @@ -678,6 +685,9 @@ static int ethnl_default_done(struct netlink_callback *= cb) { struct ethnl_dump_ctx *ctx =3D ethnl_dump_context(cb); =20 + if (ctx->ops->dump_done) + ctx->ops->dump_done(ctx); + kfree(ctx->reply_data); kfree(ctx->req_info); =20 diff --git a/net/ethtool/netlink.h b/net/ethtool/netlink.h index 4aaa73282d6a..79fe98190c64 100644 --- a/net/ethtool/netlink.h +++ b/net/ethtool/netlink.h @@ -307,6 +307,26 @@ struct ethnl_reply_data { struct net_device *dev; }; =20 +/** + * struct ethnl_dump_ctx - context structure for generic dumpit() callback + * @ops: request ops of currently processed message type + * @req_info: parsed request header of processed request + * @reply_data: data needed to compose the reply + * @pos_ifindex: saved iteration position - ifindex + * @cmd_ctx: command-specific context to maintain across the dump. + * + * These parameters are kept in struct netlink_callback as context preserv= ed + * between iterations. They are initialized by ethnl_default_start() and u= sed + * in ethnl_default_dumpit() and ethnl_default_done(). + */ +struct ethnl_dump_ctx { + const struct ethnl_request_ops *ops; + struct ethnl_req_info *req_info; + struct ethnl_reply_data *reply_data; + unsigned long pos_ifindex; + void *cmd_ctx; +}; + int ethnl_ops_begin(struct net_device *dev); void ethnl_ops_complete(struct net_device *dev); =20 @@ -373,6 +393,15 @@ int ethnl_sock_priv_set(struct sk_buff *skb, struct ne= t_device *dev, u32 portid, * - 0 if no configuration has changed * - 1 if configuration changed and notification should be generated * - negative errno on errors + * @dump_start: + * Optional callback to prepare a dump operation, should there be a need + * to maintain some context across the dump. + * @dump_one_dev: + * Optional callback to generate all messages for a given netdev. This + * is relevant only when a request can produce different results for the + * same netdev depending on command-specific attributes. + * @dump_done: + * Optional callback to cleanup any context allocated in ->dump_start() * * Description of variable parts of GET request handling when using the * unified infrastructure. When used, a pointer to an instance of this @@ -409,6 +438,12 @@ struct ethnl_request_ops { struct genl_info *info); int (*set)(struct ethnl_req_info *req_info, struct genl_info *info); + + int (*dump_start)(struct ethnl_dump_ctx *ctx); + int (*dump_one_dev)(struct sk_buff *skb, + struct ethnl_dump_ctx *ctx, + const struct genl_info *info); + void (*dump_done)(struct ethnl_dump_ctx *ctx); }; =20 /* request handlers */ --=20 2.48.1 From nobody Sun Feb 8 02:56:12 2026 Received: from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net [217.70.183.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2E71F1E835A; Sat, 8 Mar 2025 15:54:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741449299; cv=none; b=AtXttyrpcSubcO6AfarlT+EYe85wXtTJQH9btS7H4hcbLTAhx9vIJtPfLFdITmG1v0GowuEOGP5oQu4azrB+Qh0xIqNrgHwRZPmh6++KXkIFcI7tDA6WCb6ZBJnF3DFnb8SBzknecTszz5YfxRl2xatI9R6etqrlx4u/7HFSbg8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741449299; c=relaxed/simple; bh=5YI0kyNkOiLZP/Q3ING0P5lghDvzq81OA8M4j4gIaic=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CNjCZo9/AQj//tFHn/vRmxM+eHaOtl6pgo6kVsRxsjZ2spxDZiBnd+XE4vrZpquU00ps2mk0NT/kug7uN1aTBL9qbnTN9SnIL0fvodIN21iw9CRy+7phsqc4gmathS5u/ao4EUS4B0iaBZjuIuhBoLDCV9SuXNEDcaK2/nxEIP8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=FFPGi6uZ; arc=none smtp.client-ip=217.70.183.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="FFPGi6uZ" Received: by mail.gandi.net (Postfix) with ESMTPSA id ED68C204CF; Sat, 8 Mar 2025 15:54:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1741449290; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vmy9NxM0ktvekYXuuKXI27bEO2tP0yU3U+/hUv66has=; b=FFPGi6uZLLxb9/W0w/LZ8BQjCxyxBMST6edtHqALz44Ux5cykiGOOGStK6TGiP4UaIdR3V RXqEpeg0mSnQTBcXJCsnfd3ZNNbeA2hULpshad4tAi+LpP2mLwv0y5GjomVi+FwCbLlwJH Qo6/MIskcz1SkNlxmJ5WkGRKt0ak1DWO/vzY0q7iKEv12dOhpHecvRR4qvPlY7oC8uSucR O3/VijVYousSUDqbUQEH89cIjJoQqbJhoPgFNtb4ZHHRkhGIf4cI+ml8Ydxg4nRdlSbnbD bBXSjsBlxhUwxdZ/EOBg82yojsbCzyYGO0LjW0ZG2iraZqmBdyy++k0XX47NWg== From: Maxime Chevallier To: davem@davemloft.net, Andrew Lunn , Jakub Kicinski , Eric Dumazet , Paolo Abeni , Heiner Kallweit Cc: Maxime Chevallier , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, thomas.petazzoni@bootlin.com, linux-arm-kernel@lists.infradead.org, Christophe Leroy , Herve Codina , Florian Fainelli , Russell King , Vladimir Oltean , =?UTF-8?q?K=C3=B6ry=20Maincent?= , Oleksij Rempel , Simon Horman , Romain Gantois , Piergiorgio Beruto , Stanislav Fomichev Subject: [PATCH net-next v2 4/7] net: ethtool: netlink: Introduce per-phy DUMP helpers Date: Sat, 8 Mar 2025 16:54:36 +0100 Message-ID: <20250308155440.267782-5-maxime.chevallier@bootlin.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250308155440.267782-1-maxime.chevallier@bootlin.com> References: <20250308155440.267782-1-maxime.chevallier@bootlin.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeefvddrtddtgdduudefleeiucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuifetpfffkfdpucggtfgfnhhsuhgsshgtrhhisggvnecuuegrihhlohhuthemuceftddunecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjughrpefhvfevufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeforgigihhmvgcuvehhvghvrghllhhivghruceomhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomheqnecuggftrfgrthhtvghrnhepveegtdffleffleevueellefgjeefvedvjefhheegfefgffdvfeetgeevudetffdtnecukfhppedvrgdtudemtggsudelmeekugegtgemlehftddtmegstgdvudemkeekleelmeehgedttgemvgehlegvnecuvehluhhsthgvrhfuihiivgepudenucfrrghrrghmpehinhgvthepvdgrtddumegtsgduleemkegugegtmeelfhdttdemsggtvddumeekkeelleemheegtdgtmegvheelvgdphhgvlhhopehfvgguohhrrgdrhhhomhgvpdhmrghilhhfrhhomhepmhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomhdpnhgspghrtghpthhtohepvddvpdhrtghpthhtohepuggrvhgvmhesuggrvhgvmhhlohhfthdrnhgvthdprhgtphhtthhopegrnhgurhgvfieslhhunhhnrdgthhdprhgtphhtthhopehkuhgsrgeskhgvrhhnvghlrdhorhhgpdhrtghpthhtohepvgguuhhmr giivghtsehgohhoghhlvgdrtghomhdprhgtphhtthhopehprggsvghnihesrhgvughhrghtrdgtohhmpdhrtghpthhtohephhhkrghllhifvghithdusehgmhgrihhlrdgtohhmpdhrtghpthhtohepmhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomhdprhgtphhtthhopehnvghtuggvvhesvhhgvghrrdhkvghrnhgvlhdrohhrgh X-GND-Sasl: maxime.chevallier@bootlin.com Content-Type: text/plain; charset="utf-8" As there are multiple ethnl commands that report messages based on phy_device information, let's introduce a set of ethnl generic dump helpers to allow DUMP support for each PHY on a given netdev. This logic iterates over the phy_link_topology of each netdev (or a single netdev for filtered DUMP), and call ethnl_default_dump_one() with the req_info populated with ifindex + phyindex. This allows re-using all the existing infra for phy-targetting commands that already use ethnl generic helpers. Signed-off-by: Maxime Chevallier --- V2: Rebase net/ethtool/netlink.c | 53 +++++++++++++++++++++++++++++++++++++++++++ net/ethtool/netlink.h | 6 +++++ 2 files changed, 59 insertions(+) diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c index ae06b72239a8..a09bcd67b38f 100644 --- a/net/ethtool/netlink.c +++ b/net/ethtool/netlink.c @@ -559,6 +559,59 @@ static int ethnl_default_dump_one(struct sk_buff *skb, return ret; } =20 +/* Specific context for phy-targeting command DUMP operatins. We keep in c= ontext + * the latest phy_index we dumped, in case of an interrupted DUMP. + */ +struct ethnl_dump_ctx_perphy { + unsigned long phy_index; +}; + +int ethnl_dump_start_perphy(struct ethnl_dump_ctx *ctx) +{ + struct ethnl_dump_ctx_perphy *dump_ctx; + + dump_ctx =3D kzalloc(sizeof(*dump_ctx), GFP_KERNEL); + if (!dump_ctx) + return -ENOMEM; + + ctx->cmd_ctx =3D dump_ctx; + + return 0; +} + +void ethnl_dump_done_perphy(struct ethnl_dump_ctx *ctx) +{ + kfree(ctx->cmd_ctx); +} + +int ethnl_dump_one_dev_perphy(struct sk_buff *skb, + struct ethnl_dump_ctx *ctx, + const struct genl_info *info) +{ + struct ethnl_dump_ctx_perphy *dump_ctx =3D ctx->cmd_ctx; + struct net_device *dev =3D ctx->reply_data->dev; + struct phy_device_node *pdn; + int ret =3D 0; + + if (!dev->link_topo) + return 0; + + xa_for_each_start(&dev->link_topo->phys, dump_ctx->phy_index, + pdn, dump_ctx->phy_index) { + ctx->req_info->phy_index =3D dump_ctx->phy_index; + + /* We can re-use the original dump_one as ->prepare_data in + * commands use ethnl_req_get_phydev(), which gets the PHY from + * what's in req_info + */ + ret =3D ethnl_default_dump_one(skb, ctx, info); + if (ret) + break; + } + + return ret; +} + static int ethnl_default_dump_one_dev(struct sk_buff *skb, struct net_devi= ce *dev, struct ethnl_dump_ctx *ctx, const struct genl_info *info) diff --git a/net/ethtool/netlink.h b/net/ethtool/netlink.h index 79fe98190c64..530a9b5c8b39 100644 --- a/net/ethtool/netlink.h +++ b/net/ethtool/netlink.h @@ -327,6 +327,12 @@ struct ethnl_dump_ctx { void *cmd_ctx; }; =20 +/* Generic callbacks to be used by PHY targeting commands */ +int ethnl_dump_start_perphy(struct ethnl_dump_ctx *ctx); +int ethnl_dump_one_dev_perphy(struct sk_buff *skb, struct ethnl_dump_ctx *= ctx, + const struct genl_info *info); +void ethnl_dump_done_perphy(struct ethnl_dump_ctx *ctx); + int ethnl_ops_begin(struct net_device *dev); void ethnl_ops_complete(struct net_device *dev); =20 --=20 2.48.1 From nobody Sun Feb 8 02:56:12 2026 Received: from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net [217.70.183.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2FE841DE3C9; Sat, 8 Mar 2025 15:54:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741449296; cv=none; b=AeLYENv41Rt6UQtJpA6xqrXqhzuW2pdhuGHxO5QN3AnY0VqudKPZbDQElND3prj/8G1s8VmcEJt7sVBQQ7j3TP1tb885qJQAlmyL6rb5QWO7098aeGXH6z/Cg4xrp65sG9BokqMlmX10ZJ6v/KiR5ZFe+tm3f8RmdbvQWhLmQms= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741449296; c=relaxed/simple; bh=Le7iU2kz14hHkqMBiXqJQXW2tkN0IYSCehUL9QM0EBc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=L2szRYBHRhgpJcCztZnj58z+yPnFrmUdBf+Ijvwq6F+DOsUBCMbdtehfEBIgvPoC9oB3QNo4etUvSM4nDVYJfjxSpXEJtcBqegSOOu+ItAr81Fk37qwjc/EUP6L/JYDFgE7ioW9a/TeNI4o4IvzdAYGmB8xgQRWngmAMxaGrQMA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=LixB57eb; arc=none smtp.client-ip=217.70.183.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="LixB57eb" Received: by mail.gandi.net (Postfix) with ESMTPSA id 3E0B0204D1; Sat, 8 Mar 2025 15:54:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1741449291; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=tSljUzfVjUS7vj/8lFVGAUTAWYg6fnBMTDrI8G2Z2oU=; b=LixB57eblbK8GYcASuDa9ONJwJh0syHZN6/nGu7FdmMzZLzc1PV7v79zh3DHNTD+DIDYSV xbIb7UBcJDabYBWoo1DQ/rp9cmASOXjFnhY7wcU7Ns+VeOGDdsOPEmp7nmsQv76STleftR umuDyjkzsTxj7JHzbykk9336NIoTIZ1XRblnXPwL9vKixPHrCnn5cEQHj3oyBKLnePw/OS 7GR3VNMsXoN4lmBmz4b+46XiKif5PShSIaRfLcRbhzGDEL2cRo1x/0t9x96o81OL9VaWK8 EwQL8i/K3G5EznhdDc8xIh4h55XbU3SwpdUaUWHp4c5AYbsX1BwNTTabpEBNkQ== From: Maxime Chevallier To: davem@davemloft.net, Andrew Lunn , Jakub Kicinski , Eric Dumazet , Paolo Abeni , Heiner Kallweit Cc: Maxime Chevallier , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, thomas.petazzoni@bootlin.com, linux-arm-kernel@lists.infradead.org, Christophe Leroy , Herve Codina , Florian Fainelli , Russell King , Vladimir Oltean , =?UTF-8?q?K=C3=B6ry=20Maincent?= , Oleksij Rempel , Simon Horman , Romain Gantois , Piergiorgio Beruto , Stanislav Fomichev Subject: [PATCH net-next v2 5/7] net: ethtool: phy: Convert the PHY_GET command to generic phy dump Date: Sat, 8 Mar 2025 16:54:37 +0100 Message-ID: <20250308155440.267782-6-maxime.chevallier@bootlin.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250308155440.267782-1-maxime.chevallier@bootlin.com> References: <20250308155440.267782-1-maxime.chevallier@bootlin.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeefvddrtddtgdduudefleeiucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuifetpfffkfdpucggtfgfnhhsuhgsshgtrhhisggvnecuuegrihhlohhuthemuceftddunecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjughrpefhvfevufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeforgigihhmvgcuvehhvghvrghllhhivghruceomhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomheqnecuggftrfgrthhtvghrnhepvddtueefvdfhiefgieelfeeggeefiedvueevkedttddvffekleeujedtjeeuteehnecuffhomhgrihhnpegsrghsvgdruggvvhenucfkphepvdgrtddumegtsgduleemkegugegtmeelfhdttdemsggtvddumeekkeelleemheegtdgtmegvheelvgenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepihhnvghtpedvrgdtudemtggsudelmeekugegtgemlehftddtmegstgdvudemkeekleelmeehgedttgemvgehlegvpdhhvghlohepfhgvughorhgrrdhhohhmvgdpmhgrihhlfhhrohhmpehmrgigihhmvgdrtghhvghvrghllhhivghrsegsohhothhlihhnrdgtohhmpdhnsggprhgtphhtthhopedvvddprhgtphhtthhopegurghvvghmsegurghvvghmlhhofhhtrdhnvghtpdhrtghpthhtoheprghnughrvgifsehluhhnnhdrtghhpdhrtghpthhtohepkhhusggrsehkvghrnhgvl hdrohhrghdprhgtphhtthhopegvughumhgriigvthesghhoohhglhgvrdgtohhmpdhrtghpthhtohepphgrsggvnhhisehrvgguhhgrthdrtghomhdprhgtphhtthhopehhkhgrlhhlfigvihhtudesghhmrghilhdrtghomhdprhgtphhtthhopehmrgigihhmvgdrtghhvghvrghllhhivghrsegsohhothhlihhnrdgtohhmpdhrtghpthhtohepnhgvthguvghvsehvghgvrhdrkhgvrhhnvghlrdhorhhg X-GND-Sasl: maxime.chevallier@bootlin.com Content-Type: text/plain; charset="utf-8" Now that we have an infrastructure in ethnl for perphy DUMPs, we can get rid of the custom ->doit and ->dumpit to deal with PHY listing commands. As most of the code was custom, this basically means re-writing how we deal with PHY listing. Signed-off-by: Maxime Chevallier --- V2: Rebase net/ethtool/netlink.c | 9 +- net/ethtool/netlink.h | 4 - net/ethtool/phy.c | 343 ++++++++++++------------------------------ 3 files changed, 103 insertions(+), 253 deletions(-) diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c index a09bcd67b38f..dcc2b84095ea 100644 --- a/net/ethtool/netlink.c +++ b/net/ethtool/netlink.c @@ -381,6 +381,7 @@ ethnl_default_requests[__ETHTOOL_MSG_USER_CNT] =3D { [ETHTOOL_MSG_MM_SET] =3D ðnl_mm_request_ops, [ETHTOOL_MSG_TSCONFIG_GET] =3D ðnl_tsconfig_request_ops, [ETHTOOL_MSG_TSCONFIG_SET] =3D ðnl_tsconfig_request_ops, + [ETHTOOL_MSG_PHY_GET] =3D ðnl_phy_request_ops, }; =20 static struct ethnl_dump_ctx *ethnl_dump_context(struct netlink_callback *= cb) @@ -1344,10 +1345,10 @@ static const struct genl_ops ethtool_genl_ops[] =3D= { }, { .cmd =3D ETHTOOL_MSG_PHY_GET, - .doit =3D ethnl_phy_doit, - .start =3D ethnl_phy_start, - .dumpit =3D ethnl_phy_dumpit, - .done =3D ethnl_phy_done, + .doit =3D ethnl_default_doit, + .start =3D ethnl_default_start, + .dumpit =3D ethnl_default_dumpit, + .done =3D ethnl_default_done, .policy =3D ethnl_phy_get_policy, .maxattr =3D ARRAY_SIZE(ethnl_phy_get_policy) - 1, }, diff --git a/net/ethtool/netlink.h b/net/ethtool/netlink.h index 530a9b5c8b39..60f16090640f 100644 --- a/net/ethtool/netlink.h +++ b/net/ethtool/netlink.h @@ -542,10 +542,6 @@ int ethnl_tunnel_info_dumpit(struct sk_buff *skb, stru= ct netlink_callback *cb); int ethnl_act_module_fw_flash(struct sk_buff *skb, struct genl_info *info); int ethnl_rss_dump_start(struct netlink_callback *cb); int ethnl_rss_dumpit(struct sk_buff *skb, struct netlink_callback *cb); -int ethnl_phy_start(struct netlink_callback *cb); -int ethnl_phy_doit(struct sk_buff *skb, struct genl_info *info); -int ethnl_phy_dumpit(struct sk_buff *skb, struct netlink_callback *cb); -int ethnl_phy_done(struct netlink_callback *cb); int ethnl_tsinfo_start(struct netlink_callback *cb); int ethnl_tsinfo_dumpit(struct sk_buff *skb, struct netlink_callback *cb); int ethnl_tsinfo_done(struct netlink_callback *cb); diff --git a/net/ethtool/phy.c b/net/ethtool/phy.c index 1a6b725d1f14..90c27dd1a5c6 100644 --- a/net/ethtool/phy.c +++ b/net/ethtool/phy.c @@ -11,304 +11,157 @@ #include =20 struct phy_req_info { - struct ethnl_req_info base; - struct phy_device_node *pdn; + struct ethnl_req_info base; }; =20 -#define PHY_REQINFO(__req_base) \ - container_of(__req_base, struct phy_req_info, base) +struct phy_reply_data { + struct ethnl_reply_data base; + u32 phyindex; + char *drvname; + char *name; + unsigned int upstream_type; + char *upstream_sfp_name; + unsigned int upstream_index; + char *downstream_sfp_name; +}; + +#define PHY_REPDATA(__reply_base) \ + container_of(__reply_base, struct phy_reply_data, base) =20 const struct nla_policy ethnl_phy_get_policy[ETHTOOL_A_PHY_HEADER + 1] =3D= { [ETHTOOL_A_PHY_HEADER] =3D NLA_POLICY_NESTED(ethnl_header_policy), }; =20 -/* Caller holds rtnl */ -static ssize_t -ethnl_phy_reply_size(const struct ethnl_req_info *req_base, - struct netlink_ext_ack *extack) +static int phy_reply_size(const struct ethnl_req_info *req_info, + const struct ethnl_reply_data *reply_data) { - struct phy_req_info *req_info =3D PHY_REQINFO(req_base); - struct phy_device_node *pdn =3D req_info->pdn; - struct phy_device *phydev =3D pdn->phy; + struct phy_reply_data *rep_data =3D PHY_REPDATA(reply_data); size_t size =3D 0; =20 - ASSERT_RTNL(); - /* ETHTOOL_A_PHY_INDEX */ size +=3D nla_total_size(sizeof(u32)); =20 /* ETHTOOL_A_DRVNAME */ - if (phydev->drv) - size +=3D nla_total_size(strlen(phydev->drv->name) + 1); + if (rep_data->drvname) + size +=3D nla_total_size(strlen(rep_data->drvname) + 1); =20 /* ETHTOOL_A_NAME */ - size +=3D nla_total_size(strlen(dev_name(&phydev->mdio.dev)) + 1); + size +=3D nla_total_size(strlen(rep_data->name) + 1); =20 /* ETHTOOL_A_PHY_UPSTREAM_TYPE */ size +=3D nla_total_size(sizeof(u32)); =20 - if (phy_on_sfp(phydev)) { - const char *upstream_sfp_name =3D sfp_get_name(pdn->parent_sfp_bus); - - /* ETHTOOL_A_PHY_UPSTREAM_SFP_NAME */ - if (upstream_sfp_name) - size +=3D nla_total_size(strlen(upstream_sfp_name) + 1); + if (rep_data->upstream_sfp_name) + size +=3D nla_total_size(strlen(rep_data->upstream_sfp_name) + 1); =20 - /* ETHTOOL_A_PHY_UPSTREAM_INDEX */ + if (rep_data->upstream_index) size +=3D nla_total_size(sizeof(u32)); - } - - /* ETHTOOL_A_PHY_DOWNSTREAM_SFP_NAME */ - if (phydev->sfp_bus) { - const char *sfp_name =3D sfp_get_name(phydev->sfp_bus); =20 - if (sfp_name) - size +=3D nla_total_size(strlen(sfp_name) + 1); - } + if (rep_data->downstream_sfp_name) + size +=3D nla_total_size(strlen(rep_data->downstream_sfp_name) + 1); =20 return size; } =20 -static int -ethnl_phy_fill_reply(const struct ethnl_req_info *req_base, struct sk_buff= *skb) +static int phy_prepare_data(const struct ethnl_req_info *req_info, + struct ethnl_reply_data *reply_data, + const struct genl_info *info) { - struct phy_req_info *req_info =3D PHY_REQINFO(req_base); - struct phy_device_node *pdn =3D req_info->pdn; - struct phy_device *phydev =3D pdn->phy; - enum phy_upstream ptype; + struct phy_reply_data *rep_data =3D PHY_REPDATA(reply_data); + struct phy_link_topology *topo =3D reply_data->dev->link_topo; + struct nlattr **tb =3D info->attrs; + struct phy_device_node *pdn; + struct phy_device *phydev; =20 - ptype =3D pdn->upstream_type; + /* RTNL is held by th caller */ + phydev =3D ethnl_req_get_phydev(req_info, tb, ETHTOOL_A_PHY_HEADER, + info->extack); + if (IS_ERR_OR_NULL(phydev)) + return -EOPNOTSUPP; =20 - if (nla_put_u32(skb, ETHTOOL_A_PHY_INDEX, phydev->phyindex) || - nla_put_string(skb, ETHTOOL_A_PHY_NAME, dev_name(&phydev->mdio.dev)) = || - nla_put_u32(skb, ETHTOOL_A_PHY_UPSTREAM_TYPE, ptype)) - return -EMSGSIZE; + pdn =3D xa_load(&topo->phys, phydev->phyindex); + if (!pdn) + return -EOPNOTSUPP; =20 - if (phydev->drv && - nla_put_string(skb, ETHTOOL_A_PHY_DRVNAME, phydev->drv->name)) - return -EMSGSIZE; + rep_data->phyindex =3D phydev->phyindex; + rep_data->name =3D kstrdup(dev_name(&phydev->mdio.dev), GFP_KERNEL); + rep_data->drvname =3D kstrdup(phydev->drv->name, GFP_KERNEL); + rep_data->upstream_type =3D pdn->upstream_type; =20 - if (ptype =3D=3D PHY_UPSTREAM_PHY) { + if (pdn->upstream_type =3D=3D PHY_UPSTREAM_PHY) { struct phy_device *upstream =3D pdn->upstream.phydev; - const char *sfp_upstream_name; - - /* Parent index */ - if (nla_put_u32(skb, ETHTOOL_A_PHY_UPSTREAM_INDEX, upstream->phyindex)) - return -EMSGSIZE; - - if (pdn->parent_sfp_bus) { - sfp_upstream_name =3D sfp_get_name(pdn->parent_sfp_bus); - if (sfp_upstream_name && - nla_put_string(skb, ETHTOOL_A_PHY_UPSTREAM_SFP_NAME, - sfp_upstream_name)) - return -EMSGSIZE; - } + rep_data->upstream_index =3D upstream->phyindex; } =20 - if (phydev->sfp_bus) { - const char *sfp_name =3D sfp_get_name(phydev->sfp_bus); + if (pdn->parent_sfp_bus) + rep_data->upstream_sfp_name =3D kstrdup(sfp_get_name(pdn->parent_sfp_bus= ), + GFP_KERNEL); =20 - if (sfp_name && - nla_put_string(skb, ETHTOOL_A_PHY_DOWNSTREAM_SFP_NAME, - sfp_name)) - return -EMSGSIZE; - } + if (phydev->sfp_bus) + rep_data->downstream_sfp_name =3D kstrdup(sfp_get_name(phydev->sfp_bus), + GFP_KERNEL); =20 return 0; } =20 -static int ethnl_phy_parse_request(struct ethnl_req_info *req_base, - struct nlattr **tb, - struct netlink_ext_ack *extack) +static int phy_fill_reply(struct sk_buff *skb, + const struct ethnl_req_info *req_info, + const struct ethnl_reply_data *reply_data) { - struct phy_link_topology *topo =3D req_base->dev->link_topo; - struct phy_req_info *req_info =3D PHY_REQINFO(req_base); - struct phy_device *phydev; - - phydev =3D ethnl_req_get_phydev(req_base, tb, ETHTOOL_A_PHY_HEADER, - extack); - if (!phydev) - return 0; - - if (IS_ERR(phydev)) - return PTR_ERR(phydev); - - if (!topo) - return 0; - - req_info->pdn =3D xa_load(&topo->phys, phydev->phyindex); - - return 0; -} - -int ethnl_phy_doit(struct sk_buff *skb, struct genl_info *info) -{ - struct phy_req_info req_info =3D {}; - struct nlattr **tb =3D info->attrs; - struct sk_buff *rskb; - void *reply_payload; - int reply_len; - int ret; - - ret =3D ethnl_parse_header_dev_get(&req_info.base, - tb[ETHTOOL_A_PHY_HEADER], - genl_info_net(info), info->extack, - true); - if (ret < 0) - return ret; - - rtnl_lock(); - netdev_lock_ops(req_info.base.dev); - - ret =3D ethnl_phy_parse_request(&req_info.base, tb, info->extack); - if (ret < 0) - goto err_unlock; - - /* No PHY, return early */ - if (!req_info.pdn) - goto err_unlock; - - ret =3D ethnl_phy_reply_size(&req_info.base, info->extack); - if (ret < 0) - goto err_unlock; - reply_len =3D ret + ethnl_reply_header_size(); - - rskb =3D ethnl_reply_init(reply_len, req_info.base.dev, - ETHTOOL_MSG_PHY_GET_REPLY, - ETHTOOL_A_PHY_HEADER, - info, &reply_payload); - if (!rskb) { - ret =3D -ENOMEM; - goto err_unlock; - } + struct phy_reply_data *rep_data =3D PHY_REPDATA(reply_data); =20 - ret =3D ethnl_phy_fill_reply(&req_info.base, rskb); - if (ret) - goto err_free_msg; - - netdev_unlock_ops(req_info.base.dev); - rtnl_unlock(); - ethnl_parse_header_dev_put(&req_info.base); - genlmsg_end(rskb, reply_payload); - - return genlmsg_reply(rskb, info); - -err_free_msg: - nlmsg_free(rskb); -err_unlock: - netdev_unlock_ops(req_info.base.dev); - rtnl_unlock(); - ethnl_parse_header_dev_put(&req_info.base); - return ret; -} - -struct ethnl_phy_dump_ctx { - struct phy_req_info *phy_req_info; - unsigned long ifindex; - unsigned long phy_index; -}; - -int ethnl_phy_start(struct netlink_callback *cb) -{ - const struct genl_info *info =3D genl_info_dump(cb); - struct ethnl_phy_dump_ctx *ctx =3D (void *)cb->ctx; - int ret; + if (nla_put_u32(skb, ETHTOOL_A_PHY_INDEX, rep_data->phyindex) || + nla_put_string(skb, ETHTOOL_A_PHY_NAME, rep_data->name) || + nla_put_u32(skb, ETHTOOL_A_PHY_UPSTREAM_TYPE, rep_data->upstream_type= )) + return -EMSGSIZE; =20 - BUILD_BUG_ON(sizeof(*ctx) > sizeof(cb->ctx)); + if (rep_data->drvname && + nla_put_string(skb, ETHTOOL_A_PHY_DRVNAME, rep_data->drvname)) + return -EMSGSIZE; =20 - ctx->phy_req_info =3D kzalloc(sizeof(*ctx->phy_req_info), GFP_KERNEL); - if (!ctx->phy_req_info) - return -ENOMEM; + if (rep_data->upstream_index && + nla_put_u32(skb, ETHTOOL_A_PHY_UPSTREAM_INDEX, + rep_data->upstream_index)) + return -EMSGSIZE; =20 - ret =3D ethnl_parse_header_dev_get(&ctx->phy_req_info->base, - info->attrs[ETHTOOL_A_PHY_HEADER], - sock_net(cb->skb->sk), cb->extack, - false); - ctx->ifindex =3D 0; - ctx->phy_index =3D 0; + if (rep_data->upstream_sfp_name && + nla_put_string(skb, ETHTOOL_A_PHY_UPSTREAM_SFP_NAME, + rep_data->upstream_sfp_name)) + return -EMSGSIZE; =20 - if (ret) - kfree(ctx->phy_req_info); + if (rep_data->downstream_sfp_name && + nla_put_string(skb, ETHTOOL_A_PHY_DOWNSTREAM_SFP_NAME, + rep_data->downstream_sfp_name)) + return -EMSGSIZE; =20 - return ret; + return 0; } =20 -int ethnl_phy_done(struct netlink_callback *cb) +static void phy_cleanup_data(struct ethnl_reply_data *reply_data) { - struct ethnl_phy_dump_ctx *ctx =3D (void *)cb->ctx; - - if (ctx->phy_req_info->base.dev) - ethnl_parse_header_dev_put(&ctx->phy_req_info->base); - - kfree(ctx->phy_req_info); + struct phy_reply_data *rep_data =3D PHY_REPDATA(reply_data); =20 - return 0; + kfree(rep_data->drvname); + kfree(rep_data->name); + kfree(rep_data->upstream_sfp_name); + kfree(rep_data->downstream_sfp_name); } =20 -static int ethnl_phy_dump_one_dev(struct sk_buff *skb, struct net_device *= dev, - struct netlink_callback *cb) -{ - struct ethnl_phy_dump_ctx *ctx =3D (void *)cb->ctx; - struct phy_req_info *pri =3D ctx->phy_req_info; - struct phy_device_node *pdn; - int ret =3D 0; - void *ehdr; - - if (!dev->link_topo) - return 0; - - xa_for_each_start(&dev->link_topo->phys, ctx->phy_index, pdn, ctx->phy_in= dex) { - ehdr =3D ethnl_dump_put(skb, cb, ETHTOOL_MSG_PHY_GET_REPLY); - if (!ehdr) { - ret =3D -EMSGSIZE; - break; - } - - ret =3D ethnl_fill_reply_header(skb, dev, ETHTOOL_A_PHY_HEADER); - if (ret < 0) { - genlmsg_cancel(skb, ehdr); - break; - } - - pri->pdn =3D pdn; - ret =3D ethnl_phy_fill_reply(&pri->base, skb); - if (ret < 0) { - genlmsg_cancel(skb, ehdr); - break; - } - - genlmsg_end(skb, ehdr); - } +const struct ethnl_request_ops ethnl_phy_request_ops =3D { + .request_cmd =3D ETHTOOL_MSG_PHY_GET, + .reply_cmd =3D ETHTOOL_MSG_PHY_GET_REPLY, + .hdr_attr =3D ETHTOOL_A_PHY_HEADER, + .req_info_size =3D sizeof(struct phy_req_info), + .reply_data_size =3D sizeof(struct phy_reply_data), =20 - return ret; -} + .prepare_data =3D phy_prepare_data, + .reply_size =3D phy_reply_size, + .fill_reply =3D phy_fill_reply, + .cleanup_data =3D phy_cleanup_data, =20 -int ethnl_phy_dumpit(struct sk_buff *skb, struct netlink_callback *cb) -{ - struct ethnl_phy_dump_ctx *ctx =3D (void *)cb->ctx; - struct net *net =3D sock_net(skb->sk); - struct net_device *dev; - int ret =3D 0; - - rtnl_lock(); - - if (ctx->phy_req_info->base.dev) { - dev =3D ctx->phy_req_info->base.dev; - netdev_lock_ops(dev); - ret =3D ethnl_phy_dump_one_dev(skb, dev, cb); - netdev_unlock_ops(dev); - } else { - for_each_netdev_dump(net, dev, ctx->ifindex) { - netdev_lock_ops(dev); - ret =3D ethnl_phy_dump_one_dev(skb, dev, cb); - netdev_unlock_ops(dev); - if (ret) - break; - - ctx->phy_index =3D 0; - } - } - rtnl_unlock(); + .dump_start =3D ethnl_dump_start_perphy, + .dump_one_dev =3D ethnl_dump_one_dev_perphy, + .dump_done =3D ethnl_dump_done_perphy, =20 - return ret; -} + .allow_pernetdev_dump =3D true, +}; --=20 2.48.1 From nobody Sun Feb 8 02:56:12 2026 Received: from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net [217.70.183.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5B7E31DE3BD; Sat, 8 Mar 2025 15:54:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741449296; cv=none; b=h/M6DmSkM14NIGjC2haBZdUrZsYZt8qXjddPb9DykWYWn574bfv/n6ZUJvT6As3qQXl9JjJtCC7VYCxo0WoKeew2rS2nu3q7IoH6I7faUJPZBEWJo7BRsBYQtaDEyUSkKjhpkhK/c9cJx0phnV//Qd/PbR/BB54AmH2+8OP6khk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741449296; c=relaxed/simple; bh=YeqOeyPj1zuArMWLcfVbQUhNHWKalkY71WB8hxVcqq4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VUIJb3aa8q3Y8ZMHjRvxGq3E/ssDCgX/nf9ti5eyuLOj/oG8rZMCgZ465Eml3U64pe00XDGhXcCoUAP4JjWEKaj7KHjGrQ5wtLkixEh8y8ezg/W6eqDCWw7I/OD/I63IGQsDrDBEqZUpcJkEMqbvW3vqVWiqPk+VC1Llvz5fYaA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=ivIVsLd3; arc=none smtp.client-ip=217.70.183.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="ivIVsLd3" Received: by mail.gandi.net (Postfix) with ESMTPSA id 8FD02204D3; Sat, 8 Mar 2025 15:54:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1741449292; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=C0gJKdOvTUjxWLnnq+Try/nR9LpIH2HfuqRx2+er67c=; b=ivIVsLd3Ab3ob07KDHxtevXo/SadbLw+AlCqsNNvHh81Gp6G6uskD/g2NQlPJtSjDRu0HS RepWdVki12m3VpNjMyHszPmpGlDmNdCcTMW8gJd9BtPwBG/9fvePKZfGzzbmS2KnxMCUOi by3ev+NGgT1PrjJcIGecIYm2SkYSsUvavDHheOlgnMDSVvgIZwiqfAl+6klT9jQKVXVTrR NklezvNnQmGHaKVkhw24VBNq9LXgdPkOos6MZ1tnTF3q3Gpd6aV5noifb64Iq5YIYfdGqt FEqwG4oFCzUFFAgdvIO18q9zubvKa4gRHNv9yE2bk4aOXRyDzoDg0DI1EfAiuA== From: Maxime Chevallier To: davem@davemloft.net, Andrew Lunn , Jakub Kicinski , Eric Dumazet , Paolo Abeni , Heiner Kallweit Cc: Maxime Chevallier , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, thomas.petazzoni@bootlin.com, linux-arm-kernel@lists.infradead.org, Christophe Leroy , Herve Codina , Florian Fainelli , Russell King , Vladimir Oltean , =?UTF-8?q?K=C3=B6ry=20Maincent?= , Oleksij Rempel , Simon Horman , Romain Gantois , Piergiorgio Beruto , Stanislav Fomichev Subject: [PATCH net-next v2 6/7] net: ethtool: plca: Use per-PHY DUMP operations Date: Sat, 8 Mar 2025 16:54:38 +0100 Message-ID: <20250308155440.267782-7-maxime.chevallier@bootlin.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250308155440.267782-1-maxime.chevallier@bootlin.com> References: <20250308155440.267782-1-maxime.chevallier@bootlin.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeefvddrtddtgdduudefleeiucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuifetpfffkfdpucggtfgfnhhsuhgsshgtrhhisggvnecuuegrihhlohhuthemuceftddunecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjughrpefhvfevufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeforgigihhmvgcuvehhvghvrghllhhivghruceomhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomheqnecuggftrfgrthhtvghrnhepveegtdffleffleevueellefgjeefvedvjefhheegfefgffdvfeetgeevudetffdtnecukfhppedvrgdtudemtggsudelmeekugegtgemlehftddtmegstgdvudemkeekleelmeehgedttgemvgehlegvnecuvehluhhsthgvrhfuihiivgepudenucfrrghrrghmpehinhgvthepvdgrtddumegtsgduleemkegugegtmeelfhdttdemsggtvddumeekkeelleemheegtdgtmegvheelvgdphhgvlhhopehfvgguohhrrgdrhhhomhgvpdhmrghilhhfrhhomhepmhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomhdpnhgspghrtghpthhtohepvddvpdhrtghpthhtohepuggrvhgvmhesuggrvhgvmhhlohhfthdrnhgvthdprhgtphhtthhopegrnhgurhgvfieslhhunhhnrdgthhdprhgtphhtthhopehkuhgsrgeskhgvrhhnvghlrdhorhhgpdhrtghpthhtohepvgguuhhmr giivghtsehgohhoghhlvgdrtghomhdprhgtphhtthhopehprggsvghnihesrhgvughhrghtrdgtohhmpdhrtghpthhtohephhhkrghllhifvghithdusehgmhgrihhlrdgtohhmpdhrtghpthhtohepmhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomhdprhgtphhtthhopehnvghtuggvvhesvhhgvghrrdhkvghrnhgvlhdrohhrgh X-GND-Sasl: maxime.chevallier@bootlin.com Content-Type: text/plain; charset="utf-8" Leverage the per-phy ethnl DUMP helpers in case we have more that one PLCA-able PHY on the link. This is done for both PLCA status and PLCA config. Signed-off-by: Maxime Chevallier --- V2: No changes net/ethtool/plca.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/net/ethtool/plca.c b/net/ethtool/plca.c index e1f7820a6158..2148ff607561 100644 --- a/net/ethtool/plca.c +++ b/net/ethtool/plca.c @@ -191,6 +191,12 @@ const struct ethnl_request_ops ethnl_plca_cfg_request_= ops =3D { =20 .set =3D ethnl_set_plca, .set_ntf_cmd =3D ETHTOOL_MSG_PLCA_NTF, + + .dump_start =3D ethnl_dump_start_perphy, + .dump_one_dev =3D ethnl_dump_one_dev_perphy, + .dump_done =3D ethnl_dump_done_perphy, + + .allow_pernetdev_dump =3D true, }; =20 // PLCA get status message -----------------------------------------------= --- // @@ -268,4 +274,10 @@ const struct ethnl_request_ops ethnl_plca_status_reque= st_ops =3D { .prepare_data =3D plca_get_status_prepare_data, .reply_size =3D plca_get_status_reply_size, .fill_reply =3D plca_get_status_fill_reply, + + .dump_start =3D ethnl_dump_start_perphy, + .dump_one_dev =3D ethnl_dump_one_dev_perphy, + .dump_done =3D ethnl_dump_done_perphy, + + .allow_pernetdev_dump =3D true, }; --=20 2.48.1 From nobody Sun Feb 8 02:56:12 2026 Received: from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net [217.70.183.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D104E1E51FD; Sat, 8 Mar 2025 15:54:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.70.183.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741449298; cv=none; b=MtYHEo7oe0vc8F2G97NTxEvXoGcrGP2Bn77qDsz+XdJIESYCnlgh7P2WzSZyIsi81VFKXk4sB8TwAGJHFezfuDLDCvvGeGIDrnKguPujXrRUlu1Y8BA6kvMsIMbDqQrLe52IoZwEBvi3hecO8xhZukOucjxGr3hulY9+ebDtbso= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741449298; c=relaxed/simple; bh=0mfjyXKIgmzvaAX9DA1hxS8ulnzghvGnKD6Ne4Ff0/U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jGZgp5727eZt4Gc/PMp4fo6kBRvsDvRBuNe1oOA2MwcjQ2ehfFdb8uYUhyQslB+AOalVPTljmTLIVY9Gk+GI6xIkPwr09vYYcU+jsmfIGuD0s996QeeIicIhOvxpsv4UE6JBRjrgjb0809TzjT9r4nhVxLG2bQFW1MThZ1LXCtY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=aq2NocH9; arc=none smtp.client-ip=217.70.183.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="aq2NocH9" Received: by mail.gandi.net (Postfix) with ESMTPSA id D4ADB2057E; Sat, 8 Mar 2025 15:54:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=gm1; t=1741449294; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ILe6nI6Ki42KcccEbLeCevH0sAe1JndgxjyaSZB5rZs=; b=aq2NocH9h4KO6RCWTD52ysb3UUY2rngTh3huiE4ND/emR2/PwABy1MuqxzlmAip9zYh/W4 Zsx9fYHsmJ3Qi+n8kIDp0z0bTCqfU9+EJAHOjobYGkgw9ubSnPwQahh9BzU/fMCvI9jelf FuEMWNITeyVkgcpnkO8Fb0iKqNixvJCUhocZNJ4hsasQZg7FufYYlFyzflsbD4PIHFw4Vw U+1e3/hMRw8lDZATB8pbRCslz0nIGoEWiMoE5NHIDHOicCq3xpXcYyG0hBaS730cuuVBDI naBi3rON3vRnk1/LuJaoKzTg/12N0eMiLyqlVsMgEy3M7YYKNsKWZjgpz11YqA== From: Maxime Chevallier To: davem@davemloft.net, Andrew Lunn , Jakub Kicinski , Eric Dumazet , Paolo Abeni , Heiner Kallweit Cc: Maxime Chevallier , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, thomas.petazzoni@bootlin.com, linux-arm-kernel@lists.infradead.org, Christophe Leroy , Herve Codina , Florian Fainelli , Russell King , Vladimir Oltean , =?UTF-8?q?K=C3=B6ry=20Maincent?= , Oleksij Rempel , Simon Horman , Romain Gantois , Piergiorgio Beruto , Stanislav Fomichev Subject: [PATCH net-next v2 7/7] net: ethtool: pse-pd: Use per-PHY DUMP operations Date: Sat, 8 Mar 2025 16:54:39 +0100 Message-ID: <20250308155440.267782-8-maxime.chevallier@bootlin.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250308155440.267782-1-maxime.chevallier@bootlin.com> References: <20250308155440.267782-1-maxime.chevallier@bootlin.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeefvddrtddtgdduudefleeiucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuifetpfffkfdpucggtfgfnhhsuhgsshgtrhhisggvnecuuegrihhlohhuthemuceftddunecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjughrpefhvfevufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpeforgigihhmvgcuvehhvghvrghllhhivghruceomhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomheqnecuggftrfgrthhtvghrnhepveegtdffleffleevueellefgjeefvedvjefhheegfefgffdvfeetgeevudetffdtnecukfhppedvrgdtudemtggsudelmeekugegtgemlehftddtmegstgdvudemkeekleelmeehgedttgemvgehlegvnecuvehluhhsthgvrhfuihiivgepgeenucfrrghrrghmpehinhgvthepvdgrtddumegtsgduleemkegugegtmeelfhdttdemsggtvddumeekkeelleemheegtdgtmegvheelvgdphhgvlhhopehfvgguohhrrgdrhhhomhgvpdhmrghilhhfrhhomhepmhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomhdpnhgspghrtghpthhtohepvddvpdhrtghpthhtohepuggrvhgvmhesuggrvhgvmhhlohhfthdrnhgvthdprhgtphhtthhopegrnhgurhgvfieslhhunhhnrdgthhdprhgtphhtthhopehkuhgsrgeskhgvrhhnvghlrdhorhhgpdhrtghpthhtohepvgguuhhmr giivghtsehgohhoghhlvgdrtghomhdprhgtphhtthhopehprggsvghnihesrhgvughhrghtrdgtohhmpdhrtghpthhtohephhhkrghllhifvghithdusehgmhgrihhlrdgtohhmpdhrtghpthhtohepmhgrgihimhgvrdgthhgvvhgrlhhlihgvrhessghoohhtlhhinhdrtghomhdprhgtphhtthhopehnvghtuggvvhesvhhgvghrrdhkvghrnhgvlhdrohhrgh X-GND-Sasl: maxime.chevallier@bootlin.com Content-Type: text/plain; charset="utf-8" Leverage the per-phy ethnl DUMP helpers in case we have more that one PSE PHY on the link. Signed-off-by: Maxime Chevallier --- V2: No changes net/ethtool/pse-pd.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/net/ethtool/pse-pd.c b/net/ethtool/pse-pd.c index 4f6b99eab2a6..f3d14be8bdd9 100644 --- a/net/ethtool/pse-pd.c +++ b/net/ethtool/pse-pd.c @@ -314,4 +314,10 @@ const struct ethnl_request_ops ethnl_pse_request_ops = =3D { =20 .set =3D ethnl_set_pse, /* PSE has no notification */ + + .dump_start =3D ethnl_dump_start_perphy, + .dump_one_dev =3D ethnl_dump_one_dev_perphy, + .dump_done =3D ethnl_dump_done_perphy, + + .allow_pernetdev_dump =3D true, }; --=20 2.48.1