| From fe80ca35a81f25571b5beb49004894dc230e6b90 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 16 Mar 2026 13:38:25 +0300 |
| Subject: net: macb: fix uninitialized rx_fs_lock |
| |
| From: Fedor Pchelkin <pchelkin@ispras.ru> |
| |
| [ Upstream commit 34b11cc56e4369bc08b1f4c4a04222d75ed596ce ] |
| |
| If hardware doesn't support RX Flow Filters, rx_fs_lock spinlock is not |
| initialized leading to the following assertion splat triggerable via |
| set_rxnfc callback. |
| |
| INFO: trying to register non-static key. |
| The code is fine but needs lockdep annotation, or maybe |
| you didn't initialize this object before use? |
| turning off the locking correctness validator. |
| CPU: 1 PID: 949 Comm: syz.0.6 Not tainted 6.1.164+ #113 |
| Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.1-0-g3208b098f51a-prebuilt.qemu.org 04/01/2014 |
| Call Trace: |
| <TASK> |
| __dump_stack lib/dump_stack.c:88 [inline] |
| dump_stack_lvl+0x8d/0xba lib/dump_stack.c:106 |
| assign_lock_key kernel/locking/lockdep.c:974 [inline] |
| register_lock_class+0x141b/0x17f0 kernel/locking/lockdep.c:1287 |
| __lock_acquire+0x74f/0x6c40 kernel/locking/lockdep.c:4928 |
| lock_acquire kernel/locking/lockdep.c:5662 [inline] |
| lock_acquire+0x190/0x4b0 kernel/locking/lockdep.c:5627 |
| __raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:110 [inline] |
| _raw_spin_lock_irqsave+0x33/0x50 kernel/locking/spinlock.c:162 |
| gem_del_flow_filter drivers/net/ethernet/cadence/macb_main.c:3562 [inline] |
| gem_set_rxnfc+0x533/0xac0 drivers/net/ethernet/cadence/macb_main.c:3667 |
| ethtool_set_rxnfc+0x18c/0x280 net/ethtool/ioctl.c:961 |
| __dev_ethtool net/ethtool/ioctl.c:2956 [inline] |
| dev_ethtool+0x229c/0x6290 net/ethtool/ioctl.c:3095 |
| dev_ioctl+0x637/0x1070 net/core/dev_ioctl.c:510 |
| sock_do_ioctl+0x20d/0x2c0 net/socket.c:1215 |
| sock_ioctl+0x577/0x6d0 net/socket.c:1320 |
| vfs_ioctl fs/ioctl.c:51 [inline] |
| __do_sys_ioctl fs/ioctl.c:870 [inline] |
| __se_sys_ioctl fs/ioctl.c:856 [inline] |
| __x64_sys_ioctl+0x18c/0x210 fs/ioctl.c:856 |
| do_syscall_x64 arch/x86/entry/common.c:46 [inline] |
| do_syscall_64+0x35/0x80 arch/x86/entry/common.c:76 |
| entry_SYSCALL_64_after_hwframe+0x6e/0xd8 |
| |
| A more straightforward solution would be to always initialize rx_fs_lock, |
| just like rx_fs_list. However, in this case the driver set_rxnfc callback |
| would return with a rather confusing error code, e.g. -EINVAL. So deny |
| set_rxnfc attempts directly if the RX filtering feature is not supported |
| by hardware. |
| |
| Fixes: ae8223de3df5 ("net: macb: Added support for RX filtering") |
| Signed-off-by: Fedor Pchelkin <pchelkin@ispras.ru> |
| Link: https://patch.msgid.link/20260316103826.74506-2-pchelkin@ispras.ru |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/cadence/macb_main.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c |
| index d4a4d72460a42..6a3e9082bda8c 100644 |
| --- a/drivers/net/ethernet/cadence/macb_main.c |
| +++ b/drivers/net/ethernet/cadence/macb_main.c |
| @@ -3572,6 +3572,9 @@ static int gem_set_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *cmd) |
| struct macb *bp = netdev_priv(netdev); |
| int ret; |
| |
| + if (!(netdev->hw_features & NETIF_F_NTUPLE)) |
| + return -EOPNOTSUPP; |
| + |
| switch (cmd->cmd) { |
| case ETHTOOL_SRXCLSRLINS: |
| if ((cmd->fs.location >= bp->max_tuples) |
| -- |
| 2.51.0 |
| |