Hi Ewan, On 11/7/16, 7:53 AM, "Ewan D. Milne" <emilne@xxxxxxxxxx> wrote: >On Fri, 2016-11-04 at 09:33 -0700, himanshu.madhani@xxxxxxxxxx wrote: >... >> @@ -2349,6 +2349,17 @@ uint32_t qla2x00_isp_reg_stat(struct qla_hw_data *ha) >> return atomic_read(&vha->loop_state) == LOOP_READY; >> } >> >> +static void qla2x00_destroy_mbx_wq(struct qla_hw_data *ha) >> +{ >> + struct workqueue_struct *wq = ha->mbx_wq; >> + >> + if (wq) { >> + ha->mbx_wq = NULL; >> + flush_workqueue(wq); >> + destroy_workqueue(wq); >> + } >> +} >> + >> /* >> * PCI driver interface >> */ > >There is already a function qla2x00_destroy_deferred_work() that >destroys 3 other workqueues. > >... > >> @@ -3059,6 +3079,8 @@ uint32_t qla2x00_isp_reg_stat(struct qla_hw_data *ha) >> >> qla2x00_free_fw_dump(ha); >> >> + qla2x00_destroy_mbx_wq(ha); >> + >> pci_disable_pcie_error_reporting(pdev); >> pci_disable_device(pdev); >> } > >This code path (pci_driver->shutdown) does not appear to destroy the >other workqueues created by the driver. ??? > >> @@ -5011,6 +5033,8 @@ void qla2x00_relogin(struct scsi_qla_host *vha) >> */ >> qla2x00_free_sysfs_attr(base_vha, false); >> >> + qla2x00_destroy_mbx_wq(ha); >> + >> fc_remove_host(base_vha->host); >> >> scsi_remove_host(base_vha->host); > >See above. Ack. will fix up patch to address these comments. > >-Ewan Thanks, Himanshu ��.n��������+%������w��{.n�����{������ܨ}���Ơz�j:+v�����w����ޙ��&�)ߡ�a����z�ޗ���ݢj��w�f