[net-next,05/12] net: ethtool: create and export ethtool_dev_mm_supported()

Message ID 20230216232126.3402975-6-vladimir.oltean@nxp.com
State New
Headers
Series Add tc-mqprio and tc-taprio support for preemptible traffic classes |

Commit Message

Vladimir Oltean Feb. 16, 2023, 11:21 p.m. UTC
  Create a wrapper over __ethtool_dev_mm_supported() which also calls
ethnl_ops_begin() and ethnl_ops_complete(). It can be used by other code
layers, such as tc, to make sure that preemptible TCs are supported
(this is true if an underlying MAC Merge layer exists).

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
 include/linux/ethtool_netlink.h |  6 ++++++
 net/ethtool/mm.c                | 22 ++++++++++++++++++++++
 net/sched/sch_mqprio.c          |  1 +
 3 files changed, 29 insertions(+)
  

Comments

Vladimir Oltean Feb. 17, 2023, 1 p.m. UTC | #1
On Fri, Feb 17, 2023 at 01:21:19AM +0200, Vladimir Oltean wrote:
> +bool ethtool_dev_mm_supported(struct net_device *dev)
> +{
> +	const struct ethtool_ops *ops = dev->ethtool_ops;
> +	bool supported;
> +	int ret;
> +
> +	ASSERT_RTNL();
> +
> +	if (!ops)
> +		return false;
> +
> +	ret = ethnl_ops_begin(dev);
> +	if (ret < 0)
> +		return false;
> +
> +	supported = __ethtool_dev_mm_supported(dev);
> +
> +	ethnl_ops_complete(dev);
> +
> +	return supported;
> +}

In the first patch that uses this:

ERROR: modpost: "ethtool_dev_mm_supported" [net/sched/sch_mqprio.ko] undefined!

due to a missing EXPORT_SYMBOL_GPL(). Sorry.
  

Patch

diff --git a/include/linux/ethtool_netlink.h b/include/linux/ethtool_netlink.h
index 17003b385756..fae0dfb9a9c8 100644
--- a/include/linux/ethtool_netlink.h
+++ b/include/linux/ethtool_netlink.h
@@ -39,6 +39,7 @@  void ethtool_aggregate_pause_stats(struct net_device *dev,
 				   struct ethtool_pause_stats *pause_stats);
 void ethtool_aggregate_rmon_stats(struct net_device *dev,
 				  struct ethtool_rmon_stats *rmon_stats);
+bool ethtool_dev_mm_supported(struct net_device *dev);
 
 #else
 static inline int ethnl_cable_test_alloc(struct phy_device *phydev, u8 cmd)
@@ -112,5 +113,10 @@  ethtool_aggregate_rmon_stats(struct net_device *dev,
 {
 }
 
+static inline bool ethtool_dev_mm_supported(struct net_device *dev)
+{
+	return false;
+}
+
 #endif /* IS_ENABLED(CONFIG_ETHTOOL_NETLINK) */
 #endif /* _LINUX_ETHTOOL_NETLINK_H_ */
diff --git a/net/ethtool/mm.c b/net/ethtool/mm.c
index fce3cc2734f9..87d9682efadd 100644
--- a/net/ethtool/mm.c
+++ b/net/ethtool/mm.c
@@ -249,3 +249,25 @@  bool __ethtool_dev_mm_supported(struct net_device *dev)
 
 	return !ret;
 }
+
+bool ethtool_dev_mm_supported(struct net_device *dev)
+{
+	const struct ethtool_ops *ops = dev->ethtool_ops;
+	bool supported;
+	int ret;
+
+	ASSERT_RTNL();
+
+	if (!ops)
+		return false;
+
+	ret = ethnl_ops_begin(dev);
+	if (ret < 0)
+		return false;
+
+	supported = __ethtool_dev_mm_supported(dev);
+
+	ethnl_ops_complete(dev);
+
+	return supported;
+}
diff --git a/net/sched/sch_mqprio.c b/net/sched/sch_mqprio.c
index 48ed87b91086..f0232783ced7 100644
--- a/net/sched/sch_mqprio.c
+++ b/net/sched/sch_mqprio.c
@@ -5,6 +5,7 @@ 
  * Copyright (c) 2010 John Fastabend <john.r.fastabend@intel.com>
  */
 
+#include <linux/ethtool_netlink.h>
 #include <linux/types.h>
 #include <linux/slab.h>
 #include <linux/kernel.h>