From: Bartosz Golaszewski <bgolaszew...@baylibre.com>

There's currently only a single devres helper in net/ - devm variant
of alloc_etherdev. Let's move it to net/devres.c with the intention of
assing a second one: devm_register_netdev(). This new routine will need
to know the address of the release function of devm_alloc_etherdev() so
that it can verify (using devres_find()) that the struct net_device
that's being passed to it is also resource managed.

Signed-off-by: Bartosz Golaszewski <bgolaszew...@baylibre.com>
---
 net/Makefile       |  2 +-
 net/devres.c       | 36 ++++++++++++++++++++++++++++++++++++
 net/ethernet/eth.c | 28 ----------------------------
 3 files changed, 37 insertions(+), 29 deletions(-)
 create mode 100644 net/devres.c

diff --git a/net/Makefile b/net/Makefile
index 07ea48160874..5744bf1997fd 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -6,7 +6,7 @@
 # Rewritten to use lists instead of if-statements.
 #
 
-obj-$(CONFIG_NET)              := socket.o core/
+obj-$(CONFIG_NET)              := devres.o socket.o core/
 
 tmp-$(CONFIG_COMPAT)           := compat.o
 obj-$(CONFIG_NET)              += $(tmp-y)
diff --git a/net/devres.c b/net/devres.c
new file mode 100644
index 000000000000..c1465d9f9019
--- /dev/null
+++ b/net/devres.c
@@ -0,0 +1,36 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * This file contains all networking devres helpers.
+ */
+
+#include <linux/device.h>
+#include <linux/etherdevice.h>
+#include <linux/netdevice.h>
+
+static void devm_free_netdev(struct device *dev, void *res)
+{
+       free_netdev(*(struct net_device **)res);
+}
+
+struct net_device *devm_alloc_etherdev_mqs(struct device *dev, int sizeof_priv,
+                                          unsigned int txqs, unsigned int rxqs)
+{
+       struct net_device **dr;
+       struct net_device *netdev;
+
+       dr = devres_alloc(devm_free_netdev, sizeof(*dr), GFP_KERNEL);
+       if (!dr)
+               return NULL;
+
+       netdev = alloc_etherdev_mqs(sizeof_priv, txqs, rxqs);
+       if (!netdev) {
+               devres_free(dr);
+               return NULL;
+       }
+
+       *dr = netdev;
+       devres_add(dev, dr);
+
+       return netdev;
+}
+EXPORT_SYMBOL(devm_alloc_etherdev_mqs);
diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c
index c8b903302ff2..dac65180c4ef 100644
--- a/net/ethernet/eth.c
+++ b/net/ethernet/eth.c
@@ -400,34 +400,6 @@ struct net_device *alloc_etherdev_mqs(int sizeof_priv, 
unsigned int txqs,
 }
 EXPORT_SYMBOL(alloc_etherdev_mqs);
 
-static void devm_free_netdev(struct device *dev, void *res)
-{
-       free_netdev(*(struct net_device **)res);
-}
-
-struct net_device *devm_alloc_etherdev_mqs(struct device *dev, int sizeof_priv,
-                                          unsigned int txqs, unsigned int rxqs)
-{
-       struct net_device **dr;
-       struct net_device *netdev;
-
-       dr = devres_alloc(devm_free_netdev, sizeof(*dr), GFP_KERNEL);
-       if (!dr)
-               return NULL;
-
-       netdev = alloc_etherdev_mqs(sizeof_priv, txqs, rxqs);
-       if (!netdev) {
-               devres_free(dr);
-               return NULL;
-       }
-
-       *dr = netdev;
-       devres_add(dev, dr);
-
-       return netdev;
-}
-EXPORT_SYMBOL(devm_alloc_etherdev_mqs);
-
 ssize_t sysfs_format_mac(char *buf, const unsigned char *addr, int len)
 {
        return scnprintf(buf, PAGE_SIZE, "%*phC\n", len, addr);
-- 
2.25.0

Reply via email to