• Ivan Vecera's avatar
    iavf: Fix deadlock in initialization · cbe9e511
    Ivan Vecera authored
    Fix deadlock that occurs when iavf interface is a part of failover
    configuration.
    
    1. Mutex crit_lock is taken at the beginning of iavf_watchdog_task()
    2. Function iavf_init_config_adapter() is called when adapter
       state is __IAVF_INIT_CONFIG_ADAPTER
    3. iavf_init_config_adapter() calls register_netdevice() that emits
       NETDEV_REGISTER event
    4. Notifier function failover_event() then calls
       net_failover_slave_register() that calls dev_open()
    5. dev_open() calls iavf_open() that tries to take crit_lock in
       end-less loop
    
    Stack trace:
    ...
    [  790.251876]  usleep_range_state+0x5b/0x80
    [  790.252547]  iavf_open+0x37/0x1d0 [iavf]
    [  790.253139]  __dev_open+0xcd/0x160
    [  790.253699]  dev_open+0x47/0x90
    [  790.254323]  net_failover_slave_register+0x122/0x220 [net_failover]
    [  790.255213]  failover_slave_register.part.7+0xd2/0x180 [failover]
    [  790.256050]  failover_event+0x122/0x1ab [failover]
    [  790.256821]  notifier_call_chain+0x47/0x70
    [  790.257510]  register_netdevice+0x20f/0x550
    [  790.258263]  iavf_watchdog_task+0x7c8/0xea0 [iavf]
    [  790.259009]  process_one_work+0x1a7/0x360
    [  790.259705]  worker_thread+0x30/0x390
    
    To fix the situation we should check the current adapter state after
    first unsuccessful mutex_trylock() and return with -EBUSY if it is
    __IAVF_INIT_CONFIG_ADAPTER.
    
    Fixes: 226d5285 ("iavf: fix locking of critical sections")
    Signed-off-by: default avatarIvan Vecera <ivecera@redhat.com>
    Tested-by: default avatarKonrad Jankowski <konrad0.jankowski@intel.com>
    Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
    cbe9e511
iavf_main.c 141 KB