• Yonglong Liu's avatar
    net: hns: Fixed bug that netdev was opened twice · 5778b13b
    Yonglong Liu authored
    After resetting dsaf to try to repair chip error such as ecc error,
    the net device will be open if net interface is up. But at this time
    if there is the users set the net device up with the command ifconfig,
    the net device will be opened twice consecutively.
    
    Function napi_enable was called when open device. And Kernel panic will
    be occurred if it was called twice consecutively. Such as follow:
    static inline void napi_enable(struct napi_struct *n)
    {
             BUG_ON(!test_bit(NAPI_STATE_SCHED, &n->state));
             smp_mb__before_clear_bit();
             clear_bit(NAPI_STATE_SCHED, &n->state);
    }
    
    [37255.571996] Kernel panic - not syncing: BUG!
    [37255.595234] Call trace:
    [37255.597694] [<ffff80000008ab48>] dump_backtrace+0x0/0x1a0
    [37255.603114] [<ffff80000008ad08>] show_stack+0x20/0x28
    [37255.608187] [<ffff8000009c4944>] dump_stack+0x98/0xb8
    [37255.613258] [<ffff8000009c149c>] panic+0x10c/0x26c
    [37255.618070] [<ffff80000070f134>] hns_nic_net_up+0x30c/0x4e0
    [37255.623664] [<ffff80000070f39c>] hns_nic_net_open+0x94/0x12c
    [37255.629346] [<ffff80000084be78>] __dev_open+0xf4/0x168
    [37255.634504] [<ffff80000084c1ac>] __dev_change_flags+0x98/0x15c
    [37255.640359] [<ffff80000084c29c>] dev_change_flags+0x2c/0x68
    [37255.769580] [<ffff8000008dc400>] devinet_ioctl+0x650/0x704
    [37255.775086] [<ffff8000008ddc38>] inet_ioctl+0x98/0xb4
    [37255.780159] [<ffff800000827b7c>] sock_do_ioctl+0x44/0x84
    [37255.785490] [<ffff800000828e04>] sock_ioctl+0x248/0x30c
    [37255.790737] [<ffff80000026dc6c>] do_vfs_ioctl+0x480/0x618
    [37255.796156] [<ffff80000026de94>] SyS_ioctl+0x90/0xa4
    [37255.801139] SMP: stopping secondary CPUs
    [37255.805079] kbox: catch panic event.
    [37255.809586] collected_len = 128928, LOG_BUF_LEN_LOCAL = 131072
    [37255.816103] flush cache 0xffff80003f000000  size 0x800000
    [37255.822192] flush cache 0xffff80003f000000  size 0x800000
    [37255.828289] flush cache 0xffff80003f000000  size 0x800000
    [37255.834378] kbox: no notify die func register. no need to notify
    [37255.840413] ---[ end Kernel panic - not syncing: BUG!
    
    This patchset fix this bug according to the flag NIC_STATE_DOWN.
    Signed-off-by: default avatarYonglong Liu <liuyonglong@huawei.com>
    Signed-off-by: default avatarPeng Li <lipeng321@huawei.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    5778b13b
hns_enet.c 61.8 KB