| From ea1c37f36e669161ea12d24186785fff8728b16a Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 21 Oct 2020 14:59:37 +0300 |
| Subject: e1000e: add rtnl_lock() to e1000_reset_task |
| |
| From: Vitaly Lifshits <vitaly.lifshits@intel.com> |
| |
| [ Upstream commit 21f857f0321d0d0ea9b1a758bd55dc63d1cb2437 ] |
| |
| A possible race condition was found in e1000_reset_task, |
| after discovering a similar issue in igb driver via |
| commit 024a8168b749 ("igb: reinit_locked() should be called |
| with rtnl_lock"). |
| |
| Added rtnl_lock() and rtnl_unlock() to avoid this. |
| |
| Fixes: bc7f75fa9788 ("[E1000E]: New pci-express e1000 driver (currently for ICH9 devices only)") |
| Suggested-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Vitaly Lifshits <vitaly.lifshits@intel.com> |
| Tested-by: Dvora Fuxbrumer <dvorax.fuxbrumer@linux.intel.com> |
| Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/intel/e1000e/netdev.c | 6 +++++- |
| 1 file changed, 5 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c |
| index 4cb05a31e66d..c2feedfd321d 100644 |
| --- a/drivers/net/ethernet/intel/e1000e/netdev.c |
| +++ b/drivers/net/ethernet/intel/e1000e/netdev.c |
| @@ -5953,15 +5953,19 @@ static void e1000_reset_task(struct work_struct *work) |
| struct e1000_adapter *adapter; |
| adapter = container_of(work, struct e1000_adapter, reset_task); |
| |
| + rtnl_lock(); |
| /* don't run the task if already down */ |
| - if (test_bit(__E1000_DOWN, &adapter->state)) |
| + if (test_bit(__E1000_DOWN, &adapter->state)) { |
| + rtnl_unlock(); |
| return; |
| + } |
| |
| if (!(adapter->flags & FLAG_RESTART_NOW)) { |
| e1000e_dump(adapter); |
| e_err("Reset adapter unexpectedly\n"); |
| } |
| e1000e_reinit_locked(adapter); |
| + rtnl_unlock(); |
| } |
| |
| /** |
| -- |
| 2.30.1 |
| |