• Robert Shearman's avatar
    lwtunnel: Fix oops on state free after encap module unload · 85c81401
    Robert Shearman authored
    When attempting to free lwtunnel state after the module for the encap
    has been unloaded an oops occurs:
    
    BUG: unable to handle kernel NULL pointer dereference at 0000000000000008
    IP: lwtstate_free+0x18/0x40
    [..]
    task: ffff88003e372380 task.stack: ffffc900001fc000
    RIP: 0010:lwtstate_free+0x18/0x40
    RSP: 0018:ffff88003fd83e88 EFLAGS: 00010246
    RAX: 0000000000000000 RBX: ffff88002bbb3380 RCX: ffff88000c91a300
    [..]
    Call Trace:
     <IRQ>
     free_fib_info_rcu+0x195/0x1a0
     ? rt_fibinfo_free+0x50/0x50
     rcu_process_callbacks+0x2d3/0x850
     ? rcu_process_callbacks+0x296/0x850
     __do_softirq+0xe4/0x4cb
     irq_exit+0xb0/0xc0
     smp_apic_timer_interrupt+0x3d/0x50
     apic_timer_interrupt+0x93/0xa0
    [..]
    Code: e8 6e c6 fc ff 89 d8 5b 5d c3 bb de ff ff ff eb f4 66 90 66 66 66 66 90 55 48 89 e5 53 0f b7 07 48 89 fb 48 8b 04 c5 00 81 d5 81 <48> 8b 40 08 48 85 c0 74 13 ff d0 48 8d 7b 20 be 20 00 00 00 e8
    
    The problem is after the module for the encap can be unloaded the
    corresponding ops is removed and is thus NULL here.
    
    Modules implementing lwtunnel ops should not be allowed to unload
    while there is state alive using those ops, so grab the module
    reference for the ops on creating lwtunnel state and of course release
    the reference when freeing the state.
    
    Fixes: 1104d9ba ("lwtunnel: Add destroy state operation")
    Signed-off-by: default avatarRobert Shearman <rshearma@brocade.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    85c81401
lwtunnel.c 8.26 KB