mirror of
https://github.com/torvalds/linux.git
synced 2026-09-27 11:02:03 +02:00
idpf: make mbx_task queueing and cancelling more consistent
One of the assumptions of libie_cp and pre-refactor idpf control queue handling is such that all Rx processing is handled by a single task, which is to be cancelled before the mailbox destruction. Aside from cancelling, it is also important to make sure that idpf_intr_rel() never reschedules it afterwards. In order to comply, in the init path, do the first queueing of mbx_task in idpf_init_dflt_mbx(), and in deinit and reset, always cancel the task in idpf_deinit_dflt_mbx(), in every single flow call idpf_mb_intr_rel_irq() beforehand. Reviewed-by: Emil Tantilov <emil.s.tantilov@intel.com> Reviewed-by: Michal Kubiak <michal.kubiak@intel.com> Tested-by: Samuel Salin <Samuel.salin@intel.com> Signed-off-by: Larysa Zaremba <larysa.zaremba@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
parent
deaada4f18
commit
047cdea667
|
|
@ -984,6 +984,7 @@ void idpf_vc_event_task(struct work_struct *work);
|
|||
void idpf_dev_ops_init(struct idpf_adapter *adapter);
|
||||
void idpf_vf_dev_ops_init(struct idpf_adapter *adapter);
|
||||
int idpf_intr_req(struct idpf_adapter *adapter);
|
||||
void idpf_mb_intr_rel_irq(struct idpf_adapter *adapter);
|
||||
void idpf_intr_rel(struct idpf_adapter *adapter);
|
||||
u16 idpf_get_max_tx_hdr_size(struct idpf_adapter *adapter);
|
||||
int idpf_initiate_soft_reset(struct idpf_vport *vport,
|
||||
|
|
|
|||
|
|
@ -68,9 +68,11 @@ static void idpf_deinit_vector_stack(struct idpf_adapter *adapter)
|
|||
* This will also disable interrupt mode and queue up mailbox task. Mailbox
|
||||
* task will reschedule itself if not in interrupt mode.
|
||||
*/
|
||||
static void idpf_mb_intr_rel_irq(struct idpf_adapter *adapter)
|
||||
void idpf_mb_intr_rel_irq(struct idpf_adapter *adapter)
|
||||
{
|
||||
clear_bit(IDPF_MB_INTR_MODE, adapter->flags);
|
||||
if (!test_and_clear_bit(IDPF_MB_INTR_MODE, adapter->flags))
|
||||
return;
|
||||
|
||||
kfree(free_irq(adapter->msix_entries[0].vector, adapter));
|
||||
queue_delayed_work(adapter->mbx_wq, &adapter->mbx_task, 0);
|
||||
}
|
||||
|
|
@ -1939,14 +1941,11 @@ static void idpf_init_hard_reset(struct idpf_adapter *adapter)
|
|||
goto unlock_mutex;
|
||||
}
|
||||
|
||||
queue_delayed_work(adapter->mbx_wq, &adapter->mbx_task, 0);
|
||||
|
||||
/* Initialize the state machine, also allocate memory and request
|
||||
* resources
|
||||
*/
|
||||
err = idpf_vc_core_init(adapter);
|
||||
if (err) {
|
||||
cancel_delayed_work_sync(&adapter->mbx_task);
|
||||
idpf_deinit_dflt_mbx(adapter);
|
||||
goto unlock_mutex;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2931,6 +2931,8 @@ int idpf_init_dflt_mbx(struct idpf_adapter *adapter)
|
|||
adapter->xnm = params.xnm;
|
||||
adapter->state = __IDPF_VER_CHECK;
|
||||
|
||||
queue_delayed_work(adapter->mbx_wq, &adapter->mbx_task, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -2940,6 +2942,9 @@ int idpf_init_dflt_mbx(struct idpf_adapter *adapter)
|
|||
*/
|
||||
void idpf_deinit_dflt_mbx(struct idpf_adapter *adapter)
|
||||
{
|
||||
idpf_mb_intr_rel_irq(adapter);
|
||||
cancel_delayed_work_sync(&adapter->mbx_task);
|
||||
|
||||
if (adapter->xnm) {
|
||||
libie_ctlq_xn_shutdown(adapter->xnm);
|
||||
idpf_mb_clean(adapter->asq, true);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user