From: Breno Leitao <leitao@debian.org>
To: "David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>,
Paolo Abeni <pabeni@redhat.com>, Simon Horman <horms@kernel.org>,
Andrew Lunn <andrew+netdev@lunn.ch>,
Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
Clark Williams <clrkwllms@kernel.org>,
Steven Rostedt <rostedt@goodmis.org>
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-rt-devel@lists.linux.dev, Breno Leitao <leitao@debian.org>,
kernel-team@meta.com
Subject: [PATCH net-next 8/8] netconsole: move find_skb() from netpoll
Date: Fri, 08 May 2026 06:29:22 -0700 [thread overview]
Message-ID: <20260508-netconsole_split-v1-8-0f660e62841f@debian.org> (raw)
In-Reply-To: <20260508-netconsole_split-v1-0-0f660e62841f@debian.org>
find_skb() is the netconsole-specific entry into the netpoll skb
pool: every other netpoll consumer (bonding, team, vlan, bridge,
macvlan, dsa) builds its own sk_buff and never touches the pool.
With netpoll_send_udp() (its only caller) now living in netconsole,
find_skb() can join it.
Move find_skb() into drivers/net/netconsole.c as a file-static
helper, drop EXPORT_SYMBOL_GPL(find_skb) and remove its prototype
from include/linux/netpoll.h.
find_skb() calls zap_completion_queue() to drain TX completions
before allocating. zap_completion_queue() also has a second caller
inside netpoll itself (netpoll_poll_dev() runs it after each poll
to free completed skbs), so it stays in net/core/netpoll.c.
Promote it from file-static to EXPORT_SYMBOL_GPL with a forward
declaration in include/linux/netpoll.h, and drop its old
file-static forward declaration.
The skb pool's lifecycle (np->skb_pool, np->refill_wq, refill_skbs(),
refill_skbs_work_handler(), skb_pool_flush()) stays in netpoll: it
is initialised in __netpoll_setup() and torn down in
__netpoll_cleanup(), both of which remain netpoll's responsibility.
The refill work queued via schedule_work(&np->refill_wq) from the
moved find_skb() runs refill_skbs_work_handler() in netpoll without
any further plumbing.
Signed-off-by: Breno Leitao <leitao@debian.org>
---
drivers/net/netconsole.c | 27 +++++++++++++++++++++++++++
include/linux/netpoll.h | 2 +-
net/core/netpoll.c | 33 ++-------------------------------
3 files changed, 30 insertions(+), 32 deletions(-)
diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c
index 48d2670bbdef5..817561d8b06bb 100644
--- a/drivers/net/netconsole.c
+++ b/drivers/net/netconsole.c
@@ -1653,6 +1653,33 @@ static struct notifier_block netconsole_netdev_notifier = {
.notifier_call = netconsole_netdev_event,
};
+static struct sk_buff *find_skb(struct netpoll *np, int len, int reserve)
+{
+ int count = 0;
+ struct sk_buff *skb;
+
+ zap_completion_queue();
+repeat:
+
+ skb = alloc_skb(len, GFP_ATOMIC);
+ if (!skb) {
+ skb = skb_dequeue(&np->skb_pool);
+ schedule_work(&np->refill_wq);
+ }
+
+ if (!skb) {
+ if (++count < 10) {
+ netpoll_poll_dev(np->dev);
+ goto repeat;
+ }
+ return NULL;
+ }
+
+ refcount_set(&skb->users, 1);
+ skb_reserve(skb, reserve);
+ return skb;
+}
+
static void netpoll_udp_checksum(struct netpoll *np, struct sk_buff *skb,
int len)
{
diff --git a/include/linux/netpoll.h b/include/linux/netpoll.h
index 1877d42ccbccf..c9a03d88263ef 100644
--- a/include/linux/netpoll.h
+++ b/include/linux/netpoll.h
@@ -73,7 +73,7 @@ void __netpoll_free(struct netpoll *np);
void netpoll_cleanup(struct netpoll *np);
void do_netpoll_cleanup(struct netpoll *np);
netdev_tx_t netpoll_send_skb(struct netpoll *np, struct sk_buff *skb);
-struct sk_buff *find_skb(struct netpoll *np, int len, int reserve);
+void zap_completion_queue(void);
#ifdef CONFIG_NETPOLL
static inline void *netpoll_poll_lock(struct napi_struct *napi)
diff --git a/net/core/netpoll.c b/net/core/netpoll.c
index c148b3b68cec9..956528904050e 100644
--- a/net/core/netpoll.c
+++ b/net/core/netpoll.c
@@ -51,8 +51,6 @@
sizeof(struct udphdr) + \
MAX_UDP_CHUNK)
-static void zap_completion_queue(void);
-
static unsigned int carrier_timeout = 4;
module_param(carrier_timeout, uint, 0644);
@@ -238,7 +236,7 @@ static void refill_skbs(struct netpoll *np)
}
}
-static void zap_completion_queue(void)
+void zap_completion_queue(void)
{
unsigned long flags;
struct softnet_data *sd = &get_cpu_var(softnet_data);
@@ -265,34 +263,7 @@ static void zap_completion_queue(void)
put_cpu_var(softnet_data);
}
-
-struct sk_buff *find_skb(struct netpoll *np, int len, int reserve)
-{
- int count = 0;
- struct sk_buff *skb;
-
- zap_completion_queue();
-repeat:
-
- skb = alloc_skb(len, GFP_ATOMIC);
- if (!skb) {
- skb = skb_dequeue(&np->skb_pool);
- schedule_work(&np->refill_wq);
- }
-
- if (!skb) {
- if (++count < 10) {
- netpoll_poll_dev(np->dev);
- goto repeat;
- }
- return NULL;
- }
-
- refcount_set(&skb->users, 1);
- skb_reserve(skb, reserve);
- return skb;
-}
-EXPORT_SYMBOL_GPL(find_skb);
+EXPORT_SYMBOL_GPL(zap_completion_queue);
static int netpoll_owner_active(struct net_device *dev)
{
--
2.53.0-Meta
next prev parent reply other threads:[~2026-05-08 13:30 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-08 13:29 [PATCH net-next 0/8] netpoll: move out netconsole-specific functions Breno Leitao
2026-05-08 13:29 ` [PATCH net-next 1/8] netpoll: expose UDP packet builder helpers for netconsole Breno Leitao
2026-05-08 13:29 ` [PATCH net-next 2/8] netconsole: move netpoll_send_udp() from netpoll Breno Leitao
2026-05-08 13:29 ` [PATCH net-next 3/8] netconsole: move push_ipv6() " Breno Leitao
2026-05-08 13:29 ` [PATCH net-next 4/8] netconsole: move push_ipv4() " Breno Leitao
2026-05-08 13:29 ` [PATCH net-next 5/8] netconsole: move push_eth() " Breno Leitao
2026-05-08 13:29 ` [PATCH net-next 6/8] netconsole: move push_udp() " Breno Leitao
2026-05-08 13:29 ` [PATCH net-next 7/8] netconsole: move netpoll_udp_checksum() " Breno Leitao
2026-05-08 13:29 ` Breno Leitao [this message]
2026-05-12 1:37 ` [PATCH net-next 8/8] netconsole: move find_skb() " Jakub Kicinski
2026-05-12 7:50 ` Breno Leitao
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=20260508-netconsole_split-v1-8-0f660e62841f@debian.org \
--to=leitao@debian.org \
--cc=andrew+netdev@lunn.ch \
--cc=bigeasy@linutronix.de \
--cc=clrkwllms@kernel.org \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=kernel-team@meta.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rt-devel@lists.linux.dev \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=rostedt@goodmis.org \
/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