• dingtianhong's avatar
    dummy: fix oops when loading the dummy failed · 2c8a0189
    dingtianhong authored
    We rename the dummy in modprobe.conf like this:
    
    install dummy0 /sbin/modprobe -o dummy0 --ignore-install dummy
    install dummy1 /sbin/modprobe -o dummy1 --ignore-install dummy
    
    We got oops when we run the command:
    
    modprobe dummy0
    modprobe dummy1
    
    ------------[ cut here ]------------
    
    [ 3302.187584] BUG: unable to handle kernel NULL pointer dereference at 0000000000000008
    [ 3302.195411] IP: [<ffffffff813fe62a>] __rtnl_link_unregister+0x9a/0xd0
    [ 3302.201844] PGD 85c94a067 PUD 8517bd067 PMD 0
    [ 3302.206305] Oops: 0002 [#1] SMP
    [ 3302.299737] task: ffff88105ccea300 ti: ffff880eba4a0000 task.ti: ffff880eba4a0000
    [ 3302.307186] RIP: 0010:[<ffffffff813fe62a>]  [<ffffffff813fe62a>] __rtnl_link_unregister+0x9a/0xd0
    [ 3302.316044] RSP: 0018:ffff880eba4a1dd8  EFLAGS: 00010246
    [ 3302.321332] RAX: 0000000000000000 RBX: ffffffff81a9d738 RCX: 0000000000000002
    [ 3302.328436] RDX: 0000000000000000 RSI: ffffffffa04d602c RDI: ffff880eba4a1dd8
    [ 3302.335541] RBP: ffff880eba4a1e18 R08: dead000000200200 R09: dead000000100100
    [ 3302.342644] R10: 0000000000000080 R11: 0000000000000003 R12: ffffffff81a9d788
    [ 3302.349748] R13: ffffffffa04d7020 R14: ffffffff81a9d670 R15: ffff880eba4a1dd8
    [ 3302.364910] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 3302.370630] CR2: 0000000000000008 CR3: 000000085e15e000 CR4: 00000000000427e0
    [ 3302.377734] DR0: 0000000000000003 DR1: 00000000000000b0 DR2: 0000000000000001
    [ 3302.384838] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    [ 3302.391940] Stack:
    [ 3302.393944]  ffff880eba4a1dd8 ffff880eba4a1dd8 ffff880eba4a1e18 ffffffffa04d70c0
    [ 3302.401350]  00000000ffffffef ffffffffa01a8000 0000000000000000 ffffffff816111c8
    [ 3302.408758]  ffff880eba4a1e48 ffffffffa01a80be ffff880eba4a1e48 ffffffffa04d70c0
    [ 3302.416164] Call Trace:
    [ 3302.418605]  [<ffffffffa01a8000>] ? 0xffffffffa01a7fff
    [ 3302.423727]  [<ffffffffa01a80be>] dummy_init_module+0xbe/0x1000 [dummy0]
    [ 3302.430405]  [<ffffffffa01a8000>] ? 0xffffffffa01a7fff
    [ 3302.435535]  [<ffffffff81000322>] do_one_initcall+0x152/0x1b0
    [ 3302.441263]  [<ffffffff810ab24b>] do_init_module+0x7b/0x200
    [ 3302.446824]  [<ffffffff810ad3d2>] load_module+0x4e2/0x530
    [ 3302.452215]  [<ffffffff8127ae40>] ? ddebug_dyndbg_boot_param_cb+0x60/0x60
    [ 3302.458979]  [<ffffffff810ad5f1>] SyS_init_module+0xd1/0x130
    [ 3302.464627]  [<ffffffff814b9652>] system_call_fastpath+0x16/0x1b
    [ 3302.490090] RIP  [<ffffffff813fe62a>] __rtnl_link_unregister+0x9a/0xd0
    [ 3302.496607]  RSP <ffff880eba4a1dd8>
    [ 3302.500084] CR2: 0000000000000008
    [ 3302.503466] ---[ end trace 8342d49cd49f78ed ]---
    
    The reason is that when loading dummy, if __rtnl_link_register() return failed,
    the init_module should return and avoid take the wrong path.
    Signed-off-by: default avatarTan Xiaojun <tanxiaojun@huawei.com>
    Signed-off-by: default avatarDing Tianhong <dingtianhong@huawei.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    2c8a0189
dummy.c 4.95 KB