From nobody Sun Feb 8 00:49:40 2026 Received: from mail-ej1-f44.google.com (mail-ej1-f44.google.com [209.85.218.44]) (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 E8B8C34AAF6 for ; Mon, 12 Jan 2026 09:41:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768210874; cv=none; b=Pyizluk4MA/txxNsOPjb38ETJXeCtM1QvC1ypHbrxPg8MCKzTAKGGUjpbnX5FqcVByktSMm/jG0vuC+FCzVGHO9f5z21bKkhNQ3ydJZY1BvJBsN4hIOY3gAcGdh5Ib0deXTnxS0FEEawa+Kris5HS1hlx29dEieceL9x0erv41M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768210874; c=relaxed/simple; bh=xTW7lVbfJsgnlziO9m7HRTBaTgvYhjTEK5XGbQnoB3Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mHI8Mw/1fP9jQNIsecAD+wjOLbslscuQlMocQ7a/3JA8yBImWU0ST+sid1fzeO+euZk1h5yYnJr+gtdb6T8PcTQ0Y49VXBnBB4VVwi2rcMXzemHtgRcZ5hLDer5Ch2ym2Gi5z7ZRfNrW4I4Pxv/rTOVsqA6Znw5PXPinPEhNoUw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=NcmupVpG; arc=none smtp.client-ip=209.85.218.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NcmupVpG" Received: by mail-ej1-f44.google.com with SMTP id a640c23a62f3a-b802d5e9f06so902388366b.1 for ; Mon, 12 Jan 2026 01:41:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768210866; x=1768815666; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=uKBmUb8EWfQ3VixqXwZwtOjhnNqHJe7y4QanLPyxD5w=; b=NcmupVpG3yUfEuJKyC4J5XzkgvOgSSQf0JE37JAzRCly2NVPEEjO1rxZTyr700XIXy CrHAuqTeAuwkQTfYdESbaXR82qnroBYGpfIKBcTcJmwuicEQ6PEyiF6SDtMWeu7DpmEt M/RfdExvYfpV+egXLxIh2VMUXKFp2io4r/Tqeb9KRRsbGRkcTFGwKSwCbLPZUi7AJ11U 8EYfvpw3UazwgJ8DGVLwom47h7Pc6nM8k3ARp++vmhNZ3X7rs0vqcVavlPN6nHO9XL1G 85caFPqPTNa6Cdj5M9QNQ9yaH7tR/7fPUTKhkziQSSfqq89iBEtcN/93RddXWKPw963X /lFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768210866; x=1768815666; 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=uKBmUb8EWfQ3VixqXwZwtOjhnNqHJe7y4QanLPyxD5w=; b=BUsAKsU68YmyQ5+lCHrBqTaCXbBN0loHX2zrPapYm2eiezIollK1jrlCzUBbJJqXbH f0P3JW3TfiVEq7id1vL8EV6//E92/tADNjY3UL6uNo9yW9Ij0nJribKSmYclaVRJcZot yNYEShtnoVVJ7f8/VhXgbxQCVCCRwxY6SB2z3gl7SrYs2YuR2JXBFUUwDmefFOzueqt6 NDGe+fn61cc1amA9s9V+rLWrx7pDd6JTTySUFH5GKMtslJkgZ6xLL2+ZHS+lMK6u069W Do5qabBoy11PaSahChDS1hLt3psM16n3AdYRfMnjsfB1bZA8TGybp/Bs1tc/bLHcySVK fp5A== X-Forwarded-Encrypted: i=1; AJvYcCV7hJV1U5G3GiRTLzz/fgM/5A0vMqVH4ZQf2/Q1l43scSnpMsldGzdk0e38hGqN4J2NVzdUaQbw06E9X7Q=@vger.kernel.org X-Gm-Message-State: AOJu0YwJheWWUr6T2HzVXaeq7AVi9kXiw30LdKuUhjx/cxLvmiuXpU9P SDt1t6/77bEI/iJ0p4Oyn1xUD8Eeqy58faZ+6SKcVzCDg6ISDfnFI6Py X-Gm-Gg: AY/fxX5ay6PRRFp0q8Mwr1G0ZtoJxs3VO4Am1ThTj9D73lH0psFT4QenRmiIz/Z8lzJ OGYfHl5vGpreo+ijNUFOBDj9acjXnBs39qjXpjkbrdZv2nWxXpg7v1tGI3P4DY7866gqH4opzp6 QeWmpWg16Q6+dAkspz0ce/IDcjbdRU2jGo+XDXsAQQW9wgJu9ohlVmDoBCv3523K6babkzIW2yC NugjsfPrXZx+714TVkmbU66XcF/9QuiD+nIGr2mhbW7NhW7PdtqS3JaTFjsPCJRnE6BDiRm63br VvQRjTUYSXXYuXLrH17A0qzHGHxILuPPYLysw60iT2iSZPEMm8oMEu7lAvARdTPQmvZpEtkdLO3 fsWi2S7uu0HzBQzlCjr0stw399Bsu0/6bkd5ZYkue1XOy6v+hY1qXL8ubLsENz0rzkFc3ZAVSr0 i/E0l9ZGEr6R1BIg== X-Google-Smtp-Source: AGHT+IGsuYYlcfIswN483on6lkd9zrTHj3Op5tXVtbRnccE6HxdH76+tt4k/Vdc/GSDG184bF4lJPA== X-Received: by 2002:a17:907:728f:b0:b87:2410:594d with SMTP id a640c23a62f3a-b8724105abfmr146400666b.49.1768210865520; Mon, 12 Jan 2026 01:41:05 -0800 (PST) Received: from [192.168.1.243] ([143.58.192.3]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b870bcd342bsm410828766b.56.2026.01.12.01.41.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Jan 2026 01:41:04 -0800 (PST) From: Andre Carvalho Date: Mon, 12 Jan 2026 09:40:52 +0000 Subject: [PATCH net-next v10 1/7] netconsole: add target_state enum 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: quoted-printable Message-Id: <20260112-netcons-retrigger-v10-1-d82ebfc2503e@gmail.com> References: <20260112-netcons-retrigger-v10-0-d82ebfc2503e@gmail.com> In-Reply-To: <20260112-netcons-retrigger-v10-0-d82ebfc2503e@gmail.com> To: Breno Leitao , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Shuah Khan , Simon Horman Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Andre Carvalho X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768210863; l=747; i=asantostc@gmail.com; s=20250807; h=from:subject:message-id; bh=BLduFEel2At1ZpRoHzUB/43M6t0wpDLHJLh+eokOBeA=; b=E0UQ3fv0rAx5q3iuk18b+VTRGt7svBbjpNHMgaJhnnV4zqLBiCrOV1pfmsu/PHSsEapXoewqN EHd4Be1TvTFBumN0KwyYPfZw0Mdw97XjNmlsgGi7WHQjAcON97+XOoj X-Developer-Key: i=asantostc@gmail.com; a=ed25519; pk=eWre+RwFHCxkiaQrZLsjC67mZ/pZnzSM/f7/+yFXY4Q= From: Breno Leitao Introduces a enum to track netconsole target state which is going to replace the enabled boolean. Signed-off-by: Breno Leitao Signed-off-by: Andre Carvalho --- drivers/net/netconsole.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index 9cb4dfc242f5..e2ec09f238a0 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -119,6 +119,11 @@ enum sysdata_feature { MAX_SYSDATA_ITEMS =3D 4, }; =20 +enum target_state { + STATE_DISABLED, + STATE_ENABLED, +}; + /** * struct netconsole_target - Represents a configured netconsole target. * @list: Links this target into the target_list. --=20 2.52.0 From nobody Sun Feb 8 00:49:40 2026 Received: from mail-ed1-f41.google.com (mail-ed1-f41.google.com [209.85.208.41]) (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 1059D34AAFC for ; Mon, 12 Jan 2026 09:41:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768210876; cv=none; b=pG3WY+RJ/xi68Xz0LhkI3Ux8URR59N619/NikccKbsBxVLR1vGTIn4ZPG6xBmoYil9gPVUEiGbD4W453mdGPJGnsSBJcEmiZfHHhIlKobo9jmrQkL0X/i2AaeQtQPRCeOQxfvMXjaGjr0547Z0DmN4B5Y++XsVw7qexJSYSlcb0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768210876; c=relaxed/simple; bh=ptkTe+cYKKYMyCNyu+hE6VVzhConXnPLG7fL2BaD9jQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ABQie0wdF9pxQf5mmehfyMcsufIxfhqHbXJ/7H9o8DTT42wzRMb62+5UEfUuSikBKeKVL6r0Bf6KxeF4vsbgP9KgnCDEAROQqy0m8hpKKMBZtz8EddAYMYUyk2xEqOQ9UQ/TAaoDIdiUL3qIKEbh2/Oen5b9NGkljeY35+hpTYs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=dFR/viQU; arc=none smtp.client-ip=209.85.208.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="dFR/viQU" Received: by mail-ed1-f41.google.com with SMTP id 4fb4d7f45d1cf-64c893f3a94so8163605a12.0 for ; Mon, 12 Jan 2026 01:41:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768210867; x=1768815667; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=t+RTp3NdTDs9G43jfmTa4TiJRQPqbtzKxkq+h8ATOJA=; b=dFR/viQUC9NjNt8ul3VAkDK5lk8r0PGbDkLSdqXQk/u3Xr9cbt4hw7az8jQDpNZ7I9 tfUaObeAIIVpNQunJgEr+dCCFEl3I/CscFjWkTVuu/9Unp2GE1YFc7c69N6/LxuCnXhR T5qG+7Yhnz/nZe1T9sJnJz5ffNHK8zgv7ZOgwncFMlLKsFrewXVTnKrdBSUqvYwhD9LO MvHqL60sPy56QG0U97aSrXtMRSQ/OjVu7L/f5XKJ0Tp6ueLkjuZ36p/X2JQIQtgqHdT7 8Yhkc8q6Ar5683GyHKKlQteeBHDhDTPOeuDhT7XW4jvOkAhQgl9v6QD0guBXD44GnGgo o2tQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768210867; x=1768815667; 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=t+RTp3NdTDs9G43jfmTa4TiJRQPqbtzKxkq+h8ATOJA=; b=J5ddEDGv/H0f430nH4ysoDhlmwA6t5usC4gObsh2S92eWLOk5d16fE1ucboWi8S3Dd KsqY5N+hQVHRxN2M0/h7apQER3LcFPqQ8hZWkwEt1sYLR53g7RWZ9bljQ+oddIMEt/Ux AFMsaVv+bw352r2AcvYxUToB69fryErAYeSOcvglDW3avGOsg/wG2TrqhOmTjHTf3tMx tn/1JmzWTP+cKX3GWMALaCUe2AcKaLW7B/waDU6xoHprqqW/vENQdtW4vDMf0069Yu79 tWpozDkAt5o6Jg9QWpYVFdSIGYznZlrSXVVwIKJJ4OM4j3jHavny6uZpvMx3Yo6fxYi5 +OXg== X-Forwarded-Encrypted: i=1; AJvYcCUfKIyaXRwe91AkG2hmYQyasW8ddTt1SQ5CsmAjRTezdtl7vGX+4wq7NPJ3G1mljrts2lxwgMFcdV8Brqg=@vger.kernel.org X-Gm-Message-State: AOJu0YyIkXaNb1x0X4IWFgxcJ+tPNXpQBkLEsMVXtxxNiDMb5EUEMTwm nMVG5YX/bdn3/HargLbUrTJ98uh9pEfrLen96wPEu+l4xf9BPow6Baea X-Gm-Gg: AY/fxX4ahi+B5eKsDgX0amN5+b2Z4+/AnHubKdK2Ufs4Z5bVkhfUrW48BP2n58FWVCI 259hRrMbb2oxitjxl7HYdPfaOhFi4wOL5Evsjr4T7hi3r5J+weMetDOs7ap55YO5Tth6b3o4rIq ZpdYm6QwGaB/PV9ddAi7NF1zJFNWV3t4EiF4JRjJLfiUizoWTxgSo6L4JrhrwYvnZrNMqu+CR5I V4O8d6a0CPEjv5A49/uOzzojysILJJbCkr+gkYTkS86khCVZz3FWVLhdJFH0I4/Lrtytx0zWVpz 3m+VF7Rq5/rnOwiX3h9BiUL9F9H2Eesz4BDkoceM7QIe3nhB0wV/nxoMbTs9IOCAPZ7OgkUA9AS Q/KV8ZnQK8nQtd90cYxIBckMrcutZTYYgYX2hmCfjnKoNdykFok4pBA9YAXjIpYr011LhesqZd9 q2EUKbktQl89WIeg== X-Google-Smtp-Source: AGHT+IHKowJu+lzuOEJL8Nke+EeqBYTCQ8MBl35vPfJ+s//oBiwkJXnLtbxv5wQG8z0BC6b9KenMrQ== X-Received: by 2002:a17:907:94ca:b0:b87:1fe2:55f8 with SMTP id a640c23a62f3a-b871fe2650dmr184173366b.29.1768210866975; Mon, 12 Jan 2026 01:41:06 -0800 (PST) Received: from [192.168.1.243] ([143.58.192.3]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b870bcd342bsm410828766b.56.2026.01.12.01.41.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Jan 2026 01:41:06 -0800 (PST) From: Andre Carvalho Date: Mon, 12 Jan 2026 09:40:53 +0000 Subject: [PATCH net-next v10 2/7] netconsole: convert 'enabled' flag to enum for clearer state management 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: quoted-printable Message-Id: <20260112-netcons-retrigger-v10-2-d82ebfc2503e@gmail.com> References: <20260112-netcons-retrigger-v10-0-d82ebfc2503e@gmail.com> In-Reply-To: <20260112-netcons-retrigger-v10-0-d82ebfc2503e@gmail.com> To: Breno Leitao , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Shuah Khan , Simon Horman Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Andre Carvalho X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768210863; l=8948; i=asantostc@gmail.com; s=20250807; h=from:subject:message-id; bh=ptkTe+cYKKYMyCNyu+hE6VVzhConXnPLG7fL2BaD9jQ=; b=cYUt47tvR0zr+7G2bOK9HjIuGKUcBRbuq1xWI3NXu4VeAoxDPCoIWqOkxQ9S1EZ+Hy6ggxjrz 9qB33qVfDMGC+fYPUUT3iZ2XiI0FFOguTPJHBJ+AyqZmj22IDBCqqtt X-Developer-Key: i=asantostc@gmail.com; a=ed25519; pk=eWre+RwFHCxkiaQrZLsjC67mZ/pZnzSM/f7/+yFXY4Q= This patch refactors the netconsole driver's target enabled state from a simple boolean to an explicit enum (`target_state`). This allow the states to be expanded to a new state in the upcoming change. Co-developed-by: Breno Leitao Signed-off-by: Breno Leitao Reviewed-by: Breno Leitao Signed-off-by: Andre Carvalho --- drivers/net/netconsole.c | 52 ++++++++++++++++++++++++++------------------= ---- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index e2ec09f238a0..b21ecea60d52 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -135,12 +135,12 @@ enum target_state { * @sysdata_fields: Sysdata features enabled. * @msgcounter: Message sent counter. * @stats: Packet send stats for the target. Used for debugging. - * @enabled: On / off knob to enable / disable target. + * @state: State of the target. * Visible from userspace (read-write). * We maintain a strict 1:1 correspondence between this and * whether the corresponding netpoll is active or inactive. * Also, other parameters of a target may be modified at - * runtime only when it is disabled (enabled =3D=3D 0). + * runtime only when it is disabled (state =3D=3D STATE_DISABLED). * @extended: Denotes whether console is extended or not. * @release: Denotes whether kernel release version should be prepended * to the message. Depends on extended console. @@ -170,7 +170,7 @@ struct netconsole_target { u32 msgcounter; #endif struct netconsole_target_stats stats; - bool enabled; + enum target_state state; bool extended; bool release; struct netpoll np; @@ -262,6 +262,7 @@ static struct netconsole_target *alloc_and_init(void) nt->np.local_port =3D 6665; nt->np.remote_port =3D 6666; eth_broadcast_addr(nt->np.remote_mac); + nt->state =3D STATE_DISABLED; =20 return nt; } @@ -280,7 +281,7 @@ static void netconsole_process_cleanups_core(void) mutex_lock(&target_cleanup_list_lock); list_for_each_entry_safe(nt, tmp, &target_cleanup_list, list) { /* all entries in the cleanup_list needs to be disabled */ - WARN_ON_ONCE(nt->enabled); + WARN_ON_ONCE(nt->state =3D=3D STATE_ENABLED); do_netpoll_cleanup(&nt->np); /* moved the cleaned target to target_list. Need to hold both * locks @@ -403,7 +404,7 @@ static void trim_newline(char *s, size_t maxlen) =20 static ssize_t enabled_show(struct config_item *item, char *buf) { - return sysfs_emit(buf, "%d\n", to_target(item)->enabled); + return sysfs_emit(buf, "%d\n", to_target(item)->state =3D=3D STATE_ENABLE= D); } =20 static ssize_t extended_show(struct config_item *item, char *buf) @@ -570,8 +571,8 @@ static ssize_t enabled_store(struct config_item *item, const char *buf, size_t count) { struct netconsole_target *nt =3D to_target(item); + bool enabled, current_enabled; unsigned long flags; - bool enabled; ssize_t ret; =20 mutex_lock(&dynamic_netconsole_mutex); @@ -580,9 +581,10 @@ static ssize_t enabled_store(struct config_item *item, goto out_unlock; =20 ret =3D -EINVAL; - if (enabled =3D=3D nt->enabled) { + current_enabled =3D nt->state =3D=3D STATE_ENABLED; + if (enabled =3D=3D current_enabled) { pr_info("network logging has already %s\n", - nt->enabled ? "started" : "stopped"); + current_enabled ? "started" : "stopped"); goto out_unlock; } =20 @@ -615,16 +617,16 @@ static ssize_t enabled_store(struct config_item *item, if (ret) goto out_unlock; =20 - nt->enabled =3D true; + nt->state =3D STATE_ENABLED; pr_info("network logging started\n"); } else { /* false */ /* We need to disable the netconsole before cleaning it up * otherwise we might end up in write_msg() with - * nt->np.dev =3D=3D NULL and nt->enabled =3D=3D true + * nt->np.dev =3D=3D NULL and nt->state =3D=3D STATE_ENABLED */ mutex_lock(&target_cleanup_list_lock); spin_lock_irqsave(&target_list_lock, flags); - nt->enabled =3D false; + nt->state =3D STATE_DISABLED; /* Remove the target from the list, while holding * target_list_lock */ @@ -653,7 +655,7 @@ static ssize_t release_store(struct config_item *item, = const char *buf, ssize_t ret; =20 mutex_lock(&dynamic_netconsole_mutex); - if (nt->enabled) { + if (nt->state =3D=3D STATE_ENABLED) { pr_err("target (%s) is enabled, disable to update parameters\n", config_item_name(&nt->group.cg_item)); ret =3D -EINVAL; @@ -680,7 +682,7 @@ static ssize_t extended_store(struct config_item *item,= const char *buf, ssize_t ret; =20 mutex_lock(&dynamic_netconsole_mutex); - if (nt->enabled) { + if (nt->state =3D=3D STATE_ENABLED) { pr_err("target (%s) is enabled, disable to update parameters\n", config_item_name(&nt->group.cg_item)); ret =3D -EINVAL; @@ -704,7 +706,7 @@ static ssize_t dev_name_store(struct config_item *item,= const char *buf, struct netconsole_target *nt =3D to_target(item); =20 mutex_lock(&dynamic_netconsole_mutex); - if (nt->enabled) { + if (nt->state =3D=3D STATE_ENABLED) { pr_err("target (%s) is enabled, disable to update parameters\n", config_item_name(&nt->group.cg_item)); mutex_unlock(&dynamic_netconsole_mutex); @@ -725,7 +727,7 @@ static ssize_t local_port_store(struct config_item *ite= m, const char *buf, ssize_t ret =3D -EINVAL; =20 mutex_lock(&dynamic_netconsole_mutex); - if (nt->enabled) { + if (nt->state =3D=3D STATE_ENABLED) { pr_err("target (%s) is enabled, disable to update parameters\n", config_item_name(&nt->group.cg_item)); goto out_unlock; @@ -747,7 +749,7 @@ static ssize_t remote_port_store(struct config_item *it= em, ssize_t ret =3D -EINVAL; =20 mutex_lock(&dynamic_netconsole_mutex); - if (nt->enabled) { + if (nt->state =3D=3D STATE_ENABLED) { pr_err("target (%s) is enabled, disable to update parameters\n", config_item_name(&nt->group.cg_item)); goto out_unlock; @@ -770,7 +772,7 @@ static ssize_t local_ip_store(struct config_item *item,= const char *buf, int ipv6; =20 mutex_lock(&dynamic_netconsole_mutex); - if (nt->enabled) { + if (nt->state =3D=3D STATE_ENABLED) { pr_err("target (%s) is enabled, disable to update parameters\n", config_item_name(&nt->group.cg_item)); goto out_unlock; @@ -795,7 +797,7 @@ static ssize_t remote_ip_store(struct config_item *item= , const char *buf, int ipv6; =20 mutex_lock(&dynamic_netconsole_mutex); - if (nt->enabled) { + if (nt->state =3D=3D STATE_ENABLED) { pr_err("target (%s) is enabled, disable to update parameters\n", config_item_name(&nt->group.cg_item)); goto out_unlock; @@ -830,7 +832,7 @@ static ssize_t remote_mac_store(struct config_item *ite= m, const char *buf, ssize_t ret =3D -EINVAL; =20 mutex_lock(&dynamic_netconsole_mutex); - if (nt->enabled) { + if (nt->state =3D=3D STATE_ENABLED) { pr_err("target (%s) is enabled, disable to update parameters\n", config_item_name(&nt->group.cg_item)); goto out_unlock; @@ -1326,7 +1328,7 @@ static void drop_netconsole_target(struct config_grou= p *group, * The target may have never been enabled, or was manually disabled * before being removed so netpoll may have already been cleaned up. */ - if (nt->enabled) + if (nt->state =3D=3D STATE_ENABLED) netpoll_cleanup(&nt->np); =20 config_item_put(&nt->group.cg_item); @@ -1444,7 +1446,7 @@ static int netconsole_netdev_event(struct notifier_bl= ock *this, case NETDEV_RELEASE: case NETDEV_JOIN: case NETDEV_UNREGISTER: - nt->enabled =3D false; + nt->state =3D STATE_DISABLED; list_move(&nt->list, &target_cleanup_list); stopped =3D true; } @@ -1725,7 +1727,8 @@ static void write_ext_msg(struct console *con, const = char *msg, =20 spin_lock_irqsave(&target_list_lock, flags); list_for_each_entry(nt, &target_list, list) - if (nt->extended && nt->enabled && netif_running(nt->np.dev)) + if (nt->extended && nt->state =3D=3D STATE_ENABLED && + netif_running(nt->np.dev)) send_ext_msg_udp(nt, msg, len); spin_unlock_irqrestore(&target_list_lock, flags); } @@ -1745,7 +1748,8 @@ static void write_msg(struct console *con, const char= *msg, unsigned int len) =20 spin_lock_irqsave(&target_list_lock, flags); list_for_each_entry(nt, &target_list, list) { - if (!nt->extended && nt->enabled && netif_running(nt->np.dev)) { + if (!nt->extended && nt->state =3D=3D STATE_ENABLED && + netif_running(nt->np.dev)) { /* * We nest this inside the for-each-target loop above * so that we're able to get as much logging out to @@ -1901,7 +1905,7 @@ static struct netconsole_target *alloc_param_target(c= har *target_config, */ goto fail; } else { - nt->enabled =3D true; + nt->state =3D STATE_ENABLED; } populate_configfs_item(nt, cmdline_count); =20 --=20 2.52.0 From nobody Sun Feb 8 00:49:40 2026 Received: from mail-ed1-f48.google.com (mail-ed1-f48.google.com [209.85.208.48]) (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 2ED8C34B19F for ; Mon, 12 Jan 2026 09:41:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768210876; cv=none; b=DXV4rrpAcFwGVCGMscFvw9M76pQmGzDSuAL6g7oGRKeYn/qe2rUfgSRmNefdXCL8T/W6v1TMgTXW6Ce6v6YiJPCNdpcSy4TvZ8WWsLA/WUXQTwFDm0vzm4GOeBgmsfxr3cY3pPwgOspvGNLgJoWd6RASP2g5BBwbedPFyNM0j4c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768210876; c=relaxed/simple; bh=oZlSrKc5HSf8OTgk8Y9zCO1ND/6B7m7anVTBiZTQDCE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NRyUDSd6bL5wrvVBnZxfAMbqBToQuZqAQdjYLMcK2GVPAbyrKJCNJgm7BjHK7M+I6zAGHo2s0n0VwDeCDBKBpPuMsCyj28lNsoUhaCUzqdQYAROQlxqIYtlp8i03mWW2yqMtiMJNfm9FmfZx1l01W9Q10gI7HJPNlMokJ7fVJKI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=hQaZ/Iy6; arc=none smtp.client-ip=209.85.208.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="hQaZ/Iy6" Received: by mail-ed1-f48.google.com with SMTP id 4fb4d7f45d1cf-64c893f3a94so8163640a12.0 for ; Mon, 12 Jan 2026 01:41:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768210868; x=1768815668; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=J4d7URFdeCPYu3U6zdfTOnUzmMHd/kT6rS033v+6Sa8=; b=hQaZ/Iy6Dl5sfj5+mmauSTFRztpCLtxoD9hULpPz3qNgL+UIDZn0s6bTLSxwvwrPCI 0jrwlx7a5RR7C2JoaztGTEEXwZQHWK/bOtlCYpynYSFBPmVjJ8RAk+6YKv4vR3XZ+5oM pvcm54a+N1khUkf+mo/+Hclh2iz7rZ0zc1aY8XZ4qh157bC1h7eQDpGWE5okbyhVSfP8 ekT9nbeeO3+sHuQ8zydFJrESDxJQrHi39xF5CeuFqvQ3ZEi7CC+7gtV3kcWzKgSrp72W goKlClZGhtK658aZYtCQ4oH412UqPj35jOOWfbs3Kq6v4n4Du0a52rVae884ch6Rmqgj HPZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768210868; x=1768815668; 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=J4d7URFdeCPYu3U6zdfTOnUzmMHd/kT6rS033v+6Sa8=; b=VWJm68UkQc8drlGmKPzhArE7lbpz/e2P1qbSFrsi9n5kCnMpt2lys4WE2kfKWXlYcf Rnj0/M1a6NU71LLUQ/hA6T6a1Xs02ziwSEa3p4C+1uA4sLJrfcUrPVyfcCi8exmv2C9U 1+O3QHVBVLcBY6uBdzPbe8aHSb0czsOmgLOSHu0cjuZgywJthuGfm/4OPpW0t66IizUP vPunq64lR6vR2EgkoM9m1n4P4+L3RFYvcPgsz1uEtSxwW4bHCkEVjcaBsuIwAS9dVBTO cqv0fqw/Of0OSLnHZudl01BtBP5PPY8IgapjbiO/emqHl4BbEM8Q68cw+znFn9uONyVJ ltFw== X-Forwarded-Encrypted: i=1; AJvYcCUw6f7l9YoLM9C9iFzyGuyjRKONJpIs3ew8k0lS16BsZ7g+q29VAuRMdFbzsIxZc5HHZ3Ci83nEFXrBjmU=@vger.kernel.org X-Gm-Message-State: AOJu0YwS79lNHlmXq8o1AK4Zsbml6nY+W+7dbtGg0O9PKB9ZyXQPQLhF nVbgG/xaNio16qTg5ziKgEUHPHI6HYItaWkZEH1flZIPyNH6wgKlXMUy X-Gm-Gg: AY/fxX4eLaEcPFUpwdO0TbM4WXEsEjWSYIvve3QLifpe2rUwsoO/8U/tvuJuuYeOKxx Q9br1o4Dvs6AuOnhycc0De1hk3PUZylKwb6PFTg5usAgAHl85CjLBM0pYF+lpnY3IH6K3oHIP8E pAhpeytmwJ+/hJvOdIEXvoyss3O3Cy9AWNjQo5aCldlLaJUIaOjLLVHToT003lHRbZB0O+8KsOv LHSJWYw4IBAk7e3rZG3buRn+fGuri3iEcPFcKxDKbdCodGVl+wVxMOL9rzB9x9dYCYfzP3S4yTw WxjvMiSqutjtLZR7ECyQvac2lDA2tWHXHZoI86oJOoilV40x4zf2qDRZ06u9Fvsr/+J8thQaZQ8 eK0IO7c8hyAlMnw8QMoQXIGeEvxIKrkLgZak4Pe2ILBXvUgwwlW+HFrsZbqrwDwXEHK2JZBCswm GKiYtDVMj0CrE28RQqgPTsGrn9 X-Google-Smtp-Source: AGHT+IE7196ejl7yFzSqk+olKRAYnC2uk75Y2D533VodUBlVEhIaeYQfNJUulVJjCL8VsWOCEwYsAA== X-Received: by 2002:a17:907:d64a:b0:b80:48f6:9cc6 with SMTP id a640c23a62f3a-b844500df90mr1559904666b.32.1768210867980; Mon, 12 Jan 2026 01:41:07 -0800 (PST) Received: from [192.168.1.243] ([143.58.192.3]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b870bcd342bsm410828766b.56.2026.01.12.01.41.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Jan 2026 01:41:07 -0800 (PST) From: Andre Carvalho Date: Mon, 12 Jan 2026 09:40:54 +0000 Subject: [PATCH net-next v10 3/7] netconsole: add STATE_DEACTIVATED to track targets disabled by low level 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: quoted-printable Message-Id: <20260112-netcons-retrigger-v10-3-d82ebfc2503e@gmail.com> References: <20260112-netcons-retrigger-v10-0-d82ebfc2503e@gmail.com> In-Reply-To: <20260112-netcons-retrigger-v10-0-d82ebfc2503e@gmail.com> To: Breno Leitao , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Shuah Khan , Simon Horman Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Andre Carvalho X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768210863; l=2409; i=asantostc@gmail.com; s=20250807; h=from:subject:message-id; bh=Bc0ee9DYK1oiSRrahxYGeDv2Y4gYudwUsG3FQq7nt2Y=; b=dlucml7NE6QKov7VCIJKrbKl4nY7P7ygZT0UdSvjY2SvFgYTxYH1Iq9sObh2A0E1ovc8n6xTw wvyp5z1BJvmCxctm7jBsrYjDXJcEvmZxerynakzqwbN8JVznlQkw3AH X-Developer-Key: i=asantostc@gmail.com; a=ed25519; pk=eWre+RwFHCxkiaQrZLsjC67mZ/pZnzSM/f7/+yFXY4Q= From: Breno Leitao When the low level interface brings a netconsole target down, record this using a new STATE_DEACTIVATED state. This allows netconsole to distinguish between targets explicitly disabled by users and those deactivated due to interface state changes. It also enables automatic recovery and re-enabling of targets if the underlying low-level interfaces come back online. From a code perspective, anything that is not STATE_ENABLED is disabled. Devices (de)enslaving are marked STATE_DISABLED to prevent automatically resuming as enslaved interfaces cannot have netconsole enabled. Signed-off-by: Breno Leitao Signed-off-by: Andre Carvalho --- drivers/net/netconsole.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index b21ecea60d52..7a1e5559fc0d 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -122,6 +122,7 @@ enum sysdata_feature { enum target_state { STATE_DISABLED, STATE_ENABLED, + STATE_DEACTIVATED, }; =20 /** @@ -580,6 +581,14 @@ static ssize_t enabled_store(struct config_item *item, if (ret) goto out_unlock; =20 + /* When the user explicitly enables or disables a target that is + * currently deactivated, reset its state to disabled. The DEACTIVATED + * state only tracks interface-driven deactivation and should _not_ + * persist when the user manually changes the target's enabled state. + */ + if (nt->state =3D=3D STATE_DEACTIVATED) + nt->state =3D STATE_DISABLED; + ret =3D -EINVAL; current_enabled =3D nt->state =3D=3D STATE_ENABLED; if (enabled =3D=3D current_enabled) { @@ -1445,10 +1454,19 @@ static int netconsole_netdev_event(struct notifier_= block *this, break; case NETDEV_RELEASE: case NETDEV_JOIN: - case NETDEV_UNREGISTER: + /* transition target to DISABLED instead of + * DEACTIVATED when (de)enslaving devices as + * their targets should not be automatically + * resumed when the interface is brought up. + */ nt->state =3D STATE_DISABLED; list_move(&nt->list, &target_cleanup_list); stopped =3D true; + break; + case NETDEV_UNREGISTER: + nt->state =3D STATE_DEACTIVATED; + list_move(&nt->list, &target_cleanup_list); + stopped =3D true; } } netconsole_target_put(nt); --=20 2.52.0 From nobody Sun Feb 8 00:49:40 2026 Received: from mail-ej1-f42.google.com (mail-ej1-f42.google.com [209.85.218.42]) (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 818F934A78D for ; Mon, 12 Jan 2026 09:41:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768210876; cv=none; b=iupSuBCPbgP9f1ZDiROsPQXNELvHnBiJtc9HVrv760dUkEpD94xlIDV3pqoN24HO5b4WPInq7mBqo96BG0o3OLX2W/kjLN2UYD0VMq7I439024KO1hCW+ub+pCxedOT7ixlEDiV07/IWTJwI9EquARQXEP2Y7SuNJAsh0gnXmec= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768210876; c=relaxed/simple; bh=2IR9K9fFwUyb3vK1T1dQvAvM/jN1tGrfN72mQMj/cpo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Vr+vDOOgWe02gbxA0buXCEPBu2xVF0nkQMoWUuw8Xs0w33u4hrkmWqQV8cagSV6bLP5xOaFLzzKxl5XdW4BA4vuwrzvDKrO+XD/adHKqBX56S0VRaJmBNpintw+atN/32rZZ0ewyo7mAvA+ugdphE9lh29MRwkAfhduchOtYek4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=fSDeJSk6; arc=none smtp.client-ip=209.85.218.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="fSDeJSk6" Received: by mail-ej1-f42.google.com with SMTP id a640c23a62f3a-b8707005183so178144166b.0 for ; Mon, 12 Jan 2026 01:41:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768210870; x=1768815670; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=+ZJpugnwNeH6pltmuI9tKkzaUCo5szMqMArK7fNoASs=; b=fSDeJSk6UbcouQREN8szTwgwXT7/oN3dbamr9B5x8ykQKVu+JN3o9WqPalWaHCNSO3 WddeZlN7uUdMHNvnNuvzU/49Iju7ZI6eG/2Pub3oxNmwh43GDr4P+n7HnHToNeVU9NQW vX4Ur4okH0gswRREWihDMbGR8wdnrOv0yh9oEk7TQF6k6sCEQiSVYK7+6Z8MMZzlxIeb dhnYiBbtKLqSNGNNhDfA1JOwywJpe7/IXzmK8xPvsZxsSSkxnoULitSeT1SmTkexzP3g Vm0V1NfhL+SNjMWBa3vvX1Ekk4Ih7/lApfgWODl8/kVZ+ZG34oHCrLR1l9uarqBsXise 6oFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768210870; x=1768815670; 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=+ZJpugnwNeH6pltmuI9tKkzaUCo5szMqMArK7fNoASs=; b=pDWdttvvP5lEB4yogN5Qt5SIxohRLfVC5gIdusAeXinmxBvPZL5fgRuBj7SOMzYPDH rfvYzLGNwR5y4EvTMNw+cIOcJ+ex2QOfNTBFnGQ0gD3T06LlvihV2UbyoHX6Csz1VtOL 5m652mWdoHfKsxSP5PQ8dwvbvpHB+DsuwNdIBFN4U5om9etrVxjOQq6JZmm69s753jA5 NNEWCFb9yTiJ0MFT8Bx7OlY9c4DAkUVa2FNL5LA3sblTUg2+4ed/56iN+ALhoYGy5824 eADAsy3nWMF++oke+8zMu2+NhIqUb56mDUqKMvu6eupVk8VJc1brIFFMc7K6yetXCyO/ xzww== X-Forwarded-Encrypted: i=1; AJvYcCW7yeAlSJtsH1inn5EoV9l8frIQxsT3ZiRdiQPYjTp4UdUv3Iw7HpjfmMzwSE3NZUfjz9WB52tZf9Iw0O8=@vger.kernel.org X-Gm-Message-State: AOJu0YyQCVCnE7RP2G0JemlZColxMY9jxISoqNfXPGuKcGMx7uw1eej+ dsn4Ldq8B+Ma2pmP3721XZj2ai6YXiXSEjlUhzk4+7z4udLrbfgM/drm X-Gm-Gg: AY/fxX6JixiAiVqAU9JRbOJoPJVbJVtEJfRKMR4iH2eO+RjVs2pmu3O0eQhxPDYTCeC NNrLGyIIt50Im79+fK1A1qbEim07mHdxEwuh0FL8K/JgFvYSq3vNkizY9tReCG4yuOGO79VX2p4 gGrH3LRSizuUvJGmSBmRWT8ANXqWq58xYC/6209BUn/XpFWqDqqeedAGpLSe5MmmJBOUtXQyVkn cSBR1Op05J3PwsVxc3TUKE8Bpo1UNmxQCb3FNmuJFIVL4bV5HbCvswfSmOvod6JtAbxy1odxd0h DjdAj1OskVjemi2VU5pC7LaEkvwt5c4CHhyiQQaC3J10M9t9Ny/pynLfn81c3F0I0+8Ckzh5BA0 kcejU4IOWiEh0Fv18PR7H6oWdtE6fEbrqpdwBB0CdpYKqqB5a/eE+MakI7NA9m8DJ4XiyVJMQEh qeT9upx2t0s0iLaQ== X-Google-Smtp-Source: AGHT+IFgXG9FtTcTI9askJdKeBxyq33PRdfuWUfeE7I+aLtTeSoRzhvi45RlIzresGDM0bGDZBuCdw== X-Received: by 2002:a17:907:96aa:b0:b87:2f29:2075 with SMTP id a640c23a62f3a-b872f293a8fmr29106166b.28.1768210869514; Mon, 12 Jan 2026 01:41:09 -0800 (PST) Received: from [192.168.1.243] ([143.58.192.3]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b870bcd342bsm410828766b.56.2026.01.12.01.41.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Jan 2026 01:41:08 -0800 (PST) From: Andre Carvalho Date: Mon, 12 Jan 2026 09:40:55 +0000 Subject: [PATCH net-next v10 4/7] netconsole: clear dev_name for devices bound by mac 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: quoted-printable Message-Id: <20260112-netcons-retrigger-v10-4-d82ebfc2503e@gmail.com> References: <20260112-netcons-retrigger-v10-0-d82ebfc2503e@gmail.com> In-Reply-To: <20260112-netcons-retrigger-v10-0-d82ebfc2503e@gmail.com> To: Breno Leitao , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Shuah Khan , Simon Horman Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Andre Carvalho X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768210863; l=1518; i=asantostc@gmail.com; s=20250807; h=from:subject:message-id; bh=2IR9K9fFwUyb3vK1T1dQvAvM/jN1tGrfN72mQMj/cpo=; b=mJMvftO9vWbVYBySQMvlOwCMj5f4rBUZtkx2lrLq584MFm+ltB+706sfwMCzDJQBx7wk+Xlci w5HTBqvAje/B7OnUjjgU7ShiKQmeex/RTuKoFvg47OT8MDh8V3xwf3q X-Developer-Key: i=asantostc@gmail.com; a=ed25519; pk=eWre+RwFHCxkiaQrZLsjC67mZ/pZnzSM/f7/+yFXY4Q= This patch makes sure netconsole clears dev_name for devices bound by mac in order to allow calling setup_netpoll on targets that have previously been cleaned up (in order to support resuming deactivated targets). This is required as netpoll_setup populates dev_name even when devices are matched via mac address. The cleanup is done inside netconsole as bound by mac is a netconsole concept. Signed-off-by: Andre Carvalho --- drivers/net/netconsole.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index 7a1e5559fc0d..02a3463e8d24 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -242,6 +242,12 @@ static void populate_configfs_item(struct netconsole_t= arget *nt, } #endif /* CONFIG_NETCONSOLE_DYNAMIC */ =20 +/* Check if the target was bound by mac address. */ +static bool bound_by_mac(struct netconsole_target *nt) +{ + return is_valid_ether_addr(nt->np.dev_mac); +} + /* Allocate and initialize with defaults. * Note that these targets get their config_item fields zeroed-out. */ @@ -284,6 +290,8 @@ static void netconsole_process_cleanups_core(void) /* all entries in the cleanup_list needs to be disabled */ WARN_ON_ONCE(nt->state =3D=3D STATE_ENABLED); do_netpoll_cleanup(&nt->np); + if (bound_by_mac(nt)) + memset(&nt->np.dev_name, 0, IFNAMSIZ); /* moved the cleaned target to target_list. Need to hold both * locks */ --=20 2.52.0 From nobody Sun Feb 8 00:49:40 2026 Received: from mail-ed1-f46.google.com (mail-ed1-f46.google.com [209.85.208.46]) (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 8367A34B1AF for ; Mon, 12 Jan 2026 09:41:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768210880; cv=none; b=SKvenKP8zNeJLZ8JvIuEuSSTKAEE5YODeRjRfA+dTFziNlERGqUvb3LgE3mex03XceBghWDOFyXFJqb44QNOloHX6KZ7xe5CjopdoPSto8NQOavrra+MVHaBEFlHAhlQnLF1ylfvGwQMjI+ZugCkEvy2riuGRqXOpRPKETkkN6Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768210880; c=relaxed/simple; bh=4PDwzlCI+jgQG2jAxOz1RlldCa/d+sKTSpqV/8xAtWQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=a2sFadR6NcB+mEeppLVy0o7Gdt/quZvUl8iGXKoUyIDzJ9BFv34v3sfxmBiL1bRnBIQjdGEZvWqa8emV4JnQ7Cp6pSVnnkCE7LcbYpq8pQrKWXmaPpiZY+47uBCIZRbWqYavdAguFkuVd2cZRW1T0C24d1fX4fi8gvkwulDX/lg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=CP1W1YRB; arc=none smtp.client-ip=209.85.208.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="CP1W1YRB" Received: by mail-ed1-f46.google.com with SMTP id 4fb4d7f45d1cf-64b8b5410a1so9059811a12.2 for ; Mon, 12 Jan 2026 01:41:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768210871; x=1768815671; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=JUk5UFagcf4IlgTEQ/iWJeI/RTRWAeLpBdR/nh29wa0=; b=CP1W1YRBqH28++jUkgZTj8LAkP/GZMUv9QQ0U11NTSCox8u1JhWxFo4w5mNlsD3Bbn ef1NAZ1ZMDEfPr1thjg/8lkqcklFsI6Rrrsa7YySNtLv3xkIs4TPaapPg7FgoTXV0i2b JFQeerSzvitrCC2GIgDzVLmSblTXkr7rQ66iWbyezsAmGlexfPn4QoTZNZNu1byp1Xw+ ytblnP3PS+BLIL5MxuNniJg96VJEiAr/Q9BL3hcVGaw2gEfMhfhpNjakJ0UY3vrvyLoE 6UFqm0iSTwnCqDFjtolT4g1P+Y5U4NrqyUss7WGjE+AH1u175g4mOZWF+O+dqey5kApw UB4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768210871; x=1768815671; 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=JUk5UFagcf4IlgTEQ/iWJeI/RTRWAeLpBdR/nh29wa0=; b=jpJPZxSF3Cjh8B1n9LbFZJj1f/L9uNYEVtXSxQlmWw9jf+GRvJqmjtOgrJLOB3WAZR 80WzIqFzbi9rmh7GdFDi2Dh//Y92YsYhBSqkPRd+KIdD7kQa34P7irePXraBLMWeylK8 5Tx1Ckei0UNDntuPxvzuRpF1x6RpRBWi0j3WQkKYuCsnroYRyTurSB/UR3rj31XHv40H lBTz/PXcHWThiDKvPxopbUGSMs6L/WQpi/xa9SOZrYUrlF8VBp7P/zQtaHYDW1HhBBDg 5mAmjsBEUnvIopJOjzRetNETpZzlC3mVgEfNuPfnxk7bVKgnN+b+HXx8jyNxYsQdr3tF Y2/w== X-Forwarded-Encrypted: i=1; AJvYcCVw4hdvx9FZ7HA1QrAFsWmuPK3bVVdcWDAGzUZEyULp0G+gfBBLWrlWhN0s39QQXMLQmXy2gTyUUaHbfuU=@vger.kernel.org X-Gm-Message-State: AOJu0YzHN05W6GD52KDGoFCAdP1XdprFGJxyD+5yQ5e51qy9iGZTb35s ZVXOojWXr8hk9SwAOIMmcye8m4qWEGt8Si8zr4BR4DeAcPIpPww2o4G0 X-Gm-Gg: AY/fxX4Aqc4B/vP7w8mkXrWOIO3Zb0pcpwtGftzUXMorz+cme2zK40EXLOhOMfMBx7v IFITSRaw9eI+yniuhEUFexECM81d9C16kSqif/b/Db1v8YY50/9nyjtZu/8AUJ7UbFZgHl2tNmR Uww/Ua8tx0aSwBXAGpVPyKgGx6+NAXtYCmwc83hU/lrJ3v1Q6263K9PoWc2jriqeIpmUsR8LO9+ xl9BTzEA2v4jEwWop1hfrihDFFyvPFrrCyBES6ofFRSlAUlvns3rLrrxjzZZaHGj2HK+ntfKRc9 s9HaYJBi4jml+0rGgSb1Yoi/TalIjJGaehezQ9MICh4TtAmHVafSZGf8aDBLCrHGHdPa0VmJA3h wHcZffoTQqoYtxIHkUJSIcftX0OyWPRh8SopPqdk4FWz8J+9O+lDhshiXpMDhIugpXcyNglpBsS AaMWlzQFDrIeLqXg== X-Google-Smtp-Source: AGHT+IGfu0MEaKm02og4PRIdkU25LNt7R3xUh98/HDOVupGAYQsgmsCOt8w9NasdgiB0ElxW68uXrg== X-Received: by 2002:a17:907:728f:b0:b87:2410:594d with SMTP id a640c23a62f3a-b8724105abfmr146423566b.49.1768210871030; Mon, 12 Jan 2026 01:41:11 -0800 (PST) Received: from [192.168.1.243] ([143.58.192.3]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b870bcd342bsm410828766b.56.2026.01.12.01.41.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Jan 2026 01:41:10 -0800 (PST) From: Andre Carvalho Date: Mon, 12 Jan 2026 09:40:56 +0000 Subject: [PATCH net-next v10 5/7] netconsole: introduce helpers for dynamic_netconsole_mutex lock/unlock 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: quoted-printable Message-Id: <20260112-netcons-retrigger-v10-5-d82ebfc2503e@gmail.com> References: <20260112-netcons-retrigger-v10-0-d82ebfc2503e@gmail.com> In-Reply-To: <20260112-netcons-retrigger-v10-0-d82ebfc2503e@gmail.com> To: Breno Leitao , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Shuah Khan , Simon Horman Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Andre Carvalho X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768210863; l=12692; i=asantostc@gmail.com; s=20250807; h=from:subject:message-id; bh=4PDwzlCI+jgQG2jAxOz1RlldCa/d+sKTSpqV/8xAtWQ=; b=+aIjU9q1palonE6THhW2JxSM5iks+VY4Hy6k9bvifYU19Y8u2cvrbdd/JHqCM78jR0shHr5eF if39/p0L9EPCBkPld4+rruohaANKPVlHcGPZ7FtdhVmp6BX/A3XxKBD X-Developer-Key: i=asantostc@gmail.com; a=ed25519; pk=eWre+RwFHCxkiaQrZLsjC67mZ/pZnzSM/f7/+yFXY4Q= This commit introduces two helper functions to perform lock/unlock on dynamic_netconsole_mutex providing no-op stub versions when compiled without CONFIG_NETCONSOLE_DYNAMIC and refactors existing call sites to use the new helpers. This is done following kernel coding style guidelines, in preparation for an upcoming change. It avoids the need for preprocessor conditionals in the call site and keeps the logic easier to follow. Signed-off-by: Andre Carvalho --- drivers/net/netconsole.c | 97 +++++++++++++++++++++++++++++---------------= ---- 1 file changed, 58 insertions(+), 39 deletions(-) diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index 02a3463e8d24..46d990f3d904 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -213,6 +213,16 @@ static void netconsole_target_put(struct netconsole_ta= rget *nt) config_group_put(&nt->group); } =20 +static void dynamic_netconsole_mutex_lock(void) +{ + mutex_lock(&dynamic_netconsole_mutex); +} + +static void dynamic_netconsole_mutex_unlock(void) +{ + mutex_unlock(&dynamic_netconsole_mutex); +} + #else /* !CONFIG_NETCONSOLE_DYNAMIC */ =20 static int __init dynamic_netconsole_init(void) @@ -240,6 +250,15 @@ static void populate_configfs_item(struct netconsole_t= arget *nt, int cmdline_count) { } + +static void dynamic_netconsole_mutex_lock(void) +{ +} + +static void dynamic_netconsole_mutex_unlock(void) +{ +} + #endif /* CONFIG_NETCONSOLE_DYNAMIC */ =20 /* Check if the target was bound by mac address. */ @@ -495,9 +514,9 @@ static ssize_t sysdata_cpu_nr_enabled_show(struct confi= g_item *item, char *buf) struct netconsole_target *nt =3D to_target(item->ci_parent); bool cpu_nr_enabled; =20 - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); cpu_nr_enabled =3D !!(nt->sysdata_fields & SYSDATA_CPU_NR); - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); =20 return sysfs_emit(buf, "%d\n", cpu_nr_enabled); } @@ -509,9 +528,9 @@ static ssize_t sysdata_taskname_enabled_show(struct con= fig_item *item, struct netconsole_target *nt =3D to_target(item->ci_parent); bool taskname_enabled; =20 - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); taskname_enabled =3D !!(nt->sysdata_fields & SYSDATA_TASKNAME); - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); =20 return sysfs_emit(buf, "%d\n", taskname_enabled); } @@ -522,9 +541,9 @@ static ssize_t sysdata_release_enabled_show(struct conf= ig_item *item, struct netconsole_target *nt =3D to_target(item->ci_parent); bool release_enabled; =20 - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); release_enabled =3D !!(nt->sysdata_fields & SYSDATA_TASKNAME); - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); =20 return sysfs_emit(buf, "%d\n", release_enabled); } @@ -562,9 +581,9 @@ static ssize_t sysdata_msgid_enabled_show(struct config= _item *item, struct netconsole_target *nt =3D to_target(item->ci_parent); bool msgid_enabled; =20 - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); msgid_enabled =3D !!(nt->sysdata_fields & SYSDATA_MSGID); - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); =20 return sysfs_emit(buf, "%d\n", msgid_enabled); } @@ -584,7 +603,7 @@ static ssize_t enabled_store(struct config_item *item, unsigned long flags; ssize_t ret; =20 - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); ret =3D kstrtobool(buf, &enabled); if (ret) goto out_unlock; @@ -660,7 +679,7 @@ static ssize_t enabled_store(struct config_item *item, /* Deferred cleanup */ netconsole_process_cleanups(); out_unlock: - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); return ret; } =20 @@ -671,7 +690,7 @@ static ssize_t release_store(struct config_item *item, = const char *buf, bool release; ssize_t ret; =20 - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); if (nt->state =3D=3D STATE_ENABLED) { pr_err("target (%s) is enabled, disable to update parameters\n", config_item_name(&nt->group.cg_item)); @@ -687,7 +706,7 @@ static ssize_t release_store(struct config_item *item, = const char *buf, =20 ret =3D strnlen(buf, count); out_unlock: - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); return ret; } =20 @@ -698,7 +717,7 @@ static ssize_t extended_store(struct config_item *item,= const char *buf, bool extended; ssize_t ret; =20 - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); if (nt->state =3D=3D STATE_ENABLED) { pr_err("target (%s) is enabled, disable to update parameters\n", config_item_name(&nt->group.cg_item)); @@ -713,7 +732,7 @@ static ssize_t extended_store(struct config_item *item,= const char *buf, nt->extended =3D extended; ret =3D strnlen(buf, count); out_unlock: - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); return ret; } =20 @@ -722,18 +741,18 @@ static ssize_t dev_name_store(struct config_item *ite= m, const char *buf, { struct netconsole_target *nt =3D to_target(item); =20 - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); if (nt->state =3D=3D STATE_ENABLED) { pr_err("target (%s) is enabled, disable to update parameters\n", config_item_name(&nt->group.cg_item)); - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); return -EINVAL; } =20 strscpy(nt->np.dev_name, buf, IFNAMSIZ); trim_newline(nt->np.dev_name, IFNAMSIZ); =20 - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); return strnlen(buf, count); } =20 @@ -743,7 +762,7 @@ static ssize_t local_port_store(struct config_item *ite= m, const char *buf, struct netconsole_target *nt =3D to_target(item); ssize_t ret =3D -EINVAL; =20 - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); if (nt->state =3D=3D STATE_ENABLED) { pr_err("target (%s) is enabled, disable to update parameters\n", config_item_name(&nt->group.cg_item)); @@ -755,7 +774,7 @@ static ssize_t local_port_store(struct config_item *ite= m, const char *buf, goto out_unlock; ret =3D strnlen(buf, count); out_unlock: - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); return ret; } =20 @@ -765,7 +784,7 @@ static ssize_t remote_port_store(struct config_item *it= em, struct netconsole_target *nt =3D to_target(item); ssize_t ret =3D -EINVAL; =20 - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); if (nt->state =3D=3D STATE_ENABLED) { pr_err("target (%s) is enabled, disable to update parameters\n", config_item_name(&nt->group.cg_item)); @@ -777,7 +796,7 @@ static ssize_t remote_port_store(struct config_item *it= em, goto out_unlock; ret =3D strnlen(buf, count); out_unlock: - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); return ret; } =20 @@ -788,7 +807,7 @@ static ssize_t local_ip_store(struct config_item *item,= const char *buf, ssize_t ret =3D -EINVAL; int ipv6; =20 - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); if (nt->state =3D=3D STATE_ENABLED) { pr_err("target (%s) is enabled, disable to update parameters\n", config_item_name(&nt->group.cg_item)); @@ -802,7 +821,7 @@ static ssize_t local_ip_store(struct config_item *item,= const char *buf, =20 ret =3D strnlen(buf, count); out_unlock: - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); return ret; } =20 @@ -813,7 +832,7 @@ static ssize_t remote_ip_store(struct config_item *item= , const char *buf, ssize_t ret =3D -EINVAL; int ipv6; =20 - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); if (nt->state =3D=3D STATE_ENABLED) { pr_err("target (%s) is enabled, disable to update parameters\n", config_item_name(&nt->group.cg_item)); @@ -827,7 +846,7 @@ static ssize_t remote_ip_store(struct config_item *item= , const char *buf, =20 ret =3D strnlen(buf, count); out_unlock: - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); return ret; } =20 @@ -848,7 +867,7 @@ static ssize_t remote_mac_store(struct config_item *ite= m, const char *buf, u8 remote_mac[ETH_ALEN]; ssize_t ret =3D -EINVAL; =20 - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); if (nt->state =3D=3D STATE_ENABLED) { pr_err("target (%s) is enabled, disable to update parameters\n", config_item_name(&nt->group.cg_item)); @@ -863,7 +882,7 @@ static ssize_t remote_mac_store(struct config_item *ite= m, const char *buf, =20 ret =3D strnlen(buf, count); out_unlock: - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); return ret; } =20 @@ -984,7 +1003,7 @@ static ssize_t userdatum_value_store(struct config_ite= m *item, const char *buf, return -EMSGSIZE; =20 mutex_lock(&netconsole_subsys.su_mutex); - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); =20 ret =3D strscpy(udm->value, buf, sizeof(udm->value)); if (ret < 0) @@ -998,7 +1017,7 @@ static ssize_t userdatum_value_store(struct config_ite= m *item, const char *buf, goto out_unlock; ret =3D count; out_unlock: - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); mutex_unlock(&netconsole_subsys.su_mutex); return ret; } @@ -1026,7 +1045,7 @@ static ssize_t sysdata_msgid_enabled_store(struct con= fig_item *item, return ret; =20 mutex_lock(&netconsole_subsys.su_mutex); - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); curr =3D !!(nt->sysdata_fields & SYSDATA_MSGID); if (msgid_enabled =3D=3D curr) goto unlock_ok; @@ -1038,7 +1057,7 @@ static ssize_t sysdata_msgid_enabled_store(struct con= fig_item *item, =20 unlock_ok: ret =3D strnlen(buf, count); - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); mutex_unlock(&netconsole_subsys.su_mutex); return ret; } @@ -1055,7 +1074,7 @@ static ssize_t sysdata_release_enabled_store(struct c= onfig_item *item, return ret; =20 mutex_lock(&netconsole_subsys.su_mutex); - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); curr =3D !!(nt->sysdata_fields & SYSDATA_RELEASE); if (release_enabled =3D=3D curr) goto unlock_ok; @@ -1067,7 +1086,7 @@ static ssize_t sysdata_release_enabled_store(struct c= onfig_item *item, =20 unlock_ok: ret =3D strnlen(buf, count); - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); mutex_unlock(&netconsole_subsys.su_mutex); return ret; } @@ -1084,7 +1103,7 @@ static ssize_t sysdata_taskname_enabled_store(struct = config_item *item, return ret; =20 mutex_lock(&netconsole_subsys.su_mutex); - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); curr =3D !!(nt->sysdata_fields & SYSDATA_TASKNAME); if (taskname_enabled =3D=3D curr) goto unlock_ok; @@ -1096,7 +1115,7 @@ static ssize_t sysdata_taskname_enabled_store(struct = config_item *item, =20 unlock_ok: ret =3D strnlen(buf, count); - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); mutex_unlock(&netconsole_subsys.su_mutex); return ret; } @@ -1114,7 +1133,7 @@ static ssize_t sysdata_cpu_nr_enabled_store(struct co= nfig_item *item, return ret; =20 mutex_lock(&netconsole_subsys.su_mutex); - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); curr =3D !!(nt->sysdata_fields & SYSDATA_CPU_NR); if (cpu_nr_enabled =3D=3D curr) /* no change requested */ @@ -1130,7 +1149,7 @@ static ssize_t sysdata_cpu_nr_enabled_store(struct co= nfig_item *item, =20 unlock_ok: ret =3D strnlen(buf, count); - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); mutex_unlock(&netconsole_subsys.su_mutex); return ret; } @@ -1192,10 +1211,10 @@ static void userdatum_drop(struct config_group *gro= up, struct config_item *item) ud =3D to_userdata(&group->cg_item); nt =3D userdata_to_target(ud); =20 - mutex_lock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_lock(); update_userdata(nt); config_item_put(item); - mutex_unlock(&dynamic_netconsole_mutex); + dynamic_netconsole_mutex_unlock(); } =20 static struct configfs_attribute *userdata_attrs[] =3D { --=20 2.52.0 From nobody Sun Feb 8 00:49:40 2026 Received: from mail-ej1-f43.google.com (mail-ej1-f43.google.com [209.85.218.43]) (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 2B82334C13B for ; Mon, 12 Jan 2026 09:41:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768210882; cv=none; b=iyTFh9+W0YxiTOWmsVwOoDPbi9Sp85G8OURpWlJkPZGI68rUKJR3BYC9NHqQtGAbGGYfc5rkJRFcE9LeNK9fsfND8Oa4k+flqbhy8W532cALriCrms7auhF13PxSXS0yt04jkSHNEklvIrIOaFJM7gOQx7aKKbB0DAHVa8F3F+k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768210882; c=relaxed/simple; bh=r1PE8fDi2fMuVloDtOFpaMYOvsXBjkenyxTGboQyEIM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gDwz9afPY4RSG2P5hVv63SqIy68F6IF/sVDWDPaU4mxH56tcAnvHLp3qSv7YgqvUFz8Iqe5a4YzBZpVrUOn6LB0lgp7v7n/a17U4VweFnZYltXQLeLYRnvRy7na/8s//SvztM+NFgh5IcmbcYXVmr0A4Xa1EtfyNpSGnDPWS3h8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=MdIela76; arc=none smtp.client-ip=209.85.218.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="MdIela76" Received: by mail-ej1-f43.google.com with SMTP id a640c23a62f3a-b872f1c31f1so13899766b.0 for ; Mon, 12 Jan 2026 01:41:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768210872; x=1768815672; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=qpQJfNEVMidDJUe69qz1mLAVV7hXmHzYrjKAzwHkdw4=; b=MdIela76AAT2CYlBY7Do6dqoG1sGrlbHvVwKqjsGpEEFWWL2ec/guT9pvBZLlHmFvW HqREKgrZpCuJA0lpfRyBJFA3kW7w2dS97I1QHHSaq2xeD0xEcQj3hcGvsqUNLPIUANhs OH2TomNRQapWIKHehocVcqazrRwyanuqquVAEpRxXCyX15NnwtjrpR/A2wv2XbXyPc2t o9kD9b8OtOV9uQFQhJxvd0Xmg8D2N4N3VvP7tK0ng/XHp3WxgQ+ubRUudO+7feb9GpDA JKT5NRcqtCqUGGSFOfYSR4dLOJCL7eUPXT1L+6Lm2VCz9kyW4spGP6dM45T7vuXMU6Da hI/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768210872; x=1768815672; 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=qpQJfNEVMidDJUe69qz1mLAVV7hXmHzYrjKAzwHkdw4=; b=m0zHzh7/cr9vX2N00X5gmZJ52bChLi3BZwmpScLN3yDsttqpj/tbgNEwjTk6fIQx24 Q34LoUXMpZooPdN6XnLxyWo2V1Ji4qetfz3XhIZ3JK97gD00QDA5JCGUceg2dxWZUkid VnYC2ddBNBoIflcHqUlh5+XrI0UJwsS+pc4d9YAYRO4OE+vdYitTsicVLScujLxIjqm4 trS5IVq1UbReVE0b1UerHtVsoBxG3Pd174L7kU6pCsCWwj+Tkq4VXt6Be8fl68D2LYNy +/ptt57CboYvpOa+kZeu5+irEkJ7BxQ30jJ/M1exDg1dSRm0w7jgCTXVFb1yEN76YiNR C4Ow== X-Forwarded-Encrypted: i=1; AJvYcCWvSP6B0Fno1payjShRuBCoULrWfPVSiOs8RVZBAVMyvT7PFGBF19Ff21qlN/eHi6fX6nIVugeD8eMxxV8=@vger.kernel.org X-Gm-Message-State: AOJu0YzX3PVYFzfJAfniDR5Me83nWvamTu91u/SXgJbd/N5MXDXPyQh0 oD+uXVMnQKGGcKn70PzqvVs7R7BmokHqFXhdznSh38OaVIPkyjaxgvX6 X-Gm-Gg: AY/fxX45OM+SjwfwFbpXaBN6xnQQt463OYGoZrC2k+vFzF51hsTlvZm21xFZUACdEQ7 KsjP5aET1OknovaXgJIAd4pH4A0Y3pk4jy7fzGip2GM+/HqCr6Qgw45UlMMy0FBYTUJbayUrHPI jwtpfkbptCWMa4MxnJv0xgmvxHajUF6ma6VR3rhQHyNi+o1ZxvyugkoltDInNpO4cV7F8JVSDs/ iiUgDIfg0F89Kg8nYeiKqMPD5fcHxwOhROnPBzFn9L70NhlH3aa4B/AK7o8HBfO6eCVXNT2bBQf 78r5IOJZXQ5Oq7OaDXdrXgSc/7+ZwxOzyAjeZXwipm6tA0Hrd59tP8aVd3AFknG6aQm1KvjgKuh L6elwxjRw4BETpX8hCmSddbVMuR+zv1lkp3QFg6Pykn4OzAJnywUWsqQ0GF7MCA6jIbfqyiPVkm EGfbmU84fw6wEOkw== X-Google-Smtp-Source: AGHT+IElBQj5xgjZNMo/SofYr/1zC1dX3E6h9qPiSNrkW8u9b+CtK0Wwh85R4DKfzUJZlEY4evhbpA== X-Received: by 2002:a17:907:7296:b0:b87:19af:3e4d with SMTP id a640c23a62f3a-b8719af3f43mr222160266b.22.1768210872003; Mon, 12 Jan 2026 01:41:12 -0800 (PST) Received: from [192.168.1.243] ([143.58.192.3]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b870bcd342bsm410828766b.56.2026.01.12.01.41.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Jan 2026 01:41:11 -0800 (PST) From: Andre Carvalho Date: Mon, 12 Jan 2026 09:40:57 +0000 Subject: [PATCH net-next v10 6/7] netconsole: resume previously deactivated 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: quoted-printable Message-Id: <20260112-netcons-retrigger-v10-6-d82ebfc2503e@gmail.com> References: <20260112-netcons-retrigger-v10-0-d82ebfc2503e@gmail.com> In-Reply-To: <20260112-netcons-retrigger-v10-0-d82ebfc2503e@gmail.com> To: Breno Leitao , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Shuah Khan , Simon Horman Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Andre Carvalho X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768210863; l=9836; i=asantostc@gmail.com; s=20250807; h=from:subject:message-id; bh=r1PE8fDi2fMuVloDtOFpaMYOvsXBjkenyxTGboQyEIM=; b=tykV62ht+/NiUPNuK/wlUckVAa0RQviGHV/WkPVe4u48D/s+YWg1B9nXIYN2GmqgkfDVaS32h Y2P853khVqeA/P1AgbM6gR77O8MH5vX45ikblNlYA393q3X5EDq9Ewx X-Developer-Key: i=asantostc@gmail.com; a=ed25519; pk=eWre+RwFHCxkiaQrZLsjC67mZ/pZnzSM/f7/+yFXY4Q= Attempt to resume a previously deactivated target when the associated interface comes back (NETDEV_REGISTER) or when it changes name (NETDEV_CHANGENAME) by calling netpoll_setup on the device. Depending on how the target was setup (by mac or interface name), the corresponding field is compared with the device being brought up. Targets that match the incoming device, are scheduled for resume on a workqueue. Resuming happens on a workqueue as we can't execute netpoll_setup in the context of the netdev event. A standalone workqueue (as opposed to the global one) is used to allow for proper cleanup process during netconsole module cleanup as we need to be able to flush all pending work before traversing the target list given that targets are temporarily removed from the list during resume_target. Target transitions to STATE_DISABLED in case of failures resuming it to avoid retrying the same target indefinitely. Signed-off-by: Andre Carvalho --- drivers/net/netconsole.c | 127 +++++++++++++++++++++++++++++++++++++++++++= +--- 1 file changed, 120 insertions(+), 7 deletions(-) diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c index 46d990f3d904..82c232f9ede2 100644 --- a/drivers/net/netconsole.c +++ b/drivers/net/netconsole.c @@ -39,6 +39,7 @@ #include #include #include +#include =20 MODULE_AUTHOR("Matt Mackall "); MODULE_DESCRIPTION("Console driver for network interfaces"); @@ -85,6 +86,8 @@ static DEFINE_SPINLOCK(target_list_lock); /* This needs to be a mutex because netpoll_cleanup might sleep */ static DEFINE_MUTEX(target_cleanup_list_lock); =20 +static struct workqueue_struct *netconsole_wq; + /* * Console driver for netconsoles. Register only consoles that have * an associated target of the same type. @@ -138,10 +141,14 @@ enum target_state { * @stats: Packet send stats for the target. Used for debugging. * @state: State of the target. * Visible from userspace (read-write). - * We maintain a strict 1:1 correspondence between this and - * whether the corresponding netpoll is active or inactive. + * From a userspace perspective, the target is either enabled or + * disabled. Internally, although both STATE_DISABLED and + * STATE_DEACTIVATED correspond to inactive targets, the latter is + * due to automatic interface state changes and will try + * recover automatically, if the interface comes back + * online. * Also, other parameters of a target may be modified at - * runtime only when it is disabled (state =3D=3D STATE_DISABLED). + * runtime only when it is disabled (state !=3D STATE_ENABLED). * @extended: Denotes whether console is extended or not. * @release: Denotes whether kernel release version should be prepended * to the message. Depends on extended console. @@ -155,6 +162,7 @@ enum target_state { * local_mac (read-only) * remote_mac (read-write) * @buf: The buffer used to send the full msg to the network stack + * @resume_wq: Workqueue to resume deactivated target */ struct netconsole_target { struct list_head list; @@ -177,6 +185,7 @@ struct netconsole_target { struct netpoll np; /* protected by target_list_lock */ char buf[MAX_PRINT_CHUNK]; + struct work_struct resume_wq; }; =20 #ifdef CONFIG_NETCONSOLE_DYNAMIC @@ -267,6 +276,70 @@ static bool bound_by_mac(struct netconsole_target *nt) return is_valid_ether_addr(nt->np.dev_mac); } =20 +/* Attempts to resume logging to a deactivated target. */ +static void resume_target(struct netconsole_target *nt) +{ + if (netpoll_setup(&nt->np)) { + /* netpoll fails setup once, do not try again. */ + nt->state =3D STATE_DISABLED; + return; + } + + nt->state =3D STATE_ENABLED; + pr_info("network logging resumed on interface %s\n", nt->np.dev_name); +} + +/* Checks if a deactivated target matches a device. */ +static bool deactivated_target_match(struct netconsole_target *nt, + struct net_device *ndev) +{ + if (nt->state !=3D STATE_DEACTIVATED) + return false; + + if (bound_by_mac(nt)) + return !memcmp(nt->np.dev_mac, ndev->dev_addr, ETH_ALEN); + return !strncmp(nt->np.dev_name, ndev->name, IFNAMSIZ); +} + +/* Process work scheduled for target resume. */ +static void process_resume_target(struct work_struct *work) +{ + struct netconsole_target *nt; + unsigned long flags; + + nt =3D container_of(work, struct netconsole_target, resume_wq); + + dynamic_netconsole_mutex_lock(); + + spin_lock_irqsave(&target_list_lock, flags); + /* Check if target is still deactivated as it may have been disabled + * while resume was being scheduled. + */ + if (nt->state !=3D STATE_DEACTIVATED) { + spin_unlock_irqrestore(&target_list_lock, flags); + goto out_unlock; + } + + /* resume_target is IRQ unsafe, remove target from + * target_list in order to resume it with IRQ enabled. + */ + list_del_init(&nt->list); + spin_unlock_irqrestore(&target_list_lock, flags); + + resume_target(nt); + + /* At this point the target is either enabled or disabled and + * was cleaned up before getting deactivated. Either way, add it + * back to target list. + */ + spin_lock_irqsave(&target_list_lock, flags); + list_add(&nt->list, &target_list); + spin_unlock_irqrestore(&target_list_lock, flags); + +out_unlock: + dynamic_netconsole_mutex_unlock(); +} + /* Allocate and initialize with defaults. * Note that these targets get their config_item fields zeroed-out. */ @@ -289,6 +362,7 @@ static struct netconsole_target *alloc_and_init(void) nt->np.remote_port =3D 6666; eth_broadcast_addr(nt->np.remote_mac); nt->state =3D STATE_DISABLED; + INIT_WORK(&nt->resume_wq, process_resume_target); =20 return nt; } @@ -1353,13 +1427,29 @@ static struct config_group *make_netconsole_target(= struct config_group *group, static void drop_netconsole_target(struct config_group *group, struct config_item *item) { - unsigned long flags; struct netconsole_target *nt =3D to_target(item); + unsigned long flags; + + dynamic_netconsole_mutex_lock(); =20 spin_lock_irqsave(&target_list_lock, flags); + /* Disable deactivated target to prevent races between resume attempt + * and target removal. + */ + if (nt->state =3D=3D STATE_DEACTIVATED) + nt->state =3D STATE_DISABLED; list_del(&nt->list); spin_unlock_irqrestore(&target_list_lock, flags); =20 + dynamic_netconsole_mutex_unlock(); + + /* Now that the target has been marked disabled no further work + * can be scheduled. Existing work will skip as targets are not + * deactivated anymore. Cancel any scheduled resume and wait for + * completion. + */ + cancel_work_sync(&nt->resume_wq); + /* * The target may have never been enabled, or was manually disabled * before being removed so netpoll may have already been cleaned up. @@ -1461,13 +1551,14 @@ static int prepare_sysdata(struct netconsole_target= *nt) static int netconsole_netdev_event(struct notifier_block *this, unsigned long event, void *ptr) { - unsigned long flags; - struct netconsole_target *nt, *tmp; struct net_device *dev =3D netdev_notifier_info_to_dev(ptr); + struct netconsole_target *nt, *tmp; bool stopped =3D false; + unsigned long flags; =20 if (!(event =3D=3D NETDEV_CHANGENAME || event =3D=3D NETDEV_UNREGISTER || - event =3D=3D NETDEV_RELEASE || event =3D=3D NETDEV_JOIN)) + event =3D=3D NETDEV_RELEASE || event =3D=3D NETDEV_JOIN || + event =3D=3D NETDEV_REGISTER)) goto done; =20 mutex_lock(&target_cleanup_list_lock); @@ -1496,6 +1587,13 @@ static int netconsole_netdev_event(struct notifier_b= lock *this, stopped =3D true; } } + if ((event =3D=3D NETDEV_REGISTER || event =3D=3D NETDEV_CHANGENAME) && + deactivated_target_match(nt, dev)) + /* Schedule resume on a workqueue as it will attempt + * to UP the device, which can't be done as part of this + * notifier. + */ + queue_work(netconsole_wq, &nt->resume_wq); netconsole_target_put(nt); } spin_unlock_irqrestore(&target_list_lock, flags); @@ -1964,6 +2062,7 @@ static struct netconsole_target *alloc_param_target(c= har *target_config, /* Cleanup netpoll for given target (from boot/module param) and free it */ static void free_param_target(struct netconsole_target *nt) { + cancel_work_sync(&nt->resume_wq); netpoll_cleanup(&nt->np); #ifdef CONFIG_NETCONSOLE_DYNAMIC kfree(nt->userdata); @@ -2018,6 +2117,12 @@ static int __init init_netconsole(void) } } =20 + netconsole_wq =3D alloc_workqueue("netconsole", WQ_UNBOUND, 0); + if (!netconsole_wq) { + err =3D -ENOMEM; + goto fail; + } + err =3D register_netdevice_notifier(&netconsole_netdev_notifier); if (err) goto fail; @@ -2040,6 +2145,8 @@ static int __init init_netconsole(void) fail: pr_err("cleaning up\n"); =20 + if (netconsole_wq) + flush_workqueue(netconsole_wq); /* * Remove all targets and destroy them (only targets created * from the boot/module option exist here). Skipping the list @@ -2050,6 +2157,9 @@ static int __init init_netconsole(void) free_param_target(nt); } =20 + if (netconsole_wq) + destroy_workqueue(netconsole_wq); + return err; } =20 @@ -2063,6 +2173,7 @@ static void __exit cleanup_netconsole(void) unregister_console(&netconsole); dynamic_netconsole_exit(); unregister_netdevice_notifier(&netconsole_netdev_notifier); + flush_workqueue(netconsole_wq); =20 /* * Targets created via configfs pin references on our module @@ -2076,6 +2187,8 @@ static void __exit cleanup_netconsole(void) list_del(&nt->list); free_param_target(nt); } + + destroy_workqueue(netconsole_wq); } =20 /* --=20 2.52.0 From nobody Sun Feb 8 00:49:40 2026 Received: from mail-ej1-f46.google.com (mail-ej1-f46.google.com [209.85.218.46]) (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 EEAFB34AB03 for ; Mon, 12 Jan 2026 09:41:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768210880; cv=none; b=X1IgL/pWBYz3kbyh20WHJeG5pHjHMGgKTIaYoXDXQ/pjXIs4XjZ3yZdNvDrxcpfSuO2lUuVEcjh0sxNPjdB/BM3laFdHzuarnvCHClQ91HgxqnOB66j5/fPqqhxzPQbDDfkTkrIQVEoFuVHOQ8WIx90aLzyxH3j3x/ncIWmnGs0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768210880; c=relaxed/simple; bh=KSC8Nj3DiK31fDmZ4/PzcbAzUlQgw1PwPAvmb/6l8Os=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lcWJxAQlcbvnIUvOJwDBrXwgz2CIZpWyO3jUElmpgdb466B1Zd7YjCeEK2jJU49v3g7q+vdywcrHVWyzf7ynkp7OW5FLXavKFuEUmwVbF7Be0RMbCslyyfVb1TRuaTJSSrLe6GZhivLiHbAJvRkSWnMKfieCi0qDyTkYRwvW970= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=k4Rg5gtr; arc=none smtp.client-ip=209.85.218.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="k4Rg5gtr" Received: by mail-ej1-f46.google.com with SMTP id a640c23a62f3a-b87281dbdbcso52710866b.0 for ; Mon, 12 Jan 2026 01:41:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768210874; x=1768815674; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=2RFEABt6Iiak9nuJmj7Wxw5Z8I9sCXd9qm2gCXqcVTA=; b=k4Rg5gtrQzZNDFwPEua/3PteELL8IOfQ76OrcxIPrd7hmF3EMtSTW93tIpL+OaBmXl 8HL3DUkpewKwM0YM4jx6YxsVegRMX+MxxhNxM3FTlw71JjFCGxMj3lhd2mhsyOg8EfdL Xk2kFp3j4LX47D/v33R/bpeYOwKp7BJDgWgKWGTo5cLd6VqGk1JtdbGCZs39nzjiBBrc RW3speVSWuV45YO0jW+2suJT3b9O7TCsirkbsCuzUney+jq6YXtuRZIlyWESpEBm2I1l JCVXfkdS+d6dQPDh9upvynPl4VfKZLSjTJtCbfKLWiP9+Ox7m4KsvvulkmXGTp4ASwIH SdcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768210874; x=1768815674; 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=2RFEABt6Iiak9nuJmj7Wxw5Z8I9sCXd9qm2gCXqcVTA=; b=I0Zg7g9vX1kVTQ/r82nZs8qeFRWUpmLR5mSTkULhUUDzOOW1Wo8NNzvSWOM21jh7DC JQnvmC0GQYBs2WCMeEQcUM4ihO2kMm7TSvtvZQAS+GDtfg+fccJuHoUF2r7uar2uXZm3 6JEczN+/4KRO5Jmv2E4c94ZC5C0VwIPPWZ5b7kQbxd/82seh4e/Lt4A2zkkY8zgepgo2 WO+yLlPS25u8LXTV3teuM8OAZYLFR0oYMW+QeW//dI7jeN8VWFZ9Oge5MoZNG/yLNDgU BQ8JSrqBpUcXx8RhMZDOJrinMX3qmpBqdr8SccEvYQurgGkPHxaK0pFl0jQoIvLzYOIq zT7Q== X-Forwarded-Encrypted: i=1; AJvYcCVFpkY69dTU69NpPN+VwvrAdKdu1XDLO/G3bM548TO2IcccR76nCjszAKilmdSc4kJ/AcVqPuobprL9QS8=@vger.kernel.org X-Gm-Message-State: AOJu0Yx6IhZzsDs95arRtFwpAvPUcKMFk4mlxF+O2vr5k6wgVEK1RxoW 87GT1j/eKEIw4KqWujYFhI15Y+lid2CNiPf+CMAW+LIsKyZRBD99KVoR X-Gm-Gg: AY/fxX4VtKVr3b8KHNYWipIb4c+M5Z03Iyg06FWHGoT7zo1I2KQVjwlp5oA9IVYqKEC XvUUF3YP6mKaVLV2isGDy8REgEqyjoG4CMzwa4cPI3fh/l43DGrzQ92dBpxx/zS25eRNwN43mSU 0Lpz1Yyqr0JbhVwb4nACB7vt/3ANYA9gIaT/2rM7CXl0GZPT54PO4pRHcYEdGKKiXI+yKPpbnKy jySZtdN/YZWdj2vq6Wqwbv+oBuNltzLfo55aFLFABMNnZEnRFMrfIHoNl4+EX96rYZAkHsb9CAy JUUlx0UTKZCfo94cgyL02O96wsclg1ZpOtcxArynxP2vET+p5lYDgwCBTRZWbx7yd8m/WOJH0XF lriHKOqskGjSTsaP4XaB+ll/tm0V7STcmg8O+zmLecV9w3yG5zGGzAcbFRhYKMdtlF6XFc+FJ45 /OhPCcMvEh4o1DWo8+M2Su+0m6 X-Google-Smtp-Source: AGHT+IE3wiOXJvIMJw8ueQ9HmSpunkUpmolMVZVGfJsiMnps0ap0V1WAk3+kWd4HECoGsMIKWUcuqw== X-Received: by 2002:a17:907:86a5:b0:b87:6d0:df2a with SMTP id a640c23a62f3a-b8706d0e1e9mr437193266b.40.1768210873498; Mon, 12 Jan 2026 01:41:13 -0800 (PST) Received: from [192.168.1.243] ([143.58.192.3]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b870bcd342bsm410828766b.56.2026.01.12.01.41.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Jan 2026 01:41:12 -0800 (PST) From: Andre Carvalho Date: Mon, 12 Jan 2026 09:40:58 +0000 Subject: [PATCH net-next v10 7/7] selftests: netconsole: validate target resume 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: quoted-printable Message-Id: <20260112-netcons-retrigger-v10-7-d82ebfc2503e@gmail.com> References: <20260112-netcons-retrigger-v10-0-d82ebfc2503e@gmail.com> In-Reply-To: <20260112-netcons-retrigger-v10-0-d82ebfc2503e@gmail.com> To: Breno Leitao , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Shuah Khan , Simon Horman Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Andre Carvalho X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1768210863; l=6537; i=asantostc@gmail.com; s=20250807; h=from:subject:message-id; bh=KSC8Nj3DiK31fDmZ4/PzcbAzUlQgw1PwPAvmb/6l8Os=; b=yT390LC8bW9NHpfY3TcipbMrxZ1ISAJCIIideT52vdpL2kwc0ZJtpmUDb7SyZ6EhSZKrh9A56 kiD5h+lpd5OCA7yQCr9if1+60dgN/t+nBN+mVJu0b4/kjEelQ209O4m X-Developer-Key: i=asantostc@gmail.com; a=ed25519; pk=eWre+RwFHCxkiaQrZLsjC67mZ/pZnzSM/f7/+yFXY4Q= Introduce a new netconsole selftest to validate that netconsole is able to resume a deactivated target when the low level interface comes back. The test setups the network using netdevsim, creates a netconsole target and then remove/add netdevsim in order to bring the same interfaces back. Afterwards, the test validates that the target works as expected. Targets are created via cmdline parameters to the module to ensure that we are able to resume targets that were bound by mac and interface name. Reviewed-by: Breno Leitao Signed-off-by: Andre Carvalho --- tools/testing/selftests/drivers/net/Makefile | 1 + .../selftests/drivers/net/lib/sh/lib_netcons.sh | 35 ++++++-- .../selftests/drivers/net/netcons_resume.sh | 97 ++++++++++++++++++= ++++ 3 files changed, 128 insertions(+), 5 deletions(-) diff --git a/tools/testing/selftests/drivers/net/Makefile b/tools/testing/s= elftests/drivers/net/Makefile index f5c71d993750..3eba569b3366 100644 --- a/tools/testing/selftests/drivers/net/Makefile +++ b/tools/testing/selftests/drivers/net/Makefile @@ -19,6 +19,7 @@ TEST_PROGS :=3D \ netcons_cmdline.sh \ netcons_fragmented_msg.sh \ netcons_overflow.sh \ + netcons_resume.sh \ netcons_sysdata.sh \ netcons_torture.sh \ netpoll_basic.py \ diff --git a/tools/testing/selftests/drivers/net/lib/sh/lib_netcons.sh b/to= ols/testing/selftests/drivers/net/lib/sh/lib_netcons.sh index ae8abff4be40..b6093bcf2b06 100644 --- a/tools/testing/selftests/drivers/net/lib/sh/lib_netcons.sh +++ b/tools/testing/selftests/drivers/net/lib/sh/lib_netcons.sh @@ -203,19 +203,21 @@ function do_cleanup() { function cleanup_netcons() { # delete netconsole dynamic reconfiguration # do not fail if the target is already disabled - if [[ ! -d "${NETCONS_PATH}" ]] + local TARGET_PATH=3D${1:-${NETCONS_PATH}} + + if [[ ! -d "${TARGET_PATH}" ]] then # in some cases this is called before netcons path is created return fi - if [[ $(cat "${NETCONS_PATH}"/enabled) !=3D 0 ]] + if [[ $(cat "${TARGET_PATH}"/enabled) !=3D 0 ]] then - echo 0 > "${NETCONS_PATH}"/enabled || true + echo 0 > "${TARGET_PATH}"/enabled || true fi # Remove all the keys that got created during the selftest - find "${NETCONS_PATH}/userdata/" -mindepth 1 -type d -delete + find "${TARGET_PATH}/userdata/" -mindepth 1 -type d -delete # Remove the configfs entry - rmdir "${NETCONS_PATH}" + rmdir "${TARGET_PATH}" } =20 function cleanup() { @@ -377,6 +379,29 @@ function check_netconsole_module() { fi } =20 +function wait_target_state() { + local TARGET=3D${1} + local STATE=3D${2} + local TARGET_PATH=3D"${NETCONS_CONFIGFS}"/"${TARGET}" + local ENABLED=3D0 + + if [ "${STATE}" =3D=3D "enabled" ] + then + ENABLED=3D1 + fi + + if [ ! -d "$TARGET_PATH" ]; then + echo "FAIL: Target does not exist." >&2 + exit "${ksft_fail}" + fi + + local CHECK_CMD=3D"grep \"$ENABLED\" \"$TARGET_PATH/enabled\"" + slowwait 2 sh -c "test -n \"\$($CHECK_CMD)\"" || { + echo "FAIL: ${TARGET} is not ${STATE}." >&2 + exit "${ksft_fail}" + } +} + # A wrapper to translate protocol version to udp version function wait_for_port() { local NAMESPACE=3D${1} diff --git a/tools/testing/selftests/drivers/net/netcons_resume.sh b/tools/= testing/selftests/drivers/net/netcons_resume.sh new file mode 100755 index 000000000000..383ad1149271 --- /dev/null +++ b/tools/testing/selftests/drivers/net/netcons_resume.sh @@ -0,0 +1,97 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: GPL-2.0 + +# This test validates that netconsole is able to resume a target that was +# deactivated when its interface was removed when the interface is brought +# back up. +# +# The test configures a netconsole target and then removes netdevsim modul= e to +# cause the interface to disappear. Targets are configured via cmdline to = ensure +# targets bound by interface name and mac address can be resumed. +# The test verifies that the target moved to disabled state before adding +# netdevsim and the interface back. +# +# Finally, the test verifies that the target is re-enabled automatically a= nd +# the message is received on the destination interface. +# +# Author: Andre Carvalho + +set -euo pipefail + +SCRIPTDIR=3D$(dirname "$(readlink -e "${BASH_SOURCE[0]}")") + +source "${SCRIPTDIR}"/lib/sh/lib_netcons.sh + +modprobe netdevsim 2> /dev/null || true +rmmod netconsole 2> /dev/null || true + +check_netconsole_module + +function cleanup() { + cleanup_netcons "${NETCONS_CONFIGFS}/cmdline0" + do_cleanup + rmmod netconsole +} + +trap cleanup EXIT + +# Run the test twice, with different cmdline parameters +for BINDMODE in "ifname" "mac" +do + echo "Running with bind mode: ${BINDMODE}" >&2 + # Set current loglevel to KERN_INFO(6), and default to KERN_NOTICE(5) + echo "6 5" > /proc/sys/kernel/printk + + # Create one namespace and two interfaces + set_network + + # Create the command line for netconsole, with the configuration from + # the function above + CMDLINE=3D$(create_cmdline_str "${BINDMODE}") + + # The content of kmsg will be save to the following file + OUTPUT_FILE=3D"/tmp/${TARGET}-${BINDMODE}" + + # Load the module, with the cmdline set + modprobe netconsole "${CMDLINE}" + # Expose cmdline target in configfs + mkdir "${NETCONS_CONFIGFS}/cmdline0" + + # Target should be enabled + wait_target_state "cmdline0" "enabled" + + # Remove low level module + rmmod netdevsim + # Target should be disabled + wait_target_state "cmdline0" "disabled" + + # Add back low level module + modprobe netdevsim + # Recreate namespace and two interfaces + set_network + # Target should be enabled again + wait_target_state "cmdline0" "enabled" + + # Listen for netconsole port inside the namespace and destination + # interface + listen_port_and_save_to "${OUTPUT_FILE}" & + # Wait for socat to start and listen to the port. + wait_local_port_listen "${NAMESPACE}" "${PORT}" udp + # Send the message + echo "${MSG}: ${TARGET}" > /dev/kmsg + # Wait until socat saves the file to disk + busywait "${BUSYWAIT_TIMEOUT}" test -s "${OUTPUT_FILE}" + # Make sure the message was received in the dst part + # and exit + validate_msg "${OUTPUT_FILE}" + + # kill socat in case it is still running + pkill_socat + # Cleanup & unload the module + cleanup + + echo "${BINDMODE} : Test passed" >&2 +done + +trap - EXIT +exit "${EXIT_STATUS}" --=20 2.52.0