Message ID | 1480715097-13611-7-git-send-email-himanshu.madhani@cavium.com (mailing list archive) |
---|---|
State | Changes Requested, archived |
Headers | show |
On 12/02/2016 10:44 PM, Himanshu Madhani wrote: > From: Quinn Tran <quinn.tran@cavium.com> > > - Fix race condition between dpc_thread accessing Multiqueue resources > and qla2x00_remove_one thread trying to free resource. > - Fix out of order free for Multiqueue resources. Also, Multiqueue > interrupts needs a workqueue. Interrupt needed to stop before > the wq can be destroyed. > > Signed-off-by: Quinn Tran <quinn.tran@cavium.com> > Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com> > --- > drivers/scsi/qla2xxx/qla_def.h | 3 ++- > drivers/scsi/qla2xxx/qla_isr.c | 20 +++++++---------- > drivers/scsi/qla2xxx/qla_mq.c | 2 +- > drivers/scsi/qla2xxx/qla_os.c | 51 +++++++++++++++++++++++++++++++----------- > 4 files changed, 49 insertions(+), 27 deletions(-) > > diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h > index 607d539..e613535 100644 > --- a/drivers/scsi/qla2xxx/qla_def.h > +++ b/drivers/scsi/qla2xxx/qla_def.h > @@ -2734,7 +2734,8 @@ struct isp_operations { > > #define QLA_MSIX_DEFAULT 0x00 > #define QLA_MSIX_RSP_Q 0x01 > -#define QLA_MSIX_QPAIR_MULTIQ_RSP_Q 0x02 > +#define QLA_ATIO_VECTOR 0x02 > +#define QLA_MSIX_QPAIR_MULTIQ_RSP_Q 0x03 > > #define QLA_MIDX_DEFAULT 0 > #define QLA_MIDX_RSP_Q 1 > diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c > index 14f27a7..03384cf 100644 > --- a/drivers/scsi/qla2xxx/qla_isr.c > +++ b/drivers/scsi/qla2xxx/qla_isr.c > @@ -2976,6 +2976,7 @@ struct qla_init_msix_entry { > static struct qla_init_msix_entry msix_entries[] = { > { "qla2xxx (default)", qla24xx_msix_default }, > { "qla2xxx (rsp_q)", qla24xx_msix_rsp_q }, > + { "qla2xxx (atio_q)", qla83xx_msix_atio_q }, > { "qla2xxx (qpair_multiq)", qla2xxx_msix_rsp_q }, > }; > > @@ -2984,17 +2985,10 @@ struct qla_init_msix_entry { > { "qla2xxx (rsp_q)", qla82xx_msix_rsp_q }, > }; > > -static struct qla_init_msix_entry qla83xx_msix_entries[] = { > - { "qla2xxx (default)", qla24xx_msix_default }, > - { "qla2xxx (rsp_q)", qla24xx_msix_rsp_q }, > - { "qla2xxx (atio_q)", qla83xx_msix_atio_q }, > -}; > - > static int > qla24xx_enable_msix(struct qla_hw_data *ha, struct rsp_que *rsp) > { > #define MIN_MSIX_COUNT 2 > -#define ATIO_VECTOR 2 > int i, ret; > struct qla_msix_entry *qentry; > scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); > @@ -3051,7 +3045,7 @@ struct qla_init_msix_entry { > } > > /* Enable MSI-X vectors for the base queue */ > - for (i = 0; i < 2; i++) { > + for (i = 0; i < (QLA_MSIX_RSP_Q + 1); i++) { > qentry = &ha->msix_entries[i]; > qentry->handle = rsp; > rsp->msix = qentry; > @@ -3068,6 +3062,7 @@ struct qla_init_msix_entry { > if (ret) > goto msix_register_fail; > qentry->have_irq = 1; > + qentry->in_use = 1; > > /* Register for CPU affinity notification. */ > irq_set_affinity_notifier(qentry->vector, &qentry->irq_notify); > @@ -3087,14 +3082,15 @@ struct qla_init_msix_entry { > * queue. > */ > if (QLA_TGT_MODE_ENABLED() && IS_ATIO_MSIX_CAPABLE(ha)) { > - qentry = &ha->msix_entries[ATIO_VECTOR]; > + qentry = &ha->msix_entries[QLA_ATIO_VECTOR]; > rsp->msix = qentry; > qentry->handle = rsp; > scnprintf(qentry->name, sizeof(qentry->name), > - qla83xx_msix_entries[ATIO_VECTOR].name); > + msix_entries[QLA_ATIO_VECTOR].name); > + qentry->in_use = 1; > ret = request_irq(qentry->vector, > - qla83xx_msix_entries[ATIO_VECTOR].handler, > - 0, qla83xx_msix_entries[ATIO_VECTOR].name, rsp); > + msix_entries[QLA_ATIO_VECTOR].handler, > + 0, msix_entries[QLA_ATIO_VECTOR].name, rsp); > qentry->have_irq = 1; > } > > diff --git a/drivers/scsi/qla2xxx/qla_mq.c b/drivers/scsi/qla2xxx/qla_mq.c > index a64b7b0..5543b4c 100644 > --- a/drivers/scsi/qla2xxx/qla_mq.c > +++ b/drivers/scsi/qla2xxx/qla_mq.c > @@ -118,7 +118,7 @@ struct qla_qpair *qla2xxx_create_qpair(struct scsi_qla_host *vha, int qos, int v > qpair->vp_idx = vp_idx; > > for (i = 0; i < ha->msix_count; i++) { > - msix = &ha->msix_entries[i + 2]; > + msix = &ha->msix_entries[i]; > if (msix->in_use) > continue; > qpair->msix = msix; > diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c > index 3371b3f..91d8e7a 100644 > --- a/drivers/scsi/qla2xxx/qla_os.c > +++ b/drivers/scsi/qla2xxx/qla_os.c > @@ -434,24 +434,41 @@ static void qla2x00_free_queues(struct qla_hw_data *ha) > struct req_que *req; > struct rsp_que *rsp; > int cnt; > + unsigned long flags; > > + spin_lock_irqsave(&ha->hardware_lock, flags); > for (cnt = 0; cnt < ha->max_req_queues; cnt++) { > if (!test_bit(cnt, ha->req_qid_map)) > continue; > > req = ha->req_q_map[cnt]; > + clear_bit(cnt, ha->req_qid_map); > + ha->req_q_map[cnt] = NULL; > + > + spin_unlock_irqrestore(&ha->hardware_lock, flags); > qla2x00_free_req_que(ha, req); > + spin_lock_irqsave(&ha->hardware_lock, flags); > } > + spin_unlock_irqrestore(&ha->hardware_lock, flags); > + > kfree(ha->req_q_map); > ha->req_q_map = NULL; > > + > + spin_lock_irqsave(&ha->hardware_lock, flags); > for (cnt = 0; cnt < ha->max_rsp_queues; cnt++) { > if (!test_bit(cnt, ha->rsp_qid_map)) > continue; > > rsp = ha->rsp_q_map[cnt]; > + clear_bit(cnt, ha->req_qid_map); > + ha->rsp_q_map[cnt] = NULL; > + spin_unlock_irqrestore(&ha->hardware_lock, flags); > qla2x00_free_rsp_que(ha, rsp); > + spin_lock_irqsave(&ha->hardware_lock, flags); > } > + spin_unlock_irqrestore(&ha->hardware_lock, flags); > + > kfree(ha->rsp_q_map); > ha->rsp_q_map = NULL; > } > @@ -1729,17 +1746,22 @@ uint32_t qla2x00_isp_reg_stat(struct qla_hw_data *ha) > pci_read_config_word(ha->pdev, > QLA_83XX_PCI_MSIX_CONTROL, &msix); > ha->msix_count = msix + 1; > - /* Max queues are bounded by available msix vectors */ > - /* queue 0 uses two msix vectors */ > + /* > + * By default, driver uses at least two msix vectors > + * (default & rspq) > + */ > if (ql2xmqsupport) { > /* MB interrupt uses 1 vector */ > ha->max_req_queues = ha->msix_count - 1; > ha->max_rsp_queues = ha->max_req_queues; > + > + /* ATIOQ needs 1 vector. That's 1 less QPair */ > + if (QLA_TGT_MODE_ENABLED()) > + ha->max_req_queues--; > + > /* Queue pairs is the max value minus > * the base queue pair */ > ha->max_qpairs = ha->max_req_queues - 1; > - ql_dbg_pci(ql_dbg_multiq, ha->pdev, 0xc010, > - "Max no of queues pairs: %d.\n", ha->max_qpairs); > ql_dbg_pci(ql_dbg_init, ha->pdev, 0x0190, > "Max no of queues pairs: %d.\n", ha->max_qpairs); > } Just one vector for ATIO? So sad... Can't we have full multiqueue support for target mode, too? > @@ -1751,6 +1773,8 @@ uint32_t qla2x00_isp_reg_stat(struct qla_hw_data *ha) > > mqiobase_exit: > ha->msix_count = ha->max_rsp_queues + 1; > + if (QLA_TGT_MODE_ENABLED()) > + ha->msix_count++; > > qlt_83xx_iospace_config(ha); > > @@ -3122,13 +3146,6 @@ static void qla2x00_destroy_mbx_wq(struct qla_hw_data *ha) > static void > qla2x00_destroy_deferred_work(struct qla_hw_data *ha) > { > - /* Flush the work queue and remove it */ > - if (ha->wq) { > - flush_workqueue(ha->wq); > - destroy_workqueue(ha->wq); > - ha->wq = NULL; > - } > - > /* Cancel all work and destroy DPC workqueues */ > if (ha->dpc_lp_wq) { > cancel_work_sync(&ha->idc_aen); > @@ -3326,9 +3343,17 @@ static void qla2x00_destroy_mbx_wq(struct qla_hw_data *ha) > ha->isp_ops->disable_intrs(ha); > } > > + qla2x00_free_fcports(vha); > + > qla2x00_free_irqs(vha); > > - qla2x00_free_fcports(vha); > + /* Flush the work queue and remove it */ > + if (ha->wq) { > + flush_workqueue(ha->wq); > + destroy_workqueue(ha->wq); > + ha->wq = NULL; > + } > + > > qla2x00_mem_free(ha); > > @@ -5048,8 +5073,8 @@ void qla2x00_relogin(struct scsi_qla_host *vha) > > base_vha->flags.init_done = 0; > qla25xx_delete_queues(base_vha); > - qla2x00_free_irqs(base_vha); > qla2x00_free_fcports(base_vha); > + qla2x00_free_irqs(base_vha); > qla2x00_mem_free(ha); > qla82xx_md_free(base_vha); > qla2x00_free_queues(ha); > Also here; please check if the irq affinity layout is correctly (I suspect not). You probably need to push another patch after the irq-affinity changes from Christoph in the tip tree are merged. But until then: Reviewed-by: Hannes Reinecke <hare@suse.com> Cheers, Hannes
DQpPbiAxMi80LzE2LCAxMTo0MiBQTSwgIkhhbm5lcyBSZWluZWNrZSIgPGhhcmVAc3VzZS5kZT4g d3JvdGU6DQoNCj5PbiAxMi8wMi8yMDE2IDEwOjQ0IFBNLCBIaW1hbnNodSBNYWRoYW5pIHdyb3Rl Og0KPj4gRnJvbTogUXVpbm4gVHJhbiA8cXVpbm4udHJhbkBjYXZpdW0uY29tPg0KPj4gDQo+PiAt IEZpeCByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIGRwY190aHJlYWQgYWNjZXNzaW5nIE11bHRpcXVl dWUgcmVzb3VyY2VzDQo+PiAgIGFuZCBxbGEyeDAwX3JlbW92ZV9vbmUgdGhyZWFkIHRyeWluZyB0 byBmcmVlIHJlc291cmNlLg0KPj4gLSBGaXggb3V0IG9mIG9yZGVyIGZyZWUgZm9yIE11bHRpcXVl dWUgcmVzb3VyY2VzLiBBbHNvLCBNdWx0aXF1ZXVlDQo+PiAgIGludGVycnVwdHMgbmVlZHMgYSB3 b3JrcXVldWUuIEludGVycnVwdCBuZWVkZWQgdG8gc3RvcCBiZWZvcmUNCj4+ICAgdGhlIHdxIGNh biBiZSBkZXN0cm95ZWQuDQo+PiANCj4+IFNpZ25lZC1vZmYtYnk6IFF1aW5uIFRyYW4gPHF1aW5u LnRyYW5AY2F2aXVtLmNvbT4NCj4+IFNpZ25lZC1vZmYtYnk6IEhpbWFuc2h1IE1hZGhhbmkgPGhp bWFuc2h1Lm1hZGhhbmlAY2F2aXVtLmNvbT4NCj4+IC0tLQ0KPj4gIGRyaXZlcnMvc2NzaS9xbGEy eHh4L3FsYV9kZWYuaCB8ICAzICsrLQ0KPj4gIGRyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3Iu YyB8IDIwICsrKysrKystLS0tLS0tLS0tDQo+PiAgZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21x LmMgIHwgIDIgKy0NCj4+ICBkcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYyAgfCA1MSArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0NCj4+ICA0IGZpbGVzIGNoYW5n ZWQsIDQ5IGluc2VydGlvbnMoKyksIDI3IGRlbGV0aW9ucygtKQ0KPj4gDQo+PiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgv cWxhX2RlZi5oDQo+PiBpbmRleCA2MDdkNTM5Li5lNjEzNTM1IDEwMDY0NA0KPj4gLS0tIGEvZHJp dmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oDQo+PiArKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4 eC9xbGFfZGVmLmgNCj4+IEBAIC0yNzM0LDcgKzI3MzQsOCBAQCBzdHJ1Y3QgaXNwX29wZXJhdGlv bnMgew0KPj4gIA0KPj4gICNkZWZpbmUgUUxBX01TSVhfREVGQVVMVAkJMHgwMA0KPj4gICNkZWZp bmUgUUxBX01TSVhfUlNQX1EJCQkweDAxDQo+PiAtI2RlZmluZSBRTEFfTVNJWF9RUEFJUl9NVUxU SVFfUlNQX1EJMHgwMg0KPj4gKyNkZWZpbmUgUUxBX0FUSU9fVkVDVE9SCQkweDAyDQo+PiArI2Rl ZmluZSBRTEFfTVNJWF9RUEFJUl9NVUxUSVFfUlNQX1EJMHgwMw0KPj4gIA0KPj4gICNkZWZpbmUg UUxBX01JRFhfREVGQVVMVAkwDQo+PiAgI2RlZmluZSBRTEFfTUlEWF9SU1BfUQkJMQ0KPj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYyBiL2RyaXZlcnMvc2NzaS9x bGEyeHh4L3FsYV9pc3IuYw0KPj4gaW5kZXggMTRmMjdhNy4uMDMzODRjZiAxMDA2NDQNCj4+IC0t LSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYw0KPj4gKysrIGIvZHJpdmVycy9zY3Np L3FsYTJ4eHgvcWxhX2lzci5jDQo+PiBAQCAtMjk3Niw2ICsyOTc2LDcgQEAgc3RydWN0IHFsYV9p bml0X21zaXhfZW50cnkgew0KPj4gIHN0YXRpYyBzdHJ1Y3QgcWxhX2luaXRfbXNpeF9lbnRyeSBt c2l4X2VudHJpZXNbXSA9IHsNCj4+ICAJeyAicWxhMnh4eCAoZGVmYXVsdCkiLCBxbGEyNHh4X21z aXhfZGVmYXVsdCB9LA0KPj4gIAl7ICJxbGEyeHh4IChyc3BfcSkiLCBxbGEyNHh4X21zaXhfcnNw X3EgfSwNCj4+ICsJeyAicWxhMnh4eCAoYXRpb19xKSIsIHFsYTgzeHhfbXNpeF9hdGlvX3EgfSwN Cj4+ICAJeyAicWxhMnh4eCAocXBhaXJfbXVsdGlxKSIsIHFsYTJ4eHhfbXNpeF9yc3BfcSB9LA0K Pj4gIH07DQo+PiAgDQo+PiBAQCAtMjk4NCwxNyArMjk4NSwxMCBAQCBzdHJ1Y3QgcWxhX2luaXRf bXNpeF9lbnRyeSB7DQo+PiAgCXsgInFsYTJ4eHggKHJzcF9xKSIsIHFsYTgyeHhfbXNpeF9yc3Bf cSB9LA0KPj4gIH07DQo+PiAgDQo+PiAtc3RhdGljIHN0cnVjdCBxbGFfaW5pdF9tc2l4X2VudHJ5 IHFsYTgzeHhfbXNpeF9lbnRyaWVzW10gPSB7DQo+PiAtCXsgInFsYTJ4eHggKGRlZmF1bHQpIiwg cWxhMjR4eF9tc2l4X2RlZmF1bHQgfSwNCj4+IC0JeyAicWxhMnh4eCAocnNwX3EpIiwgcWxhMjR4 eF9tc2l4X3JzcF9xIH0sDQo+PiAtCXsgInFsYTJ4eHggKGF0aW9fcSkiLCBxbGE4M3h4X21zaXhf YXRpb19xIH0sDQo+PiAtfTsNCj4+IC0NCj4+ICBzdGF0aWMgaW50DQo+PiAgcWxhMjR4eF9lbmFi bGVfbXNpeChzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCBzdHJ1Y3QgcnNwX3F1ZSAqcnNwKQ0KPj4g IHsNCj4+ICAjZGVmaW5lIE1JTl9NU0lYX0NPVU5UCTINCj4+IC0jZGVmaW5lIEFUSU9fVkVDVE9S CTINCj4+ICAJaW50IGksIHJldDsNCj4+ICAJc3RydWN0IHFsYV9tc2l4X2VudHJ5ICpxZW50cnk7 DQo+PiAgCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsN Cj4+IEBAIC0zMDUxLDcgKzMwNDUsNyBAQCBzdHJ1Y3QgcWxhX2luaXRfbXNpeF9lbnRyeSB7DQo+ PiAgCX0NCj4+ICANCj4+ICAJLyogRW5hYmxlIE1TSS1YIHZlY3RvcnMgZm9yIHRoZSBiYXNlIHF1 ZXVlICovDQo+PiAtCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsNCj4+ICsJZm9yIChpID0gMDsg aSA8IChRTEFfTVNJWF9SU1BfUSArIDEpOyBpKyspIHsNCj4+ICAJCXFlbnRyeSA9ICZoYS0+bXNp eF9lbnRyaWVzW2ldOw0KPj4gIAkJcWVudHJ5LT5oYW5kbGUgPSByc3A7DQo+PiAgCQlyc3AtPm1z aXggPSBxZW50cnk7DQo+PiBAQCAtMzA2OCw2ICszMDYyLDcgQEAgc3RydWN0IHFsYV9pbml0X21z aXhfZW50cnkgew0KPj4gIAkJaWYgKHJldCkNCj4+ICAJCQlnb3RvIG1zaXhfcmVnaXN0ZXJfZmFp bDsNCj4+ICAJCXFlbnRyeS0+aGF2ZV9pcnEgPSAxOw0KPj4gKwkJcWVudHJ5LT5pbl91c2UgPSAx Ow0KPj4gIA0KPj4gIAkJLyogUmVnaXN0ZXIgZm9yIENQVSBhZmZpbml0eSBub3RpZmljYXRpb24u ICovDQo+PiAgCQlpcnFfc2V0X2FmZmluaXR5X25vdGlmaWVyKHFlbnRyeS0+dmVjdG9yLCAmcWVu dHJ5LT5pcnFfbm90aWZ5KTsNCj4+IEBAIC0zMDg3LDE0ICszMDgyLDE1IEBAIHN0cnVjdCBxbGFf aW5pdF9tc2l4X2VudHJ5IHsNCj4+ICAJICogcXVldWUuDQo+PiAgCSAqLw0KPj4gIAlpZiAoUUxB X1RHVF9NT0RFX0VOQUJMRUQoKSAmJiBJU19BVElPX01TSVhfQ0FQQUJMRShoYSkpIHsNCj4+IC0J CXFlbnRyeSA9ICZoYS0+bXNpeF9lbnRyaWVzW0FUSU9fVkVDVE9SXTsNCj4+ICsJCXFlbnRyeSA9 ICZoYS0+bXNpeF9lbnRyaWVzW1FMQV9BVElPX1ZFQ1RPUl07DQo+PiAgCQlyc3AtPm1zaXggPSBx ZW50cnk7DQo+PiAgCQlxZW50cnktPmhhbmRsZSA9IHJzcDsNCj4+ICAJCXNjbnByaW50ZihxZW50 cnktPm5hbWUsIHNpemVvZihxZW50cnktPm5hbWUpLA0KPj4gLQkJICAgIHFsYTgzeHhfbXNpeF9l bnRyaWVzW0FUSU9fVkVDVE9SXS5uYW1lKTsNCj4+ICsJCSAgICBtc2l4X2VudHJpZXNbUUxBX0FU SU9fVkVDVE9SXS5uYW1lKTsNCj4+ICsJCXFlbnRyeS0+aW5fdXNlID0gMTsNCj4+ICAJCXJldCA9 IHJlcXVlc3RfaXJxKHFlbnRyeS0+dmVjdG9yLA0KPj4gLQkJCXFsYTgzeHhfbXNpeF9lbnRyaWVz W0FUSU9fVkVDVE9SXS5oYW5kbGVyLA0KPj4gLQkJCTAsIHFsYTgzeHhfbXNpeF9lbnRyaWVzW0FU SU9fVkVDVE9SXS5uYW1lLCByc3ApOw0KPj4gKwkJCW1zaXhfZW50cmllc1tRTEFfQVRJT19WRUNU T1JdLmhhbmRsZXIsDQo+PiArCQkJMCwgbXNpeF9lbnRyaWVzW1FMQV9BVElPX1ZFQ1RPUl0ubmFt ZSwgcnNwKTsNCj4+ICAJCXFlbnRyeS0+aGF2ZV9pcnEgPSAxOw0KPj4gIAl9DQo+PiAgDQo+PiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21xLmMgYi9kcml2ZXJzL3Njc2kv cWxhMnh4eC9xbGFfbXEuYw0KPj4gaW5kZXggYTY0YjdiMC4uNTU0M2I0YyAxMDA2NDQNCj4+IC0t LSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tcS5jDQo+PiArKysgYi9kcml2ZXJzL3Njc2kv cWxhMnh4eC9xbGFfbXEuYw0KPj4gQEAgLTExOCw3ICsxMTgsNyBAQCBzdHJ1Y3QgcWxhX3FwYWly ICpxbGEyeHh4X2NyZWF0ZV9xcGFpcihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhLCBpbnQgcW9z LCBpbnQgdg0KPj4gIAkJcXBhaXItPnZwX2lkeCA9IHZwX2lkeDsNCj4+ICANCj4+ICAJCWZvciAo aSA9IDA7IGkgPCBoYS0+bXNpeF9jb3VudDsgaSsrKSB7DQo+PiAtCQkJbXNpeCA9ICZoYS0+bXNp eF9lbnRyaWVzW2kgKyAyXTsNCj4+ICsJCQltc2l4ID0gJmhhLT5tc2l4X2VudHJpZXNbaV07DQo+ PiAgCQkJaWYgKG1zaXgtPmluX3VzZSkNCj4+ICAJCQkJY29udGludWU7DQo+PiAgCQkJcXBhaXIt Pm1zaXggPSBtc2l4Ow0KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9v cy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMNCj4+IGluZGV4IDMzNzFiM2YuLjkx ZDhlN2EgMTAwNjQ0DQo+PiAtLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYw0KPj4g KysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMNCj4+IEBAIC00MzQsMjQgKzQzNCw0 MSBAQCBzdGF0aWMgdm9pZCBxbGEyeDAwX2ZyZWVfcXVldWVzKHN0cnVjdCBxbGFfaHdfZGF0YSAq aGEpDQo+PiAgCXN0cnVjdCByZXFfcXVlICpyZXE7DQo+PiAgCXN0cnVjdCByc3BfcXVlICpyc3A7 DQo+PiAgCWludCBjbnQ7DQo+PiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7DQo+PiAgDQo+PiArCXNw aW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOw0KPj4gIAlmb3IgKGNu dCA9IDA7IGNudCA8IGhhLT5tYXhfcmVxX3F1ZXVlczsgY250KyspIHsNCj4+ICAJCWlmICghdGVz dF9iaXQoY250LCBoYS0+cmVxX3FpZF9tYXApKQ0KPj4gIAkJCWNvbnRpbnVlOw0KPj4gIA0KPj4g IAkJcmVxID0gaGEtPnJlcV9xX21hcFtjbnRdOw0KPj4gKwkJY2xlYXJfYml0KGNudCwgaGEtPnJl cV9xaWRfbWFwKTsNCj4+ICsJCWhhLT5yZXFfcV9tYXBbY250XSA9IE5VTEw7DQo+PiArDQo+PiAr CQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOw0KPj4g IAkJcWxhMngwMF9mcmVlX3JlcV9xdWUoaGEsIHJlcSk7DQo+PiArCQlzcGluX2xvY2tfaXJxc2F2 ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsNCj4+ICAJfQ0KPj4gKwlzcGluX3VubG9ja19p cnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOw0KPj4gKw0KPj4gIAlrZnJlZSho YS0+cmVxX3FfbWFwKTsNCj4+ICAJaGEtPnJlcV9xX21hcCA9IE5VTEw7DQo+PiAgDQo+PiArDQo+ PiArCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOw0KPj4gIAlm b3IgKGNudCA9IDA7IGNudCA8IGhhLT5tYXhfcnNwX3F1ZXVlczsgY250KyspIHsNCj4+ICAJCWlm ICghdGVzdF9iaXQoY250LCBoYS0+cnNwX3FpZF9tYXApKQ0KPj4gIAkJCWNvbnRpbnVlOw0KPj4g IA0KPj4gIAkJcnNwID0gaGEtPnJzcF9xX21hcFtjbnRdOw0KPj4gKwkJY2xlYXJfYml0KGNudCwg aGEtPnJlcV9xaWRfbWFwKTsNCj4+ICsJCWhhLT5yc3BfcV9tYXBbY250XSA9ICBOVUxMOw0KPj4g KwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsNCj4+ ICAJCXFsYTJ4MDBfZnJlZV9yc3BfcXVlKGhhLCByc3ApOw0KPj4gKwkJc3Bpbl9sb2NrX2lycXNh dmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7DQo+PiAgCX0NCj4+ICsJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsNCj4+ICsNCj4+ICAJa2ZyZWUo aGEtPnJzcF9xX21hcCk7DQo+PiAgCWhhLT5yc3BfcV9tYXAgPSBOVUxMOw0KPj4gIH0NCj4+IEBA IC0xNzI5LDE3ICsxNzQ2LDIyIEBAIHVpbnQzMl90IHFsYTJ4MDBfaXNwX3JlZ19zdGF0KHN0cnVj dCBxbGFfaHdfZGF0YSAqaGEpDQo+PiAgCQlwY2lfcmVhZF9jb25maWdfd29yZChoYS0+cGRldiwN Cj4+ICAJCSAgICBRTEFfODNYWF9QQ0lfTVNJWF9DT05UUk9MLCAmbXNpeCk7DQo+PiAgCQloYS0+ bXNpeF9jb3VudCA9IG1zaXggKyAxOw0KPj4gLQkJLyogTWF4IHF1ZXVlcyBhcmUgYm91bmRlZCBi eSBhdmFpbGFibGUgbXNpeCB2ZWN0b3JzICovDQo+PiAtCQkvKiBxdWV1ZSAwIHVzZXMgdHdvIG1z aXggdmVjdG9ycyAqLw0KPj4gKwkJLyoNCj4+ICsJCSAqIEJ5IGRlZmF1bHQsIGRyaXZlciB1c2Vz IGF0IGxlYXN0IHR3byBtc2l4IHZlY3RvcnMNCj4+ICsJCSAqIChkZWZhdWx0ICYgcnNwcSkNCj4+ ICsJCSAqLw0KPj4gIAkJaWYgKHFsMnhtcXN1cHBvcnQpIHsNCj4+ICAJCQkvKiBNQiBpbnRlcnJ1 cHQgdXNlcyAxIHZlY3RvciAqLw0KPj4gIAkJCWhhLT5tYXhfcmVxX3F1ZXVlcyA9IGhhLT5tc2l4 X2NvdW50IC0gMTsNCj4+ICAJCQloYS0+bWF4X3JzcF9xdWV1ZXMgPSBoYS0+bWF4X3JlcV9xdWV1 ZXM7DQo+PiArDQo+PiArCQkJLyogQVRJT1EgbmVlZHMgMSB2ZWN0b3IuIFRoYXQncyAxIGxlc3Mg UVBhaXIgKi8NCj4+ICsJCQlpZiAoUUxBX1RHVF9NT0RFX0VOQUJMRUQoKSkNCj4+ICsJCQkJaGEt Pm1heF9yZXFfcXVldWVzLS07DQo+PiArDQo+PiAgCQkJLyogUXVldWUgcGFpcnMgaXMgdGhlIG1h eCB2YWx1ZSBtaW51cw0KPj4gIAkJCSAqIHRoZSBiYXNlIHF1ZXVlIHBhaXIgKi8NCj4+ICAJCQlo YS0+bWF4X3FwYWlycyA9IGhhLT5tYXhfcmVxX3F1ZXVlcyAtIDE7DQo+PiAtCQkJcWxfZGJnX3Bj aShxbF9kYmdfbXVsdGlxLCBoYS0+cGRldiwgMHhjMDEwLA0KPj4gLQkJCSAgICAiTWF4IG5vIG9m IHF1ZXVlcyBwYWlyczogJWQuXG4iLCBoYS0+bWF4X3FwYWlycyk7DQo+PiAgCQkJcWxfZGJnX3Bj aShxbF9kYmdfaW5pdCwgaGEtPnBkZXYsIDB4MDE5MCwNCj4+ICAJCQkgICAgIk1heCBubyBvZiBx dWV1ZXMgcGFpcnM6ICVkLlxuIiwgaGEtPm1heF9xcGFpcnMpOw0KPj4gIAkJfQ0KPkp1c3Qgb25l IHZlY3RvciBmb3IgQVRJTz8gU28gc2FkLi4uDQo+Q2FuJ3Qgd2UgaGF2ZSBmdWxsIG11bHRpcXVl dWUgc3VwcG9ydCBmb3IgdGFyZ2V0IG1vZGUsIHRvbz8NCg0KV2Ugd2lsbCBiZSB3b3JraW5nIG9u IHRoZSB0YXJnZXQgbXVsdGkgcXVldWUgY2hhbmdlcyBzaG9ydGx5LiBPbmNlIHBhdGNoZXMgYXJl IHJlYWR5IHdl4oCZbGwgcG9zdCBpdCBmb3IgcmV2aWV3LiANCg0KPg0KPj4gQEAgLTE3NTEsNiAr MTc3Myw4IEBAIHVpbnQzMl90IHFsYTJ4MDBfaXNwX3JlZ19zdGF0KHN0cnVjdCBxbGFfaHdfZGF0 YSAqaGEpDQo+PiAgDQo+PiAgbXFpb2Jhc2VfZXhpdDoNCj4+ICAJaGEtPm1zaXhfY291bnQgPSBo YS0+bWF4X3JzcF9xdWV1ZXMgKyAxOw0KPj4gKwlpZiAoUUxBX1RHVF9NT0RFX0VOQUJMRUQoKSkN Cj4+ICsJCWhhLT5tc2l4X2NvdW50Kys7DQo+PiAgDQo+PiAgCXFsdF84M3h4X2lvc3BhY2VfY29u ZmlnKGhhKTsNCj4+ICANCj4+IEBAIC0zMTIyLDEzICszMTQ2LDYgQEAgc3RhdGljIHZvaWQgcWxh MngwMF9kZXN0cm95X21ieF93cShzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQ0KPj4gIHN0YXRpYyB2 b2lkDQo+PiAgcWxhMngwMF9kZXN0cm95X2RlZmVycmVkX3dvcmsoc3RydWN0IHFsYV9od19kYXRh ICpoYSkNCj4+ICB7DQo+PiAtCS8qIEZsdXNoIHRoZSB3b3JrIHF1ZXVlIGFuZCByZW1vdmUgaXQg Ki8NCj4+IC0JaWYgKGhhLT53cSkgew0KPj4gLQkJZmx1c2hfd29ya3F1ZXVlKGhhLT53cSk7DQo+ PiAtCQlkZXN0cm95X3dvcmtxdWV1ZShoYS0+d3EpOw0KPj4gLQkJaGEtPndxID0gTlVMTDsNCj4+ IC0JfQ0KPj4gLQ0KPj4gIAkvKiBDYW5jZWwgYWxsIHdvcmsgYW5kIGRlc3Ryb3kgRFBDIHdvcmtx dWV1ZXMgKi8NCj4+ICAJaWYgKGhhLT5kcGNfbHBfd3EpIHsNCj4+ICAJCWNhbmNlbF93b3JrX3N5 bmMoJmhhLT5pZGNfYWVuKTsNCj4+IEBAIC0zMzI2LDkgKzMzNDMsMTcgQEAgc3RhdGljIHZvaWQg cWxhMngwMF9kZXN0cm95X21ieF93cShzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQ0KPj4gIAkJaGEt PmlzcF9vcHMtPmRpc2FibGVfaW50cnMoaGEpOw0KPj4gIAl9DQo+PiAgDQo+PiArCXFsYTJ4MDBf ZnJlZV9mY3BvcnRzKHZoYSk7DQo+PiArDQo+PiAgCXFsYTJ4MDBfZnJlZV9pcnFzKHZoYSk7DQo+ PiAgDQo+PiAtCXFsYTJ4MDBfZnJlZV9mY3BvcnRzKHZoYSk7DQo+PiArCS8qIEZsdXNoIHRoZSB3 b3JrIHF1ZXVlIGFuZCByZW1vdmUgaXQgKi8NCj4+ICsJaWYgKGhhLT53cSkgew0KPj4gKwkJZmx1 c2hfd29ya3F1ZXVlKGhhLT53cSk7DQo+PiArCQlkZXN0cm95X3dvcmtxdWV1ZShoYS0+d3EpOw0K Pj4gKwkJaGEtPndxID0gTlVMTDsNCj4+ICsJfQ0KPj4gKw0KPj4gIA0KPj4gIAlxbGEyeDAwX21l bV9mcmVlKGhhKTsNCj4+ICANCj4+IEBAIC01MDQ4LDggKzUwNzMsOCBAQCB2b2lkIHFsYTJ4MDBf cmVsb2dpbihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhKQ0KPj4gIA0KPj4gIAliYXNlX3ZoYS0+ ZmxhZ3MuaW5pdF9kb25lID0gMDsNCj4+ICAJcWxhMjV4eF9kZWxldGVfcXVldWVzKGJhc2Vfdmhh KTsNCj4+IC0JcWxhMngwMF9mcmVlX2lycXMoYmFzZV92aGEpOw0KPj4gIAlxbGEyeDAwX2ZyZWVf ZmNwb3J0cyhiYXNlX3ZoYSk7DQo+PiArCXFsYTJ4MDBfZnJlZV9pcnFzKGJhc2VfdmhhKTsNCj4+ ICAJcWxhMngwMF9tZW1fZnJlZShoYSk7DQo+PiAgCXFsYTgyeHhfbWRfZnJlZShiYXNlX3ZoYSk7 DQo+PiAgCXFsYTJ4MDBfZnJlZV9xdWV1ZXMoaGEpOw0KPj4gDQo+QWxzbyBoZXJlOyBwbGVhc2Ug Y2hlY2sgaWYgdGhlIGlycSBhZmZpbml0eSBsYXlvdXQgaXMgY29ycmVjdGx5DQo+KEkgc3VzcGVj dCBub3QpLg0KPllvdSBwcm9iYWJseSBuZWVkIHRvIHB1c2ggYW5vdGhlciBwYXRjaCBhZnRlciB0 aGUgaXJxLWFmZmluaXR5IGNoYW5nZXMNCj5mcm9tIENocmlzdG9waCBpbiB0aGUgdGlwIHRyZWUg YXJlIG1lcmdlZC4NCj4NCj5CdXQgdW50aWwgdGhlbjoNCj4NCj5SZXZpZXdlZC1ieTogSGFubmVz IFJlaW5lY2tlIDxoYXJlQHN1c2UuY29tPg0KDQpUaGFua3MgZm9yIHRoZSByZXZpZXcuIA0KWWVz LCBXZeKAmWxsIHN1Ym1pdCBjaGFuZ2VzIG9uY2UgQ2hyaXN0b3Bo4oCZcyBwYXRjaCBzZXJpZXMg aXMgbWVyZ2VkLiANCg0KPg0KPkNoZWVycywNCj4NCj5IYW5uZXMNCj4tLSANCj5Eci4gSGFubmVz IFJlaW5lY2tlCQkgICBUZWFtbGVhZCBTdG9yYWdlICYgTmV0d29ya2luZw0KPmhhcmVAc3VzZS5k ZQkJCSAgICAgICAgICAgICAgICs0OSA5MTEgNzQwNTMgNjg4DQo+U1VTRSBMSU5VWCBHbWJILCBN YXhmZWxkc3RyLiA1LCA5MDQwOSBOw7xybmJlcmcNCj5HRjogRi4gSW1lbmTDtnJmZmVyLCBKLiBT bWl0aGFyZCwgSi4gR3VpbGQsIEQuIFVwbWFueXUsIEcuIE5vcnRvbg0KPkhSQiAyMTI4NCAoQUcg TsO8cm5iZXJnKQ0K -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 607d539..e613535 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h @@ -2734,7 +2734,8 @@ struct isp_operations { #define QLA_MSIX_DEFAULT 0x00 #define QLA_MSIX_RSP_Q 0x01 -#define QLA_MSIX_QPAIR_MULTIQ_RSP_Q 0x02 +#define QLA_ATIO_VECTOR 0x02 +#define QLA_MSIX_QPAIR_MULTIQ_RSP_Q 0x03 #define QLA_MIDX_DEFAULT 0 #define QLA_MIDX_RSP_Q 1 diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 14f27a7..03384cf 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c @@ -2976,6 +2976,7 @@ struct qla_init_msix_entry { static struct qla_init_msix_entry msix_entries[] = { { "qla2xxx (default)", qla24xx_msix_default }, { "qla2xxx (rsp_q)", qla24xx_msix_rsp_q }, + { "qla2xxx (atio_q)", qla83xx_msix_atio_q }, { "qla2xxx (qpair_multiq)", qla2xxx_msix_rsp_q }, }; @@ -2984,17 +2985,10 @@ struct qla_init_msix_entry { { "qla2xxx (rsp_q)", qla82xx_msix_rsp_q }, }; -static struct qla_init_msix_entry qla83xx_msix_entries[] = { - { "qla2xxx (default)", qla24xx_msix_default }, - { "qla2xxx (rsp_q)", qla24xx_msix_rsp_q }, - { "qla2xxx (atio_q)", qla83xx_msix_atio_q }, -}; - static int qla24xx_enable_msix(struct qla_hw_data *ha, struct rsp_que *rsp) { #define MIN_MSIX_COUNT 2 -#define ATIO_VECTOR 2 int i, ret; struct qla_msix_entry *qentry; scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); @@ -3051,7 +3045,7 @@ struct qla_init_msix_entry { } /* Enable MSI-X vectors for the base queue */ - for (i = 0; i < 2; i++) { + for (i = 0; i < (QLA_MSIX_RSP_Q + 1); i++) { qentry = &ha->msix_entries[i]; qentry->handle = rsp; rsp->msix = qentry; @@ -3068,6 +3062,7 @@ struct qla_init_msix_entry { if (ret) goto msix_register_fail; qentry->have_irq = 1; + qentry->in_use = 1; /* Register for CPU affinity notification. */ irq_set_affinity_notifier(qentry->vector, &qentry->irq_notify); @@ -3087,14 +3082,15 @@ struct qla_init_msix_entry { * queue. */ if (QLA_TGT_MODE_ENABLED() && IS_ATIO_MSIX_CAPABLE(ha)) { - qentry = &ha->msix_entries[ATIO_VECTOR]; + qentry = &ha->msix_entries[QLA_ATIO_VECTOR]; rsp->msix = qentry; qentry->handle = rsp; scnprintf(qentry->name, sizeof(qentry->name), - qla83xx_msix_entries[ATIO_VECTOR].name); + msix_entries[QLA_ATIO_VECTOR].name); + qentry->in_use = 1; ret = request_irq(qentry->vector, - qla83xx_msix_entries[ATIO_VECTOR].handler, - 0, qla83xx_msix_entries[ATIO_VECTOR].name, rsp); + msix_entries[QLA_ATIO_VECTOR].handler, + 0, msix_entries[QLA_ATIO_VECTOR].name, rsp); qentry->have_irq = 1; } diff --git a/drivers/scsi/qla2xxx/qla_mq.c b/drivers/scsi/qla2xxx/qla_mq.c index a64b7b0..5543b4c 100644 --- a/drivers/scsi/qla2xxx/qla_mq.c +++ b/drivers/scsi/qla2xxx/qla_mq.c @@ -118,7 +118,7 @@ struct qla_qpair *qla2xxx_create_qpair(struct scsi_qla_host *vha, int qos, int v qpair->vp_idx = vp_idx; for (i = 0; i < ha->msix_count; i++) { - msix = &ha->msix_entries[i + 2]; + msix = &ha->msix_entries[i]; if (msix->in_use) continue; qpair->msix = msix; diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 3371b3f..91d8e7a 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -434,24 +434,41 @@ static void qla2x00_free_queues(struct qla_hw_data *ha) struct req_que *req; struct rsp_que *rsp; int cnt; + unsigned long flags; + spin_lock_irqsave(&ha->hardware_lock, flags); for (cnt = 0; cnt < ha->max_req_queues; cnt++) { if (!test_bit(cnt, ha->req_qid_map)) continue; req = ha->req_q_map[cnt]; + clear_bit(cnt, ha->req_qid_map); + ha->req_q_map[cnt] = NULL; + + spin_unlock_irqrestore(&ha->hardware_lock, flags); qla2x00_free_req_que(ha, req); + spin_lock_irqsave(&ha->hardware_lock, flags); } + spin_unlock_irqrestore(&ha->hardware_lock, flags); + kfree(ha->req_q_map); ha->req_q_map = NULL; + + spin_lock_irqsave(&ha->hardware_lock, flags); for (cnt = 0; cnt < ha->max_rsp_queues; cnt++) { if (!test_bit(cnt, ha->rsp_qid_map)) continue; rsp = ha->rsp_q_map[cnt]; + clear_bit(cnt, ha->req_qid_map); + ha->rsp_q_map[cnt] = NULL; + spin_unlock_irqrestore(&ha->hardware_lock, flags); qla2x00_free_rsp_que(ha, rsp); + spin_lock_irqsave(&ha->hardware_lock, flags); } + spin_unlock_irqrestore(&ha->hardware_lock, flags); + kfree(ha->rsp_q_map); ha->rsp_q_map = NULL; } @@ -1729,17 +1746,22 @@ uint32_t qla2x00_isp_reg_stat(struct qla_hw_data *ha) pci_read_config_word(ha->pdev, QLA_83XX_PCI_MSIX_CONTROL, &msix); ha->msix_count = msix + 1; - /* Max queues are bounded by available msix vectors */ - /* queue 0 uses two msix vectors */ + /* + * By default, driver uses at least two msix vectors + * (default & rspq) + */ if (ql2xmqsupport) { /* MB interrupt uses 1 vector */ ha->max_req_queues = ha->msix_count - 1; ha->max_rsp_queues = ha->max_req_queues; + + /* ATIOQ needs 1 vector. That's 1 less QPair */ + if (QLA_TGT_MODE_ENABLED()) + ha->max_req_queues--; + /* Queue pairs is the max value minus * the base queue pair */ ha->max_qpairs = ha->max_req_queues - 1; - ql_dbg_pci(ql_dbg_multiq, ha->pdev, 0xc010, - "Max no of queues pairs: %d.\n", ha->max_qpairs); ql_dbg_pci(ql_dbg_init, ha->pdev, 0x0190, "Max no of queues pairs: %d.\n", ha->max_qpairs); } @@ -1751,6 +1773,8 @@ uint32_t qla2x00_isp_reg_stat(struct qla_hw_data *ha) mqiobase_exit: ha->msix_count = ha->max_rsp_queues + 1; + if (QLA_TGT_MODE_ENABLED()) + ha->msix_count++; qlt_83xx_iospace_config(ha); @@ -3122,13 +3146,6 @@ static void qla2x00_destroy_mbx_wq(struct qla_hw_data *ha) static void qla2x00_destroy_deferred_work(struct qla_hw_data *ha) { - /* Flush the work queue and remove it */ - if (ha->wq) { - flush_workqueue(ha->wq); - destroy_workqueue(ha->wq); - ha->wq = NULL; - } - /* Cancel all work and destroy DPC workqueues */ if (ha->dpc_lp_wq) { cancel_work_sync(&ha->idc_aen); @@ -3326,9 +3343,17 @@ static void qla2x00_destroy_mbx_wq(struct qla_hw_data *ha) ha->isp_ops->disable_intrs(ha); } + qla2x00_free_fcports(vha); + qla2x00_free_irqs(vha); - qla2x00_free_fcports(vha); + /* Flush the work queue and remove it */ + if (ha->wq) { + flush_workqueue(ha->wq); + destroy_workqueue(ha->wq); + ha->wq = NULL; + } + qla2x00_mem_free(ha); @@ -5048,8 +5073,8 @@ void qla2x00_relogin(struct scsi_qla_host *vha) base_vha->flags.init_done = 0; qla25xx_delete_queues(base_vha); - qla2x00_free_irqs(base_vha); qla2x00_free_fcports(base_vha); + qla2x00_free_irqs(base_vha); qla2x00_mem_free(ha); qla82xx_md_free(base_vha); qla2x00_free_queues(ha);