Skip to content

Commit 4d79221

Browse files
etantilovanguy11
authored andcommitted
idpf: fix error handling in the init_task on load
If the init_task fails during a driver load, we end up without vports and netdevs, effectively failing the entire process. In that state a subsequent reset will result in a crash as the service task attempts to access uninitialized resources. Following trace is from an error in the init_task where the CREATE_VPORT (op 501) is rejected by the FW: [40922.763136] idpf 0000:83:00.0: Device HW Reset initiated [40924.449797] idpf 0000:83:00.0: Transaction failed (op 501) [40958.148190] idpf 0000:83:00.0: HW reset detected [40958.161202] BUG: kernel NULL pointer dereference, address: 00000000000000a8 ... [40958.168094] Workqueue: idpf-0000:83:00.0-vc_event idpf_vc_event_task [idpf] [40958.168865] RIP: 0010:idpf_vc_event_task+0x9b/0x350 [idpf] ... [40958.177932] Call Trace: [40958.178491] <TASK> [40958.179040] process_one_work+0x226/0x6d0 [40958.179609] worker_thread+0x19e/0x340 [40958.180158] ? __pfx_worker_thread+0x10/0x10 [40958.180702] kthread+0x10f/0x250 [40958.181238] ? __pfx_kthread+0x10/0x10 [40958.181774] ret_from_fork+0x251/0x2b0 [40958.182307] ? __pfx_kthread+0x10/0x10 [40958.182834] ret_from_fork_asm+0x1a/0x30 [40958.183370] </TASK> Fix the error handling in the init_task to make sure the service and mailbox tasks are disabled if the error happens during load. These are started in idpf_vc_core_init(), which spawns the init_task and has no way of knowing if it failed. If the error happens on reset, following successful driver load, the tasks can still run, as that will allow the netdevs to attempt recovery through another reset. Stop the PTP callbacks either way as those will be restarted by the call to idpf_vc_core_init() during a successful reset. Fixes: 0fe4546 ("idpf: add create vport and netdev configuration") Reported-by: Vivek Kumar <iamvivekkumar@google.com> Signed-off-by: Emil Tantilov <emil.s.tantilov@intel.com> Reviewed-by: Madhu Chittim <madhu.chittim@intel.com> Tested-by: Samuel Salin <Samuel.salin@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
1 parent e111cbc commit 4d79221

1 file changed

Lines changed: 12 additions & 4 deletions

File tree

drivers/net/ethernet/intel/idpf/idpf_lib.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1690,10 +1690,9 @@ void idpf_init_task(struct work_struct *work)
16901690
set_bit(IDPF_VPORT_REG_NETDEV, vport_config->flags);
16911691
}
16921692

1693-
/* As all the required vports are created, clear the reset flag
1694-
* unconditionally here in case we were in reset and the link was down.
1695-
*/
1693+
/* Clear the reset and load bits as all vports are created */
16961694
clear_bit(IDPF_HR_RESET_IN_PROG, adapter->flags);
1695+
clear_bit(IDPF_HR_DRV_LOAD, adapter->flags);
16971696
/* Start the statistics task now */
16981697
queue_delayed_work(adapter->stats_wq, &adapter->stats_task,
16991698
msecs_to_jiffies(10 * (pdev->devfn & 0x07)));
@@ -1707,6 +1706,15 @@ void idpf_init_task(struct work_struct *work)
17071706
idpf_vport_dealloc(adapter->vports[index]);
17081707
}
17091708
}
1709+
/* Cleanup after vc_core_init, which has no way of knowing the
1710+
* init task failed on driver load.
1711+
*/
1712+
if (test_and_clear_bit(IDPF_HR_DRV_LOAD, adapter->flags)) {
1713+
cancel_delayed_work_sync(&adapter->serv_task);
1714+
cancel_delayed_work_sync(&adapter->mbx_task);
1715+
}
1716+
idpf_ptp_release(adapter);
1717+
17101718
clear_bit(IDPF_HR_RESET_IN_PROG, adapter->flags);
17111719
}
17121720

@@ -1856,7 +1864,7 @@ static void idpf_init_hard_reset(struct idpf_adapter *adapter)
18561864
dev_info(dev, "Device HW Reset initiated\n");
18571865

18581866
/* Prepare for reset */
1859-
if (test_and_clear_bit(IDPF_HR_DRV_LOAD, adapter->flags)) {
1867+
if (test_bit(IDPF_HR_DRV_LOAD, adapter->flags)) {
18601868
reg_ops->trigger_reset(adapter, IDPF_HR_DRV_LOAD);
18611869
} else if (test_and_clear_bit(IDPF_HR_FUNC_RESET, adapter->flags)) {
18621870
bool is_reset = idpf_is_reset_detected(adapter);

0 commit comments

Comments
 (0)