From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-oi1-f181.google.com (mail-oi1-f181.google.com [209.85.167.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 640873A962E for ; Sun, 24 May 2026 16:12:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.181 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779639155; cv=none; b=BEWeIT5fGCSMcuxQnySp5QQaetiG2Uc4U1aU7X2kvoBPPbjsoNqQAxChZr2Z1hcQboRpDAwVOjX0bwts1Rbl+FnxMcNBN1bRRCE1SjkRZMYHo4nwe6wXy7LX39jOXHeiDZ/mAICzneDRfIgG0nAqk/njfR87N/NYrsKKwhZCZaE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779639155; c=relaxed/simple; bh=9Io60ANRnBsmyAgRWfG1mFkAHxHn3SG2P8y1eiYREg0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HKm/LkSUTiT5c8nmZKs/gAho2iH8HlFYeC7HD0VBSywzZoCD8cDdlxs5FEPAtplyh3xNWAmxxxSN61kTw8kGBkzVAD00Eon/23GSEqCed8glx7DJ4EnThPeoFcQdW0ZMOr7HD23SHxNooe/VCjhcvZtR4lJ4ik8FeGotIHqYu2g= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=fail (p=none dis=none) header.from=debian.org; spf=pass smtp.mailfrom=gmail.com; arc=none smtp.client-ip=209.85.167.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=none dis=none) header.from=debian.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-oi1-f181.google.com with SMTP id 5614622812f47-4855e69a4c0so1757997b6e.1 for ; Sun, 24 May 2026 09:12:31 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779639150; x=1780243950; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=qOCvAbA4VDDlZEPxROsjDedDXmikIirSU/l9zKPktHc=; b=WBbkmjez2wmeF7LkJ6EHZ3u1znc3sZHxIfVfd9Nqgl6g2xxdoDBi/+NdA7EYPaGKJ+ b+2bRYJBLBj0NcP60I2oJ9eFEWIAB75vP4RtEUSIbF4oLRDbNi3vU51Gf9ryHH3ChtqH 22+YyCro1Vp3Fk7UNFoeOgY6iNGmchtBFBjSRAFLA+Ojv/Eq3FTKvaYtS9OsRy9/R8Zh hNZp9Taev0FV0hqdkJCzUI21jXfADICeGZqIkNlfrIlecGy9rtWIbTtKD3pOOe7YFGlW dUmYr3zkqq6ZyonPtHc1U6YCdqLTYUOF9asHEKwJ71DIkD5R4QV932toPw2F8mZ1o37A 0rCA== X-Forwarded-Encrypted: i=1; AFNElJ+g55TlAON/31vK/jYZJj6ZcfKelF72grTHOx5GOqt9O57ubPg76V46n37ccpKuD6i3WAIFp+PpqTEwKpY=@vger.kernel.org X-Gm-Message-State: AOJu0Yy9gu1Nx8Peq/hutBcmVx8bzE+TjOs7u+kb362u00RAxqjQeYgi zYIXsOnD5f2Mo5VD+m4RkrAN9/RSianaQHS/PopXiPfLuxhgX8fNX0br X-Gm-Gg: Acq92OFBjZtDSkZ/9FS+gChonzBzpO9nnr5LjK5GBimQYc768X8CfVZIZZus5R4/4kM hiefDmg9nm64IrIl8TNs3RPwa3ezPFe+fmserfuB1bKGq5irSXrtnDTRMtSRNs7Q8aDkISv00P2 TCKIdiiec436Hfxp9aTCn0Fd6Vz4NZC9XpZIt1OscEdjdWkKXxRIIEC7A86yjBA/1gJk51ogInJ JUWY7EGWsG/aZckV7AR+Q7YxEXmaq9nOq3e/09WYmtRTNtTZA/fV2cMODKUAuXXXi5I7oYtpG5D wRuLd5SzFE1a3PY3hPNKLIp19Z5z7jRw5eqlmKJNFds6pwfyQfU8x1ekBxj2OQqSKoDmodo/niz kyT1qBUV8++PZEKsuw4b7iicP0xMssyNVYVl0c3GmLDrI8tVGcK0io3gIAKb3P3QV7iBmNzyBDK R/EO0LtQV8v6ityw== X-Received: by 2002:a05:6808:c1cb:b0:485:29ad:d19e with SMTP id 5614622812f47-4854a4101c8mr7027942b6e.47.1779639150174; Sun, 24 May 2026 09:12:30 -0700 (PDT) Received: from localhost ([2a03:2880:10ff:40::]) by smtp.gmail.com with ESMTPSA id 5614622812f47-4855476ab77sm3537709b6e.17.2026.05.24.09.12.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 24 May 2026 09:12:29 -0700 (PDT) From: Breno Leitao Date: Sun, 24 May 2026 09:12:22 -0700 Subject: [PATCH 6/9] netconsole: move skb_pool / refill_wq from struct netpoll to netconsole_target Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260524-netconsole_move_more-v1-6-909d1ab398b4@debian.org> References: <20260524-netconsole_move_more-v1-0-909d1ab398b4@debian.org> In-Reply-To: <20260524-netconsole_move_more-v1-0-909d1ab398b4@debian.org> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Andrew Lunn Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, gustavold@gmail.com, asantostc@gmail.com, Breno Leitao , kernel-team@meta.com X-Mailer: b4 0.16-dev-d5d98 X-Developer-Signature: v=1; a=openpgp-sha256; l=5953; i=leitao@debian.org; h=from:subject:message-id; bh=9Io60ANRnBsmyAgRWfG1mFkAHxHn3SG2P8y1eiYREg0=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBqEyNlUbp4nQefRCtC5/vbsMc4cAMNs/0r5BwbX /S8XQZfT06JAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCahMjZQAKCRA1o5Of/Hh3 benfEACE+hT0Yf5LSCZ0h7++UVe8bzUB85RUWo4VvcPTtMprC/g0BIRnG7RDeSX4+pszi/lqSlt bB+5jquAksoVTFnCEOoQbJjYrFYaJcPxI8bN2G1lXWK3tUryhMSdLdTEfn3VhiymLj6beXZsFIR eS5TeR0jW64qj/lx9wrtsAuznGjbFUvlJCyyy89lHYx/frW2LORvkSP2yq+wkqc0pIc7sgfRXm2 CFDsNIJ/MQ/th5hwoNzFrzM5Lcmn1VFAlLVwyCti2PRDiqurGooGpQC/Fz5t5P+xeTcQIfDAsJV Ez5hC72zEon9+eNRit+c8PWCROVIYRwiR+HHLHg38QTlwYGn4Qz398PPzSKqQ79FZRADBI3seW1 F3sy63JV2u1zVEdPPtQuP5ZLajmv9jZXIwic3S3VBVtx4OaeeIZvc8JAoSQFU//fJjRFyBjJB3z gHqkixZWn9y3UPk5Y+knN5eSmWuMElOKmswD+ww9xAuNs2vwqagdqnQ902/zk8kT593Q0ITsBwO +VCCUQaSDrAgkLuzPhPeg3xYwCq5n2bDRREvLc80cneh5CSHF117sym4N/yf49W5frzYkt8Xnhq IyCIcvX6+MCFzmRZdRxSkVaoN2vpBzsP6wMNDzAUPmE/rUwdvloEUzpZ6Z7hFRbUnUWD2lhvg+G zef7+cvpofPhxLQ== X-Developer-Key: i=leitao@debian.org; a=openpgp; fpr=AC8539A6E8F46702CA4A439B35A3939FFC78776D These two fields back the fallback skb pool that find_skb() uses. Every helper that touches them lives in netconsole now (refill_skbs, refill_skbs_work_handler, netconsole_skb_pool_init, netconsole_skb_pool_flush, find_skb), so the data can move alongside its only consumer. Add skb_pool and refill_wq to struct netconsole_target, drop them from struct netpoll, and update the helpers and find_skb() to take a struct netconsole_target * and reach the pool through nt-> rather than np->. Thread nt through netpoll_send_udp() so its only caller in send_udp() can pass nt directly. struct netpoll shrinks by sizeof(sk_buff_head) + sizeof(work_struct) for every consumer, including bonding, bridge, team, vlan, macvlan and dsa, which carried the fields as dead weight. Signed-off-by: Breno Leitao --- drivers/net/netconsole.c | 47 +++++++++++++++++++++++++++-------------------- include/linux/netpoll.h | 2 -- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index a8ced60bef7a..b8b1608d09e9 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -183,6 +183,11 @@ enum target_state { * remote_mac (read-write) * @buf: The buffer used to send the full msg to the network stack * @resume_wq: Workqueue to resume deactivated target + * @skb_pool: Per-target fallback skb pool consulted by find_skb() when + * its GFP_ATOMIC allocation fails. Lifetime brackets a + * successful netpoll_setup() / netpoll_cleanup() pair on @np. + * @refill_wq: Work item that asynchronously tops @skb_pool back up to + * MAX_SKBS after find_skb() drains an entry. */ struct netconsole_target { struct list_head list; @@ -206,6 +211,8 @@ struct netconsole_target { /* protected by target_list_lock */ char buf[MAX_PRINT_CHUNK]; struct work_struct resume_wq; + struct sk_buff_head skb_pool; + struct work_struct refill_wq; }; #ifdef CONFIG_NETCONSOLE_DYNAMIC @@ -296,13 +303,11 @@ static bool bound_by_mac(struct netconsole_target *nt) return is_valid_ether_addr(nt->np.dev_mac); } -static void refill_skbs(struct netpoll *np) +static void refill_skbs(struct netconsole_target *nt) { - struct sk_buff_head *skb_pool; + struct sk_buff_head *skb_pool = &nt->skb_pool; struct sk_buff *skb; - skb_pool = &np->skb_pool; - while (READ_ONCE(skb_pool->qlen) < MAX_SKBS) { skb = alloc_skb(MAX_SKB_SIZE, GFP_ATOMIC); if (!skb) @@ -314,10 +319,10 @@ static void refill_skbs(struct netpoll *np) static void refill_skbs_work_handler(struct work_struct *work) { - struct netpoll *np = - container_of(work, struct netpoll, refill_wq); + struct netconsole_target *nt = + container_of(work, struct netconsole_target, refill_wq); - refill_skbs(np); + refill_skbs(nt); } /* Initialise the per-target skb pool that find_skb() falls back to and @@ -326,17 +331,15 @@ static void refill_skbs_work_handler(struct work_struct *work) */ static void netconsole_skb_pool_init(struct netconsole_target *nt) { - skb_queue_head_init(&nt->np.skb_pool); - INIT_WORK(&nt->np.refill_wq, refill_skbs_work_handler); - refill_skbs(&nt->np); + skb_queue_head_init(&nt->skb_pool); + INIT_WORK(&nt->refill_wq, refill_skbs_work_handler); + refill_skbs(nt); } static void netconsole_skb_pool_flush(struct netconsole_target *nt) { - struct netpoll *np = &nt->np; - - cancel_work_sync(&np->refill_wq); - skb_queue_purge_reason(&np->skb_pool, SKB_CONSUMED); + cancel_work_sync(&nt->refill_wq); + skb_queue_purge_reason(&nt->skb_pool, SKB_CONSUMED); } /* Attempts to resume logging to a deactivated target. */ @@ -1731,8 +1734,10 @@ 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) +static struct sk_buff *find_skb(struct netconsole_target *nt, int len, + int reserve) { + struct netpoll *np = &nt->np; int count = 0; struct sk_buff *skb; @@ -1741,8 +1746,8 @@ static struct sk_buff *find_skb(struct netpoll *np, int len, int reserve) skb = alloc_skb(len, GFP_ATOMIC); if (!skb) { - skb = skb_dequeue(&np->skb_pool); - schedule_work(&np->refill_wq); + skb = skb_dequeue(&nt->skb_pool); + schedule_work(&nt->refill_wq); } if (!skb) { @@ -1865,8 +1870,10 @@ static void push_ipv6(struct netpoll *np, struct sk_buff *skb, int len) skb->protocol = htons(ETH_P_IPV6); } -static int netpoll_send_udp(struct netpoll *np, const char *msg, int len) +static int netpoll_send_udp(struct netconsole_target *nt, const char *msg, + int len) { + struct netpoll *np = &nt->np; int total_len, ip_len, udp_len; struct sk_buff *skb; @@ -1881,7 +1888,7 @@ static int netpoll_send_udp(struct netpoll *np, const char *msg, int len) total_len = ip_len + LL_RESERVED_SPACE(np->dev); - skb = find_skb(np, total_len + np->dev->needed_tailroom, + skb = find_skb(nt, total_len + np->dev->needed_tailroom, total_len - len); if (!skb) return -ENOMEM; @@ -1912,7 +1919,7 @@ static int netpoll_send_udp(struct netpoll *np, const char *msg, int len) */ static void send_udp(struct netconsole_target *nt, const char *msg, int len) { - int result = netpoll_send_udp(&nt->np, msg, len); + int result = netpoll_send_udp(nt, msg, len); if (IS_ENABLED(CONFIG_NETCONSOLE_DYNAMIC)) { if (result == NET_XMIT_DROP) { diff --git a/include/linux/netpoll.h b/include/linux/netpoll.h index e4b8f1f91e54..8344454df05d 100644 --- a/include/linux/netpoll.h +++ b/include/linux/netpoll.h @@ -35,8 +35,6 @@ struct netpoll { bool ipv6; u16 local_port, remote_port; u8 remote_mac[ETH_ALEN]; - struct sk_buff_head skb_pool; - struct work_struct refill_wq; }; #define np_info(np, fmt, ...) \ -- 2.54.0