* [PATCH v2 0/2] netconsole: allow selection of egress interface via MAC address
@ 2025-02-04 21:41 Uday Shankar
2025-02-04 21:41 ` [PATCH v2 1/2] net, treewide: define and use MAC_ADDR_LEN Uday Shankar
2025-02-04 21:41 ` [PATCH v2 2/2] netconsole: allow selection of egress interface via MAC address Uday Shankar
0 siblings, 2 replies; 7+ messages in thread
From: Uday Shankar @ 2025-02-04 21:41 UTC (permalink / raw)
To: Breno Leitao, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Srinivas Kandagatla,
Rafał Miłecki, Simon Horman, Andrew Morton,
Johannes Berg, Jonathan Corbet
Cc: netdev, linux-kernel, linux-wireless, linux-doc, Uday Shankar
This series adds support for selecting a netconsole egress interface by
specifying the MAC address (in place of the interface name) in the
boot/module parameter.
Changes since v1 (https://lore.kernel.org/netdev/20241211021851.1442842-1-ushankar@purestorage.com/):
- Add a patch to define and use MAC_ADDR_LEN (Simon Horman)
- Remove ability to use MAC address to select egress interface via
configfs (Breno Leitao)
- Misc style fixes (Simon Horman, Breno Leitao)
Signed-off-by: Uday Shankar <ushankar@purestorage.com>
---
Uday Shankar (2):
net, treewide: define and use MAC_ADDR_LEN
netconsole: allow selection of egress interface via MAC address
Documentation/networking/netconsole.rst | 6 +++-
drivers/net/netconsole.c | 2 +-
drivers/nvmem/brcm_nvram.c | 2 +-
drivers/nvmem/layouts/u-boot-env.c | 2 +-
include/linux/if_ether.h | 3 ++
include/linux/netpoll.h | 6 ++++
lib/net_utils.c | 4 +--
net/core/netpoll.c | 51 +++++++++++++++++++++++++--------
net/mac80211/debugfs_sta.c | 5 ++--
9 files changed, 60 insertions(+), 21 deletions(-)
---
base-commit: c2933b2befe25309f4c5cfbea0ca80909735fd76
change-id: 20250204-netconsole-4c610e2f871c
Best regards,
--
Uday Shankar <ushankar@purestorage.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 1/2] net, treewide: define and use MAC_ADDR_LEN
2025-02-04 21:41 [PATCH v2 0/2] netconsole: allow selection of egress interface via MAC address Uday Shankar
@ 2025-02-04 21:41 ` Uday Shankar
2025-02-05 7:25 ` Johannes Berg
2025-02-06 9:31 ` kernel test robot
2025-02-04 21:41 ` [PATCH v2 2/2] netconsole: allow selection of egress interface via MAC address Uday Shankar
1 sibling, 2 replies; 7+ messages in thread
From: Uday Shankar @ 2025-02-04 21:41 UTC (permalink / raw)
To: Breno Leitao, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Srinivas Kandagatla,
Rafał Miłecki, Simon Horman, Andrew Morton,
Johannes Berg, Jonathan Corbet
Cc: netdev, linux-kernel, linux-wireless, linux-doc, Uday Shankar
There are a few places in the tree which compute the length of the
string representation of a MAC address as 3 * ETH_ALEN - 1. Define a
constant for this and use it where relevant. No functionality changes
are expected.
Signed-off-by: Uday Shankar <ushankar@purestorage.com>
---
drivers/net/netconsole.c | 2 +-
drivers/nvmem/brcm_nvram.c | 2 +-
drivers/nvmem/layouts/u-boot-env.c | 2 +-
include/linux/if_ether.h | 3 +++
lib/net_utils.c | 4 +---
net/mac80211/debugfs_sta.c | 5 +++--
6 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c
index 86ab4a42769a49eebe5dd6f01dafafc6c86ec54f..78c143e65a3f337929f91f70b77e5bc88365eea7 100644
--- a/drivers/net/netconsole.c
+++ b/drivers/net/netconsole.c
@@ -675,7 +675,7 @@ static ssize_t remote_mac_store(struct config_item *item, const char *buf,
if (!mac_pton(buf, remote_mac))
goto out_unlock;
- if (buf[3 * ETH_ALEN - 1] && buf[3 * ETH_ALEN - 1] != '\n')
+ if (buf[MAC_ADDR_LEN] && buf[MAC_ADDR_LEN] != '\n')
goto out_unlock;
memcpy(nt->np.remote_mac, remote_mac, ETH_ALEN);
diff --git a/drivers/nvmem/brcm_nvram.c b/drivers/nvmem/brcm_nvram.c
index b810df727b446b1762a1851750f743e0de6e8788..43608e45c58aa96a505d82733de1b24ef8d18a1b 100644
--- a/drivers/nvmem/brcm_nvram.c
+++ b/drivers/nvmem/brcm_nvram.c
@@ -100,7 +100,7 @@ static int brcm_nvram_read_post_process_macaddr(void *context, const char *id, i
{
u8 mac[ETH_ALEN];
- if (bytes != 3 * ETH_ALEN - 1)
+ if (bytes != MAC_ADDR_LEN)
return -EINVAL;
if (!mac_pton(buf, mac))
diff --git a/drivers/nvmem/layouts/u-boot-env.c b/drivers/nvmem/layouts/u-boot-env.c
index 731e6f4f12b2bf28e4547d128954a095545ad461..4a6c0d0e6dc90a138bfbb402d401d41f59c021f8 100644
--- a/drivers/nvmem/layouts/u-boot-env.c
+++ b/drivers/nvmem/layouts/u-boot-env.c
@@ -37,7 +37,7 @@ static int u_boot_env_read_post_process_ethaddr(void *context, const char *id, i
{
u8 mac[ETH_ALEN];
- if (bytes != 3 * ETH_ALEN - 1)
+ if (bytes != MAC_ADDR_LEN)
return -EINVAL;
if (!mac_pton(buf, mac))
diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h
index 8a9792a6427ad9cf58b50c79cbfe185615800dcb..afb2fdc0af653626034ae5e19309c8427272a828 100644
--- a/include/linux/if_ether.h
+++ b/include/linux/if_ether.h
@@ -19,6 +19,9 @@
#include <linux/skbuff.h>
#include <uapi/linux/if_ether.h>
+/* XX:XX:XX:XX:XX:XX */
+#define MAC_ADDR_LEN (3 * ETH_ALEN - 1)
+
static inline struct ethhdr *eth_hdr(const struct sk_buff *skb)
{
return (struct ethhdr *)skb_mac_header(skb);
diff --git a/lib/net_utils.c b/lib/net_utils.c
index 42bb0473fb22f977409f7a6792bb1340f4e911c3..0aedd4854d85ba89dbf0e7451b3f6b197cfac1de 100644
--- a/lib/net_utils.c
+++ b/lib/net_utils.c
@@ -7,11 +7,9 @@
bool mac_pton(const char *s, u8 *mac)
{
- size_t maxlen = 3 * ETH_ALEN - 1;
int i;
- /* XX:XX:XX:XX:XX:XX */
- if (strnlen(s, maxlen) < maxlen)
+ if (strnlen(s, MAC_ADDR_LEN) < MAC_ADDR_LEN)
return false;
/* Don't dirty result unless string is valid MAC. */
diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c
index a67a9d3160086ac492d77092a0c8a74d2384b28c..29f45382367e4f6cceb0e0b5f04db1c408da712e 100644
--- a/net/mac80211/debugfs_sta.c
+++ b/net/mac80211/debugfs_sta.c
@@ -457,11 +457,12 @@ static ssize_t link_sta_addr_read(struct file *file, char __user *userbuf,
size_t count, loff_t *ppos)
{
struct link_sta_info *link_sta = file->private_data;
- u8 mac[3 * ETH_ALEN + 1];
+ u8 mac[MAC_ADDR_LEN + 2];
snprintf(mac, sizeof(mac), "%pM\n", link_sta->pub->addr);
- return simple_read_from_buffer(userbuf, count, ppos, mac, 3 * ETH_ALEN);
+ return simple_read_from_buffer(userbuf, count, ppos, mac,
+ MAC_ADDR_LEN + 1);
}
LINK_STA_OPS(addr);
--
2.34.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 2/2] netconsole: allow selection of egress interface via MAC address
2025-02-04 21:41 [PATCH v2 0/2] netconsole: allow selection of egress interface via MAC address Uday Shankar
2025-02-04 21:41 ` [PATCH v2 1/2] net, treewide: define and use MAC_ADDR_LEN Uday Shankar
@ 2025-02-04 21:41 ` Uday Shankar
2025-02-05 19:07 ` Breno Leitao
1 sibling, 1 reply; 7+ messages in thread
From: Uday Shankar @ 2025-02-04 21:41 UTC (permalink / raw)
To: Breno Leitao, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Srinivas Kandagatla,
Rafał Miłecki, Simon Horman, Andrew Morton,
Johannes Berg, Jonathan Corbet
Cc: netdev, linux-kernel, linux-wireless, linux-doc, Uday Shankar
Currently, netconsole has two methods of configuration - module
parameter and configfs. The former interface allows for netconsole
activation earlier during boot (by specifying the module parameter on
the kernel command line), so it is preferred for debugging issues which
arise before userspace is up/the configfs interface can be used. The
module parameter syntax requires specifying the egress interface name.
This requirement makes it hard to use for a couple reasons:
- The egress interface name can be hard or impossible to predict. For
example, installing a new network card in a system can change the
interface names assigned by the kernel.
- When constructing the module parameter, one may have trouble
determining the original (kernel-assigned) name of the interface
(which is the name that should be given to netconsole) if some stable
interface naming scheme is in effect. A human can usually look at
kernel logs to determine the original name, but this is very painful
if automation is constructing the parameter.
For these reasons, allow selection of the egress interface via MAC
address when configuring netconsole using the module parameter. Update
the netconsole documentation with an example of the new syntax.
Selection of egress interface by MAC address via configfs is far less
interesting (since when this interface can be used, one should be able
to easily convert between MAC address and interface name), so it is left
unimplemented.
Signed-off-by: Uday Shankar <ushankar@purestorage.com>
---
Documentation/networking/netconsole.rst | 6 +++-
include/linux/netpoll.h | 6 ++++
net/core/netpoll.c | 51 +++++++++++++++++++++++++--------
3 files changed, 50 insertions(+), 13 deletions(-)
diff --git a/Documentation/networking/netconsole.rst b/Documentation/networking/netconsole.rst
index 94c4680fdf3e7e1a0020d11b44547acfd68072a5..90a1bbb52918a0163828f4e96c89781e0bc6856b 100644
--- a/Documentation/networking/netconsole.rst
+++ b/Documentation/networking/netconsole.rst
@@ -45,7 +45,7 @@ following format::
r if present, prepend kernel version (release) to the message
src-port source for UDP packets (defaults to 6665)
src-ip source IP to use (interface address)
- dev network interface (eth0)
+ dev network interface name (eth0) or MAC address
tgt-port port for logging agent (6666)
tgt-ip IP address for logging agent
tgt-macaddr ethernet MAC address for logging agent (broadcast)
@@ -62,6 +62,10 @@ or using IPv6::
insmod netconsole netconsole=@/,@fd00:1:2:3::1/
+or using a MAC address to select the egress interface::
+
+ linux netconsole=4444@10.0.0.1/22:33:44:55:66:77,9353@10.0.0.2/12:34:56:78:9a:bc
+
It also supports logging to multiple remote agents by specifying
parameters for the multiple agents separated by semicolons and the
complete string enclosed in "quotes", thusly::
diff --git a/include/linux/netpoll.h b/include/linux/netpoll.h
index f91e50a76efd4b016381c632456397eea1ea877f..1ade65b59be49cfdcf86ed6e938287b949aa9f58 100644
--- a/include/linux/netpoll.h
+++ b/include/linux/netpoll.h
@@ -25,7 +25,13 @@ union inet_addr {
struct netpoll {
struct net_device *dev;
netdevice_tracker dev_tracker;
+ /*
+ * Either dev_name or dev_mac can be used to specify the local
+ * interface - dev_name is used if it is a nonempty string, else
+ * dev_mac is used.
+ */
char dev_name[IFNAMSIZ];
+ u8 dev_mac[ETH_ALEN];
const char *name;
union inet_addr local_ip, remote_ip;
diff --git a/net/core/netpoll.c b/net/core/netpoll.c
index 62b4041aae1ae8c7dc47c89fb40b14bbd4ad0e0e..c4b329fa874748eddff64bbba13902893faebbce 100644
--- a/net/core/netpoll.c
+++ b/net/core/netpoll.c
@@ -501,7 +501,8 @@ void netpoll_print_options(struct netpoll *np)
np_info(np, "local IPv6 address %pI6c\n", &np->local_ip.in6);
else
np_info(np, "local IPv4 address %pI4\n", &np->local_ip.ip);
- np_info(np, "interface '%s'\n", np->dev_name);
+ np_info(np, "interface name '%s'\n", np->dev_name);
+ np_info(np, "local ethernet address '%pM'\n", np->dev_mac);
np_info(np, "remote port %d\n", np->remote_port);
if (np->ipv6)
np_info(np, "remote IPv6 address %pI6c\n", &np->remote_ip.in6);
@@ -570,11 +571,18 @@ int netpoll_parse_options(struct netpoll *np, char *opt)
cur++;
if (*cur != ',') {
- /* parse out dev name */
+ /* parse out dev_name or dev_mac */
if ((delim = strchr(cur, ',')) == NULL)
goto parse_failed;
*delim = 0;
- strscpy(np->dev_name, cur, sizeof(np->dev_name));
+
+ np->dev_name[0] = '\0';
+ eth_broadcast_addr(np->dev_mac);
+ if (!strchr(cur, ':'))
+ strscpy(np->dev_name, cur, sizeof(np->dev_name));
+ else if (!mac_pton(cur, np->dev_mac))
+ goto parse_failed;
+
cur = delim;
}
cur++;
@@ -679,27 +687,45 @@ int __netpoll_setup(struct netpoll *np, struct net_device *ndev)
}
EXPORT_SYMBOL_GPL(__netpoll_setup);
+/*
+ * Returns a pointer to a string representation of the identifier used
+ * to select the egress interface for the given netpoll instance. buf
+ * must be a buffer of length at least MAC_ADDR_LEN + 1.
+ */
+static char *egress_dev(struct netpoll *np, char *buf)
+{
+ if (np->dev_name[0])
+ return np->dev_name;
+
+ snprintf(buf, MAC_ADDR_LEN, "%pM", np->dev_mac);
+ return buf;
+}
+
int netpoll_setup(struct netpoll *np)
{
+ struct net *net = current->nsproxy->net_ns;
struct net_device *ndev = NULL;
bool ip_overwritten = false;
+ char buf[MAC_ADDR_LEN + 1];
struct in_device *in_dev;
int err;
rtnl_lock();
- if (np->dev_name[0]) {
- struct net *net = current->nsproxy->net_ns;
+ if (np->dev_name[0])
ndev = __dev_get_by_name(net, np->dev_name);
- }
+ else if (is_valid_ether_addr(np->dev_mac))
+ ndev = dev_getbyhwaddr_rcu(net, ARPHRD_ETHER, np->dev_mac);
+
if (!ndev) {
- np_err(np, "%s doesn't exist, aborting\n", np->dev_name);
+ np_err(np, "%s doesn't exist, aborting\n", egress_dev(np, buf));
err = -ENODEV;
goto unlock;
}
netdev_hold(ndev, &np->dev_tracker, GFP_KERNEL);
if (netdev_master_upper_dev_get(ndev)) {
- np_err(np, "%s is a slave device, aborting\n", np->dev_name);
+ np_err(np, "%s is a slave device, aborting\n",
+ egress_dev(np, buf));
err = -EBUSY;
goto put;
}
@@ -707,7 +733,8 @@ int netpoll_setup(struct netpoll *np)
if (!netif_running(ndev)) {
unsigned long atmost;
- np_info(np, "device %s not up yet, forcing it\n", np->dev_name);
+ np_info(np, "device %s not up yet, forcing it\n",
+ egress_dev(np, buf));
err = dev_open(ndev, NULL);
@@ -741,7 +768,7 @@ int netpoll_setup(struct netpoll *np)
if (!ifa) {
put_noaddr:
np_err(np, "no IP address for %s, aborting\n",
- np->dev_name);
+ egress_dev(np, buf));
err = -EDESTADDRREQ;
goto put;
}
@@ -772,13 +799,13 @@ int netpoll_setup(struct netpoll *np)
}
if (err) {
np_err(np, "no IPv6 address for %s, aborting\n",
- np->dev_name);
+ egress_dev(np, buf));
goto put;
} else
np_info(np, "local IPv6 %pI6c\n", &np->local_ip.in6);
#else
np_err(np, "IPv6 is not supported %s, aborting\n",
- np->dev_name);
+ egress_dev(np, buf));
err = -EINVAL;
goto put;
#endif
--
2.34.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 1/2] net, treewide: define and use MAC_ADDR_LEN
2025-02-04 21:41 ` [PATCH v2 1/2] net, treewide: define and use MAC_ADDR_LEN Uday Shankar
@ 2025-02-05 7:25 ` Johannes Berg
2025-02-06 9:31 ` kernel test robot
1 sibling, 0 replies; 7+ messages in thread
From: Johannes Berg @ 2025-02-05 7:25 UTC (permalink / raw)
To: Uday Shankar, Breno Leitao, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Srinivas Kandagatla,
Rafał Miłecki, Simon Horman, Andrew Morton,
Jonathan Corbet
Cc: netdev, linux-kernel, linux-wireless, linux-doc
On Tue, 2025-02-04 at 14:41 -0700, Uday Shankar wrote:
> There are a few places in the tree which compute the length of the
> string representation of a MAC address as 3 * ETH_ALEN - 1. Define a
> constant for this and use it where relevant. No functionality changes
> are expected.
True ... but is "MAC_ADDR_LEN" really an appropriate name for that? Just
plain reading the subject, my first thought was why you weren't going to
use ETH_ALEN.
Would seem nicer to me, at least, to have something indicating a
*string* in there, e.g. MAC_ADDR_STR_LEN or so.
johannes
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/2] netconsole: allow selection of egress interface via MAC address
2025-02-04 21:41 ` [PATCH v2 2/2] netconsole: allow selection of egress interface via MAC address Uday Shankar
@ 2025-02-05 19:07 ` Breno Leitao
2025-02-05 20:46 ` Uday Shankar
0 siblings, 1 reply; 7+ messages in thread
From: Breno Leitao @ 2025-02-05 19:07 UTC (permalink / raw)
To: Uday Shankar
Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Srinivas Kandagatla, Rafał Miłecki,
Simon Horman, Andrew Morton, Johannes Berg, Jonathan Corbet,
netdev, linux-kernel, linux-wireless, linux-doc
On Tue, Feb 04, 2025 at 02:41:45PM -0700, Uday Shankar wrote:
> Currently, netconsole has two methods of configuration - module
> parameter and configfs. The former interface allows for netconsole
> activation earlier during boot (by specifying the module parameter on
> the kernel command line), so it is preferred for debugging issues which
> arise before userspace is up/the configfs interface can be used. The
> module parameter syntax requires specifying the egress interface name.
> This requirement makes it hard to use for a couple reasons:
> - The egress interface name can be hard or impossible to predict. For
> example, installing a new network card in a system can change the
> interface names assigned by the kernel.
> - When constructing the module parameter, one may have trouble
> determining the original (kernel-assigned) name of the interface
> (which is the name that should be given to netconsole) if some stable
> interface naming scheme is in effect. A human can usually look at
> kernel logs to determine the original name, but this is very painful
> if automation is constructing the parameter.
>
> For these reasons, allow selection of the egress interface via MAC
> address when configuring netconsole using the module parameter. Update
> the netconsole documentation with an example of the new syntax.
> Selection of egress interface by MAC address via configfs is far less
> interesting (since when this interface can be used, one should be able
> to easily convert between MAC address and interface name), so it is left
> unimplemented.
>
> Signed-off-by: Uday Shankar <ushankar@purestorage.com>
Reviewed-by: Breno Leitao <leitao@debian.org>
Tested-by: Breno Leitao <leitao@debian.org>
> int netpoll_setup(struct netpoll *np)
> {
> + struct net *net = current->nsproxy->net_ns;
> struct net_device *ndev = NULL;
> bool ip_overwritten = false;
> + char buf[MAC_ADDR_LEN + 1];
> struct in_device *in_dev;
> int err;
>
> rtnl_lock();
> - if (np->dev_name[0]) {
> - struct net *net = current->nsproxy->net_ns;
> + if (np->dev_name[0])
> ndev = __dev_get_by_name(net, np->dev_name);
> - }
> + else if (is_valid_ether_addr(np->dev_mac))
> + ndev = dev_getbyhwaddr_rcu(net, ARPHRD_ETHER, np->dev_mac);
You do not have the RCU read lock here. You have the rtnl(), which is
sufficient, but, CONFIG_PROVE_RCU_LIST will show something as:
WARNING: suspicious RCU usage
6.13.0-09701-g6610c7be45bb-dirty #18 Not tainted
-----------------------------
net/core/dev.c:1143 RCU-list traversed in non-reader section!!
other info that might help us debug this:
rcu_scheduler_active = 2, debug_locks = 1
1 lock held by swapper/0/1:
#0: ffffffff832795b8 (rtnl_mutex){+.+.}-{4:4}, at: netpoll_setup+0x48/0x540
stack backtrace:
CPU: 1 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.13.0-virtme-09701-g6610c7be45bb-dirty #18
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014
Call Trace:
<TASK>
dump_stack_lvl+0x9f/0xf0
lockdep_rcu_suspicious+0x11a/0x150
dev_getbyhwaddr_rcu+0xb6/0xc0
netpoll_setup+0x8a/0x540
? netpoll_parse_options+0x2bd/0x310
This is not a problem per-se, since you have RTNL. We probably need to
tell for_each_netdev_rcu() to not comply about "RCU-list traversed in
non-reader section" if RTNL is held. Not sure why we didn't hit in the
test infrastructure, tho:
https://patchwork.kernel.org/project/netdevbpf/patch/20250204-netconsole-v2-2-5ef5eb5f6056@purestorage.com/
Anyway, no action item for you here. I am talking to Jakub on a way to
solve it, and I should send a fix soon.
Thanks for the patch,
--breno
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/2] netconsole: allow selection of egress interface via MAC address
2025-02-05 19:07 ` Breno Leitao
@ 2025-02-05 20:46 ` Uday Shankar
0 siblings, 0 replies; 7+ messages in thread
From: Uday Shankar @ 2025-02-05 20:46 UTC (permalink / raw)
To: Breno Leitao
Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Srinivas Kandagatla, Rafał Miłecki,
Simon Horman, Andrew Morton, Johannes Berg, Jonathan Corbet,
netdev, linux-kernel, linux-wireless, linux-doc
On Wed, Feb 05, 2025 at 11:07:45AM -0800, Breno Leitao wrote:
> > + else if (is_valid_ether_addr(np->dev_mac))
> > + ndev = dev_getbyhwaddr_rcu(net, ARPHRD_ETHER, np->dev_mac);
>
> You do not have the RCU read lock here. You have the rtnl(), which is
> sufficient, but, CONFIG_PROVE_RCU_LIST will show something as:
>
> WARNING: suspicious RCU usage
> 6.13.0-09701-g6610c7be45bb-dirty #18 Not tainted
> -----------------------------
> net/core/dev.c:1143 RCU-list traversed in non-reader section!!
> other info that might help us debug this:
> rcu_scheduler_active = 2, debug_locks = 1
> 1 lock held by swapper/0/1:
> #0: ffffffff832795b8 (rtnl_mutex){+.+.}-{4:4}, at: netpoll_setup+0x48/0x540
> stack backtrace:
> CPU: 1 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.13.0-virtme-09701-g6610c7be45bb-dirty #18
> Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014
> Call Trace:
> <TASK>
> dump_stack_lvl+0x9f/0xf0
> lockdep_rcu_suspicious+0x11a/0x150
> dev_getbyhwaddr_rcu+0xb6/0xc0
> netpoll_setup+0x8a/0x540
> ? netpoll_parse_options+0x2bd/0x310
>
> This is not a problem per-se, since you have RTNL. We probably need to
> tell for_each_netdev_rcu() to not comply about "RCU-list traversed in
> non-reader section" if RTNL is held. Not sure why we didn't hit in the
> test infrastructure, tho:
>
> https://patchwork.kernel.org/project/netdevbpf/patch/20250204-netconsole-v2-2-5ef5eb5f6056@purestorage.com/
I don't think there is an automated test that will hit this path yet. I
guess you got this trace from your manual testing?
>
> Anyway, no action item for you here. I am talking to Jakub on a way to
> solve it, and I should send a fix soon.
/**
* list_for_each_entry_rcu - iterate over rcu list of given type
* @pos: the type * to use as a loop cursor.
* @head: the head for your list.
* @member: the name of the list_head within the struct.
* @cond: optional lockdep expression if called from non-RCU protection.
*
* This list-traversal primitive may safely run concurrently with
* the _rcu list-mutation primitives such as list_add_rcu()
* as long as the traversal is guarded by rcu_read_lock().
*/
#define list_for_each_entry_rcu(pos, head, member, cond...) \
for (__list_check_rcu(dummy, ## cond, 0), \
pos = list_entry_rcu((head)->next, typeof(*pos), member); \
&pos->member != (head); \
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
If we do something like
list_for_each_entry_rcu(..., lockdep_rtnl_is_held())
...
I think that code will be okay with being called with either rcu or rtnl
held. Of course, we need to plumb it through the net-specific helpers.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 1/2] net, treewide: define and use MAC_ADDR_LEN
2025-02-04 21:41 ` [PATCH v2 1/2] net, treewide: define and use MAC_ADDR_LEN Uday Shankar
2025-02-05 7:25 ` Johannes Berg
@ 2025-02-06 9:31 ` kernel test robot
1 sibling, 0 replies; 7+ messages in thread
From: kernel test robot @ 2025-02-06 9:31 UTC (permalink / raw)
To: Uday Shankar, Breno Leitao, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Srinivas Kandagatla,
Rafał Miłecki, Simon Horman, Andrew Morton,
Johannes Berg, Jonathan Corbet
Cc: llvm, oe-kbuild-all, netdev, Linux Memory Management List,
linux-kernel, linux-wireless, linux-doc, Uday Shankar
Hi Uday,
kernel test robot noticed the following build warnings:
[auto build test WARNING on c2933b2befe25309f4c5cfbea0ca80909735fd76]
url: https://github.com/intel-lab-lkp/linux/commits/Uday-Shankar/net-treewide-define-and-use-MAC_ADDR_LEN/20250205-054620
base: c2933b2befe25309f4c5cfbea0ca80909735fd76
patch link: https://lore.kernel.org/r/20250204-netconsole-v2-1-5ef5eb5f6056%40purestorage.com
patch subject: [PATCH v2 1/2] net, treewide: define and use MAC_ADDR_LEN
config: x86_64-allyesconfig (https://download.01.org/0day-ci/archive/20250206/202502061751.GNyqzMGp-lkp@intel.com/config)
compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250206/202502061751.GNyqzMGp-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202502061751.GNyqzMGp-lkp@intel.com/
All warnings (new ones prefixed by >>):
In file included from drivers/scsi/qla4xxx/ql4_os.c:8:
In file included from include/linux/blkdev.h:9:
In file included from include/linux/blk_types.h:10:
In file included from include/linux/bvec.h:10:
In file included from include/linux/highmem.h:8:
In file included from include/linux/cacheflush.h:5:
In file included from arch/x86/include/asm/cacheflush.h:5:
In file included from include/linux/mm.h:2224:
include/linux/vmstat.h:504:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
504 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
505 | item];
| ~~~~
include/linux/vmstat.h:511:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
511 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
512 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
include/linux/vmstat.h:524:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
524 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
525 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/scsi/qla4xxx/ql4_os.c:15:
>> drivers/scsi/qla4xxx/ql4_def.h:148:9: warning: 'MAC_ADDR_LEN' macro redefined [-Wmacro-redefined]
148 | #define MAC_ADDR_LEN 6 /* in bytes */
| ^
include/linux/if_ether.h:23:9: note: previous definition is here
23 | #define MAC_ADDR_LEN (3 * ETH_ALEN - 1)
| ^
4 warnings generated.
--
In file included from drivers/net/wireless/realtek/rtlwifi/rtl8188ee/dm.c:4:
In file included from drivers/net/wireless/realtek/rtlwifi/rtl8188ee/../wifi.h:11:
In file included from include/linux/etherdevice.h:20:
In file included from include/linux/if_ether.h:19:
In file included from include/linux/skbuff.h:17:
In file included from include/linux/bvec.h:10:
In file included from include/linux/highmem.h:8:
In file included from include/linux/cacheflush.h:5:
In file included from arch/x86/include/asm/cacheflush.h:5:
In file included from include/linux/mm.h:2224:
include/linux/vmstat.h:504:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
504 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
505 | item];
| ~~~~
include/linux/vmstat.h:511:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
511 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
512 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
include/linux/vmstat.h:524:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
524 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
525 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/net/wireless/realtek/rtlwifi/rtl8188ee/dm.c:8:
>> drivers/net/wireless/realtek/rtlwifi/rtl8188ee/reg.h:1230:9: warning: 'MAC_ADDR_LEN' macro redefined [-Wmacro-redefined]
1230 | #define MAC_ADDR_LEN 6
| ^
include/linux/if_ether.h:23:9: note: previous definition is here
23 | #define MAC_ADDR_LEN (3 * ETH_ALEN - 1)
| ^
4 warnings generated.
--
In file included from drivers/net/wireless/realtek/rtlwifi/rtl8192ee/dm.c:4:
In file included from drivers/net/wireless/realtek/rtlwifi/rtl8192ee/../wifi.h:11:
In file included from include/linux/etherdevice.h:20:
In file included from include/linux/if_ether.h:19:
In file included from include/linux/skbuff.h:17:
In file included from include/linux/bvec.h:10:
In file included from include/linux/highmem.h:8:
In file included from include/linux/cacheflush.h:5:
In file included from arch/x86/include/asm/cacheflush.h:5:
In file included from include/linux/mm.h:2224:
include/linux/vmstat.h:504:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
504 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
505 | item];
| ~~~~
include/linux/vmstat.h:511:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
511 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
512 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
include/linux/vmstat.h:524:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
524 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
525 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/net/wireless/realtek/rtlwifi/rtl8192ee/dm.c:8:
>> drivers/net/wireless/realtek/rtlwifi/rtl8192ee/reg.h:1192:9: warning: 'MAC_ADDR_LEN' macro redefined [-Wmacro-redefined]
1192 | #define MAC_ADDR_LEN 6
| ^
include/linux/if_ether.h:23:9: note: previous definition is here
23 | #define MAC_ADDR_LEN (3 * ETH_ALEN - 1)
| ^
4 warnings generated.
--
In file included from drivers/net/wireless/realtek/rtlwifi/rtl8723ae/dm.c:4:
In file included from drivers/net/wireless/realtek/rtlwifi/rtl8723ae/../wifi.h:11:
In file included from include/linux/etherdevice.h:20:
In file included from include/linux/if_ether.h:19:
In file included from include/linux/skbuff.h:17:
In file included from include/linux/bvec.h:10:
In file included from include/linux/highmem.h:8:
In file included from include/linux/cacheflush.h:5:
In file included from arch/x86/include/asm/cacheflush.h:5:
In file included from include/linux/mm.h:2224:
include/linux/vmstat.h:504:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
504 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
505 | item];
| ~~~~
include/linux/vmstat.h:511:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
511 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
512 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
include/linux/vmstat.h:524:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
524 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
525 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/net/wireless/realtek/rtlwifi/rtl8723ae/dm.c:8:
>> drivers/net/wireless/realtek/rtlwifi/rtl8723ae/reg.h:1194:9: warning: 'MAC_ADDR_LEN' macro redefined [-Wmacro-redefined]
1194 | #define MAC_ADDR_LEN 6
| ^
include/linux/if_ether.h:23:9: note: previous definition is here
23 | #define MAC_ADDR_LEN (3 * ETH_ALEN - 1)
| ^
4 warnings generated.
--
In file included from drivers/net/wireless/realtek/rtlwifi/rtl8723be/dm.c:4:
In file included from drivers/net/wireless/realtek/rtlwifi/rtl8723be/../wifi.h:11:
In file included from include/linux/etherdevice.h:20:
In file included from include/linux/if_ether.h:19:
In file included from include/linux/skbuff.h:17:
In file included from include/linux/bvec.h:10:
In file included from include/linux/highmem.h:8:
In file included from include/linux/cacheflush.h:5:
In file included from arch/x86/include/asm/cacheflush.h:5:
In file included from include/linux/mm.h:2224:
include/linux/vmstat.h:504:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
504 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
505 | item];
| ~~~~
include/linux/vmstat.h:511:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
511 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
512 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
include/linux/vmstat.h:524:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
524 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
525 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/net/wireless/realtek/rtlwifi/rtl8723be/dm.c:8:
>> drivers/net/wireless/realtek/rtlwifi/rtl8723be/reg.h:1245:9: warning: 'MAC_ADDR_LEN' macro redefined [-Wmacro-redefined]
1245 | #define MAC_ADDR_LEN 6
| ^
include/linux/if_ether.h:23:9: note: previous definition is here
23 | #define MAC_ADDR_LEN (3 * ETH_ALEN - 1)
| ^
4 warnings generated.
--
In file included from drivers/net/wireless/realtek/rtlwifi/rtl8821ae/dm.c:4:
In file included from drivers/net/wireless/realtek/rtlwifi/rtl8821ae/../wifi.h:11:
In file included from include/linux/etherdevice.h:20:
In file included from include/linux/if_ether.h:19:
In file included from include/linux/skbuff.h:17:
In file included from include/linux/bvec.h:10:
In file included from include/linux/highmem.h:8:
In file included from include/linux/cacheflush.h:5:
In file included from arch/x86/include/asm/cacheflush.h:5:
In file included from include/linux/mm.h:2224:
include/linux/vmstat.h:504:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
504 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
505 | item];
| ~~~~
include/linux/vmstat.h:511:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
511 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
512 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
include/linux/vmstat.h:524:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
524 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
525 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
In file included from drivers/net/wireless/realtek/rtlwifi/rtl8821ae/dm.c:8:
>> drivers/net/wireless/realtek/rtlwifi/rtl8821ae/reg.h:1274:9: warning: 'MAC_ADDR_LEN' macro redefined [-Wmacro-redefined]
1274 | #define MAC_ADDR_LEN 6
| ^
include/linux/if_ether.h:23:9: note: previous definition is here
23 | #define MAC_ADDR_LEN (3 * ETH_ALEN - 1)
| ^
4 warnings generated.
vim +/MAC_ADDR_LEN +148 drivers/scsi/qla4xxx/ql4_def.h
afaf5a2d341d33 David Somayajulu 2006-09-19 144
afaf5a2d341d33 David Somayajulu 2006-09-19 145 /*
afaf5a2d341d33 David Somayajulu 2006-09-19 146 * Misc
afaf5a2d341d33 David Somayajulu 2006-09-19 147 */
afaf5a2d341d33 David Somayajulu 2006-09-19 @148 #define MAC_ADDR_LEN 6 /* in bytes */
afaf5a2d341d33 David Somayajulu 2006-09-19 149 #define IP_ADDR_LEN 4 /* in bytes */
2a49a78ed3c8d7 Vikas Chaudhary 2010-04-28 150 #define IPv6_ADDR_LEN 16 /* IPv6 address size */
afaf5a2d341d33 David Somayajulu 2006-09-19 151 #define DRIVER_NAME "qla4xxx"
afaf5a2d341d33 David Somayajulu 2006-09-19 152
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-02-06 9:32 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-04 21:41 [PATCH v2 0/2] netconsole: allow selection of egress interface via MAC address Uday Shankar
2025-02-04 21:41 ` [PATCH v2 1/2] net, treewide: define and use MAC_ADDR_LEN Uday Shankar
2025-02-05 7:25 ` Johannes Berg
2025-02-06 9:31 ` kernel test robot
2025-02-04 21:41 ` [PATCH v2 2/2] netconsole: allow selection of egress interface via MAC address Uday Shankar
2025-02-05 19:07 ` Breno Leitao
2025-02-05 20:46 ` Uday Shankar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).