[PATCH net-next 3/9] netconsole: take over netpoll_setup() from netpoll
From: Breno Leitao
Date: Fri Jul 24 2026 - 11:24:14 EST
netpoll_setup() is only used by netconsole. All the other users use
__netpoll_setup().
Move netpoll_setup() to netconsole, and rename it to
netcons_netpoll_setup().
Pure code motion: the body is unchanged.
Signed-off-by: Breno Leitao <leitao@xxxxxxxxxx>
---
drivers/net/netconsole.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++--
include/linux/netpoll.h | 1 -
net/core/netpoll.c | 81 ---------------------------------------------
3 files changed, 83 insertions(+), 85 deletions(-)
diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c
index 7f8851a734fcd..3a7a2cafc6276 100644
--- a/drivers/net/netconsole.c
+++ b/drivers/net/netconsole.c
@@ -351,6 +351,86 @@ static void netconsole_skb_pool_flush(struct netconsole_target *nt)
skb_queue_purge_reason(&nt->skb_pool, SKB_CONSUMED);
}
+static int netcons_netpoll_setup(struct netpoll *np)
+{
+ struct net *net = current->nsproxy->net_ns;
+ char buf[MAC_ADDR_STR_LEN + 1];
+ struct net_device *ndev = NULL;
+ bool ip_overwritten = false;
+ int err;
+
+ rtnl_lock();
+ if (np->dev_name[0])
+ ndev = __dev_get_by_name(net, np->dev_name);
+ else if (is_valid_ether_addr(np->dev_mac))
+ ndev = dev_getbyhwaddr(net, ARPHRD_ETHER, np->dev_mac);
+
+ if (!ndev) {
+ np_err(np, "%s doesn't exist, aborting\n",
+ egress_dev(np, buf, sizeof(buf)));
+ err = -ENODEV;
+ goto unlock;
+ }
+ netdev_hold(ndev, &np->dev_tracker, GFP_KERNEL);
+
+ if (netdev_master_upper_dev_get(ndev)) {
+ np_err(np, "%s is a slave device, aborting\n",
+ egress_dev(np, buf, sizeof(buf)));
+ err = -EBUSY;
+ goto put;
+ }
+
+ if (!netif_running(ndev)) {
+ np_info(np, "device %s not up yet, forcing it\n",
+ egress_dev(np, buf, sizeof(buf)));
+
+ err = dev_open(ndev, NULL);
+ if (err) {
+ np_err(np, "failed to open %s\n", ndev->name);
+ goto put;
+ }
+
+ rtnl_unlock();
+ netpoll_wait_carrier(np, ndev);
+ rtnl_lock();
+ }
+
+ if (netpoll_local_ip_unset(np)) {
+ if (!np->ipv6) {
+ err = netpoll_take_ipv4(np, ndev);
+ if (err)
+ goto put;
+ } else {
+ err = netpoll_take_ipv6(np, ndev);
+ if (err)
+ goto put;
+ }
+ ip_overwritten = true;
+ }
+
+ err = __netpoll_setup(np, ndev);
+ if (err)
+ goto put;
+ rtnl_unlock();
+
+ /* Make sure all NAPI polls which started before dev->npinfo
+ * was visible have exited before we start calling NAPI poll.
+ * NAPI skips locking if dev->npinfo is NULL.
+ */
+ synchronize_rcu();
+
+ return 0;
+
+put:
+ DEBUG_NET_WARN_ON_ONCE(np->dev);
+ if (ip_overwritten)
+ memset(&np->local_ip, 0, sizeof(np->local_ip));
+ netdev_put(ndev, &np->dev_tracker);
+unlock:
+ rtnl_unlock();
+ return err;
+}
+
/* Attempts to resume logging to a deactivated target. */
static void resume_target(struct netconsole_target *nt)
{
@@ -361,7 +441,7 @@ static void resume_target(struct netconsole_target *nt)
*/
netconsole_skb_pool_init(nt);
- if (netpoll_setup(&nt->np)) {
+ if (netcons_netpoll_setup(&nt->np)) {
/* netpoll fails setup once, do not try again. */
netconsole_skb_pool_flush(nt);
nt->state = STATE_DISABLED;
@@ -840,7 +920,7 @@ static ssize_t enabled_store(struct config_item *item,
*/
netconsole_skb_pool_init(nt);
- ret = netpoll_setup(&nt->np);
+ ret = netcons_netpoll_setup(&nt->np);
if (ret) {
netconsole_skb_pool_flush(nt);
goto out_unlock;
@@ -2430,7 +2510,7 @@ static struct netconsole_target *alloc_param_target(char *target_config,
*/
netconsole_skb_pool_init(nt);
- err = netpoll_setup(&nt->np);
+ err = netcons_netpoll_setup(&nt->np);
if (err) {
pr_err("Not enabling netconsole for %s%d. Netpoll setup failed\n",
NETCONSOLE_PARAM_TARGET_PREFIX, cmdline_count);
diff --git a/include/linux/netpoll.h b/include/linux/netpoll.h
index 0877515fa7442..cd455a5a013d2 100644
--- a/include/linux/netpoll.h
+++ b/include/linux/netpoll.h
@@ -66,7 +66,6 @@ static inline void netpoll_poll_enable(struct net_device *dev) { return; }
#endif
int __netpoll_setup(struct netpoll *np, struct net_device *ndev);
-int netpoll_setup(struct netpoll *np);
void __netpoll_free(struct netpoll *np);
void netpoll_cleanup(struct netpoll *np);
void do_netpoll_cleanup(struct netpoll *np);
diff --git a/net/core/netpoll.c b/net/core/netpoll.c
index 6a545063223ba..d50d48a82def6 100644
--- a/net/core/netpoll.c
+++ b/net/core/netpoll.c
@@ -514,87 +514,6 @@ bool netpoll_local_ip_unset(const struct netpoll *np)
}
EXPORT_SYMBOL_GPL(netpoll_local_ip_unset);
-int netpoll_setup(struct netpoll *np)
-{
- struct net *net = current->nsproxy->net_ns;
- char buf[MAC_ADDR_STR_LEN + 1];
- struct net_device *ndev = NULL;
- bool ip_overwritten = false;
- int err;
-
- rtnl_lock();
- if (np->dev_name[0])
- ndev = __dev_get_by_name(net, np->dev_name);
- else if (is_valid_ether_addr(np->dev_mac))
- ndev = dev_getbyhwaddr(net, ARPHRD_ETHER, np->dev_mac);
-
- if (!ndev) {
- np_err(np, "%s doesn't exist, aborting\n",
- egress_dev(np, buf, sizeof(buf)));
- err = -ENODEV;
- goto unlock;
- }
- netdev_hold(ndev, &np->dev_tracker, GFP_KERNEL);
-
- if (netdev_master_upper_dev_get(ndev)) {
- np_err(np, "%s is a slave device, aborting\n",
- egress_dev(np, buf, sizeof(buf)));
- err = -EBUSY;
- goto put;
- }
-
- if (!netif_running(ndev)) {
- np_info(np, "device %s not up yet, forcing it\n",
- egress_dev(np, buf, sizeof(buf)));
-
- err = dev_open(ndev, NULL);
- if (err) {
- np_err(np, "failed to open %s\n", ndev->name);
- goto put;
- }
-
- rtnl_unlock();
- netpoll_wait_carrier(np, ndev);
- rtnl_lock();
- }
-
- if (netpoll_local_ip_unset(np)) {
- if (!np->ipv6) {
- err = netpoll_take_ipv4(np, ndev);
- if (err)
- goto put;
- } else {
- err = netpoll_take_ipv6(np, ndev);
- if (err)
- goto put;
- }
- ip_overwritten = true;
- }
-
- err = __netpoll_setup(np, ndev);
- if (err)
- goto put;
- rtnl_unlock();
-
- /* Make sure all NAPI polls which started before dev->npinfo
- * was visible have exited before we start calling NAPI poll.
- * NAPI skips locking if dev->npinfo is NULL.
- */
- synchronize_rcu();
-
- return 0;
-
-put:
- DEBUG_NET_WARN_ON_ONCE(np->dev);
- if (ip_overwritten)
- memset(&np->local_ip, 0, sizeof(np->local_ip));
- netdev_put(ndev, &np->dev_tracker);
-unlock:
- rtnl_unlock();
- return err;
-}
-EXPORT_SYMBOL(netpoll_setup);
-
static void rcu_cleanup_netpoll_info(struct rcu_head *rcu_head)
{
struct netpoll_info *npinfo =
--
2.53.0-Meta