• Vladimir Davydov's avatar
    e1000: fix possible reset_task running after adapter down · 74a1b1ea
    Vladimir Davydov authored
    On e1000_down(), we should ensure every asynchronous work is canceled
    before proceeding. Since the watchdog_task can schedule other works
    apart from itself, it should be stopped first, but currently it is
    stopped after the reset_task. This can result in the following race
    leading to the reset_task running after the module unload:
    
    e1000_down_and_stop():			e1000_watchdog():
    ----------------------			-----------------
    
    cancel_work_sync(reset_task)
    					schedule_work(reset_task)
    cancel_delayed_work_sync(watchdog_task)
    
    The patch moves cancel_delayed_work_sync(watchdog_task) at the beginning
    of e1000_down_and_stop() thus ensuring the race is impossible.
    
    Cc: Tushar Dave <tushar.n.dave@intel.com>
    Cc: Patrick McHardy <kaber@trash.net>
    Signed-off-by: default avatarVladimir Davydov <vdavydov@parallels.com>
    Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
    Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
    74a1b1ea
e1000_main.c 142 KB