e1000: fix possible reset_task running after adapter down
authorVladimir Davydov <VDavydov@parallels.com>
Sat, 23 Nov 2013 07:18:01 +0000 (07:18 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 30 Nov 2013 08:02:12 +0000 (00:02 -0800)
commit74a1b1ea8a30b035aaad833bbd6b9263e72acfac
treefe53864a1d67a052ebdf7f2730aa6e3a8be638de
parentb2f963bfaebadc9117b29f806630ea3bcaec403d
e1000: fix possible reset_task running after adapter down

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: Vladimir Davydov <vdavydov@parallels.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/e1000/e1000_main.c