* [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
* 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 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
* [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 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
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).