diff mbox series

[net] devlink: Fix crash with CONFIG_NET_NS=n

Message ID 20230515162925.1144416-1-idosch@nvidia.com (mailing list archive)
State Accepted
Commit d6352dae0903fe8beae4c007dc320e9e9f1fed45
Delegated to: Netdev Maintainers
Headers show
Series [net] devlink: Fix crash with CONFIG_NET_NS=n | expand

Checks

Context Check Description
netdev/series_format success Single patches do not need cover letters
netdev/tree_selection success Clearly marked for net
netdev/fixes_present success Fixes tag present in non-next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 10 this patch: 10
netdev/cc_maintainers success CCed 7 of 7 maintainers
netdev/build_clang success Errors and warnings before: 8 this patch: 8
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success Fixes tag looks correct
netdev/build_allmodconfig_warn success Errors and warnings before: 10 this patch: 10
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 8 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Ido Schimmel May 15, 2023, 4:29 p.m. UTC
'__net_initdata' becomes a no-op with CONFIG_NET_NS=y, but when this
option is disabled it becomes '__initdata', which means the data can be
freed after the initialization phase. This annotation is obviously
incorrect for the devlink net device notifier block which is still
registered after the initialization phase [1].

Fix this crash by removing the '__net_initdata' annotation.

[1]
general protection fault, probably for non-canonical address 0xcccccccccccccccc: 0000 [#1] PREEMPT SMP
CPU: 3 PID: 117 Comm: (udev-worker) Not tainted 6.4.0-rc1-custom-gdf0acdc59b09 #64
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.2-1.fc37 04/01/2014
RIP: 0010:notifier_call_chain+0x58/0xc0
[...]
Call Trace:
 <TASK>
 dev_set_mac_address+0x85/0x120
 dev_set_mac_address_user+0x30/0x50
 do_setlink+0x219/0x1270
 rtnl_setlink+0xf7/0x1a0
 rtnetlink_rcv_msg+0x142/0x390
 netlink_rcv_skb+0x58/0x100
 netlink_unicast+0x188/0x270
 netlink_sendmsg+0x214/0x470
 __sys_sendto+0x12f/0x1a0
 __x64_sys_sendto+0x24/0x30
 do_syscall_64+0x38/0x80
 entry_SYSCALL_64_after_hwframe+0x63/0xcd

Fixes: e93c9378e33f ("devlink: change per-devlink netdev notifier to static one")
Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>
Closes: https://lore.kernel.org/netdev/600ddf9e-589a-2aa0-7b69-a438f833ca10@samsung.com/
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
---
 net/devlink/core.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Jiri Pirko May 16, 2023, 8:09 a.m. UTC | #1
Mon, May 15, 2023 at 06:29:25PM CEST, idosch@nvidia.com wrote:
>'__net_initdata' becomes a no-op with CONFIG_NET_NS=y, but when this
>option is disabled it becomes '__initdata', which means the data can be
>freed after the initialization phase. This annotation is obviously
>incorrect for the devlink net device notifier block which is still
>registered after the initialization phase [1].
>
>Fix this crash by removing the '__net_initdata' annotation.
>
>[1]
>general protection fault, probably for non-canonical address 0xcccccccccccccccc: 0000 [#1] PREEMPT SMP
>CPU: 3 PID: 117 Comm: (udev-worker) Not tainted 6.4.0-rc1-custom-gdf0acdc59b09 #64
>Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.2-1.fc37 04/01/2014
>RIP: 0010:notifier_call_chain+0x58/0xc0
>[...]
>Call Trace:
> <TASK>
> dev_set_mac_address+0x85/0x120
> dev_set_mac_address_user+0x30/0x50
> do_setlink+0x219/0x1270
> rtnl_setlink+0xf7/0x1a0
> rtnetlink_rcv_msg+0x142/0x390
> netlink_rcv_skb+0x58/0x100
> netlink_unicast+0x188/0x270
> netlink_sendmsg+0x214/0x470
> __sys_sendto+0x12f/0x1a0
> __x64_sys_sendto+0x24/0x30
> do_syscall_64+0x38/0x80
> entry_SYSCALL_64_after_hwframe+0x63/0xcd
>
>Fixes: e93c9378e33f ("devlink: change per-devlink netdev notifier to static one")
>Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>
>Closes: https://lore.kernel.org/netdev/600ddf9e-589a-2aa0-7b69-a438f833ca10@samsung.com/
>Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
>Signed-off-by: Ido Schimmel <idosch@nvidia.com>

Reviewed-by: Jiri Pirko <jiri@nvidia.com>

Thanks!
Simon Horman May 16, 2023, 8:27 a.m. UTC | #2
On Mon, May 15, 2023 at 07:29:25PM +0300, Ido Schimmel wrote:
> '__net_initdata' becomes a no-op with CONFIG_NET_NS=y, but when this
> option is disabled it becomes '__initdata', which means the data can be
> freed after the initialization phase. This annotation is obviously
> incorrect for the devlink net device notifier block which is still
> registered after the initialization phase [1].
> 
> Fix this crash by removing the '__net_initdata' annotation.
> 
> [1]
> general protection fault, probably for non-canonical address 0xcccccccccccccccc: 0000 [#1] PREEMPT SMP
> CPU: 3 PID: 117 Comm: (udev-worker) Not tainted 6.4.0-rc1-custom-gdf0acdc59b09 #64
> Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.2-1.fc37 04/01/2014
> RIP: 0010:notifier_call_chain+0x58/0xc0
> [...]
> Call Trace:
>  <TASK>
>  dev_set_mac_address+0x85/0x120
>  dev_set_mac_address_user+0x30/0x50
>  do_setlink+0x219/0x1270
>  rtnl_setlink+0xf7/0x1a0
>  rtnetlink_rcv_msg+0x142/0x390
>  netlink_rcv_skb+0x58/0x100
>  netlink_unicast+0x188/0x270
>  netlink_sendmsg+0x214/0x470
>  __sys_sendto+0x12f/0x1a0
>  __x64_sys_sendto+0x24/0x30
>  do_syscall_64+0x38/0x80
>  entry_SYSCALL_64_after_hwframe+0x63/0xcd
> 
> Fixes: e93c9378e33f ("devlink: change per-devlink netdev notifier to static one")
> Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>
> Closes: https://lore.kernel.org/netdev/600ddf9e-589a-2aa0-7b69-a438f833ca10@samsung.com/
> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
> Signed-off-by: Ido Schimmel <idosch@nvidia.com>

Reviewed-by: Simon Horman <simon.horman@corigine.com>
patchwork-bot+netdevbpf@kernel.org May 17, 2023, 3:20 a.m. UTC | #3
Hello:

This patch was applied to netdev/net.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Mon, 15 May 2023 19:29:25 +0300 you wrote:
> '__net_initdata' becomes a no-op with CONFIG_NET_NS=y, but when this
> option is disabled it becomes '__initdata', which means the data can be
> freed after the initialization phase. This annotation is obviously
> incorrect for the devlink net device notifier block which is still
> registered after the initialization phase [1].
> 
> Fix this crash by removing the '__net_initdata' annotation.
> 
> [...]

Here is the summary with links:
  - [net] devlink: Fix crash with CONFIG_NET_NS=n
    https://git.kernel.org/netdev/net/c/d6352dae0903

You are awesome, thank you!
diff mbox series

Patch

diff --git a/net/devlink/core.c b/net/devlink/core.c
index 0e58eee44bdb..c23ebabadc52 100644
--- a/net/devlink/core.c
+++ b/net/devlink/core.c
@@ -294,7 +294,7 @@  static struct pernet_operations devlink_pernet_ops __net_initdata = {
 	.pre_exit = devlink_pernet_pre_exit,
 };
 
-static struct notifier_block devlink_port_netdevice_nb __net_initdata = {
+static struct notifier_block devlink_port_netdevice_nb = {
 	.notifier_call = devlink_port_netdevice_event,
 };