qla2xxx: Allow vref count to timeout on vport delete.
Cc: <stable@vger.kernel.org> Signed-off-by: Joe Carnuccio <joe.carnuccio@cavium.com> Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
parent
7d7a743543
commit
c4a9b538ab
5 changed files with 16 additions and 10 deletions
|
@ -2154,8 +2154,6 @@ qla24xx_vport_delete(struct fc_vport *fc_vport)
|
||||||
"Timer for the VP[%d] has stopped\n", vha->vp_idx);
|
"Timer for the VP[%d] has stopped\n", vha->vp_idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
BUG_ON(atomic_read(&vha->vref_count));
|
|
||||||
|
|
||||||
qla2x00_free_fcports(vha);
|
qla2x00_free_fcports(vha);
|
||||||
|
|
||||||
mutex_lock(&ha->vport_lock);
|
mutex_lock(&ha->vport_lock);
|
||||||
|
@ -2166,7 +2164,7 @@ qla24xx_vport_delete(struct fc_vport *fc_vport)
|
||||||
dma_free_coherent(&ha->pdev->dev, vha->gnl.size, vha->gnl.l,
|
dma_free_coherent(&ha->pdev->dev, vha->gnl.size, vha->gnl.l,
|
||||||
vha->gnl.ldma);
|
vha->gnl.ldma);
|
||||||
|
|
||||||
if (vha->qpair->vp_idx == vha->vp_idx) {
|
if (vha->qpair && vha->qpair->vp_idx == vha->vp_idx) {
|
||||||
if (qla2xxx_delete_qpair(vha, vha->qpair) != QLA_SUCCESS)
|
if (qla2xxx_delete_qpair(vha, vha->qpair) != QLA_SUCCESS)
|
||||||
ql_log(ql_log_warn, vha, 0x7087,
|
ql_log(ql_log_warn, vha, 0x7087,
|
||||||
"Queue Pair delete failed.\n");
|
"Queue Pair delete failed.\n");
|
||||||
|
|
|
@ -4076,6 +4076,7 @@ typedef struct scsi_qla_host {
|
||||||
/* Count of active session/fcport */
|
/* Count of active session/fcport */
|
||||||
int fcport_count;
|
int fcport_count;
|
||||||
wait_queue_head_t fcport_waitQ;
|
wait_queue_head_t fcport_waitQ;
|
||||||
|
wait_queue_head_t vref_waitq;
|
||||||
} scsi_qla_host_t;
|
} scsi_qla_host_t;
|
||||||
|
|
||||||
struct qla27xx_image_status {
|
struct qla27xx_image_status {
|
||||||
|
@ -4131,14 +4132,17 @@ struct qla2_sgx {
|
||||||
mb(); \
|
mb(); \
|
||||||
if (__vha->flags.delete_progress) { \
|
if (__vha->flags.delete_progress) { \
|
||||||
atomic_dec(&__vha->vref_count); \
|
atomic_dec(&__vha->vref_count); \
|
||||||
|
wake_up(&__vha->vref_waitq); \
|
||||||
__bail = 1; \
|
__bail = 1; \
|
||||||
} else { \
|
} else { \
|
||||||
__bail = 0; \
|
__bail = 0; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define QLA_VHA_MARK_NOT_BUSY(__vha) \
|
#define QLA_VHA_MARK_NOT_BUSY(__vha) do { \
|
||||||
atomic_dec(&__vha->vref_count); \
|
atomic_dec(&__vha->vref_count); \
|
||||||
|
wake_up(&__vha->vref_waitq); \
|
||||||
|
} while (0) \
|
||||||
|
|
||||||
#define QLA_QPAIR_MARK_BUSY(__qpair, __bail) do { \
|
#define QLA_QPAIR_MARK_BUSY(__qpair, __bail) do { \
|
||||||
atomic_inc(&__qpair->ref_count); \
|
atomic_inc(&__qpair->ref_count); \
|
||||||
|
|
|
@ -5148,6 +5148,7 @@ qla2x00_update_fcports(scsi_qla_host_t *base_vha)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
atomic_dec(&vha->vref_count);
|
atomic_dec(&vha->vref_count);
|
||||||
|
wake_up(&vha->vref_waitq);
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&ha->vport_slock, flags);
|
spin_unlock_irqrestore(&ha->vport_slock, flags);
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,13 +74,14 @@ qla24xx_deallocate_vp_id(scsi_qla_host_t *vha)
|
||||||
* ensures no active vp_list traversal while the vport is removed
|
* ensures no active vp_list traversal while the vport is removed
|
||||||
* from the queue)
|
* from the queue)
|
||||||
*/
|
*/
|
||||||
|
wait_event_timeout(vha->vref_waitq, atomic_read(&vha->vref_count),
|
||||||
|
10*HZ);
|
||||||
|
|
||||||
spin_lock_irqsave(&ha->vport_slock, flags);
|
spin_lock_irqsave(&ha->vport_slock, flags);
|
||||||
while (atomic_read(&vha->vref_count)) {
|
if (atomic_read(&vha->vref_count)) {
|
||||||
spin_unlock_irqrestore(&ha->vport_slock, flags);
|
ql_dbg(ql_dbg_vport, vha, 0xfffa,
|
||||||
|
"vha->vref_count=%u timeout\n", vha->vref_count.counter);
|
||||||
msleep(500);
|
vha->vref_count = (atomic_t)ATOMIC_INIT(0);
|
||||||
|
|
||||||
spin_lock_irqsave(&ha->vport_slock, flags);
|
|
||||||
}
|
}
|
||||||
list_del(&vha->list);
|
list_del(&vha->list);
|
||||||
qlt_update_vp_map(vha, RESET_VP_IDX);
|
qlt_update_vp_map(vha, RESET_VP_IDX);
|
||||||
|
@ -269,6 +270,7 @@ qla2x00_alert_all_vps(struct rsp_que *rsp, uint16_t *mb)
|
||||||
|
|
||||||
spin_lock_irqsave(&ha->vport_slock, flags);
|
spin_lock_irqsave(&ha->vport_slock, flags);
|
||||||
atomic_dec(&vha->vref_count);
|
atomic_dec(&vha->vref_count);
|
||||||
|
wake_up(&vha->vref_waitq);
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4268,6 +4268,7 @@ struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *sht,
|
||||||
spin_lock_init(&vha->work_lock);
|
spin_lock_init(&vha->work_lock);
|
||||||
spin_lock_init(&vha->cmd_list_lock);
|
spin_lock_init(&vha->cmd_list_lock);
|
||||||
init_waitqueue_head(&vha->fcport_waitQ);
|
init_waitqueue_head(&vha->fcport_waitQ);
|
||||||
|
init_waitqueue_head(&vha->vref_waitq);
|
||||||
|
|
||||||
vha->gnl.size = sizeof(struct get_name_list_extended) *
|
vha->gnl.size = sizeof(struct get_name_list_extended) *
|
||||||
(ha->max_loop_id + 1);
|
(ha->max_loop_id + 1);
|
||||||
|
|
Loading…
Add table
Reference in a new issue