diff options
author | Jamie Wellnitz <Jamie.Wellnitz@emulex.com> | 2006-02-28 22:33:12 -0500 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-03-06 10:47:46 -0500 |
commit | b808608bd7afdf1b0a2eb096ff2b5b93781fdbb6 (patch) | |
tree | c09a1b80000231144129ef988c259117e55630aa | |
parent | 66a9ed66000d186933892ca5121e68a071d624ac (diff) |
[PATCH] lpfc 8.1.3: Fix polling mode panic
Fix polling mode panic
Cause: Race between interrupt driven and polling path in harvesting iocbs
from
the response ring.
Signed-off-by: Jamie Wellnitz <Jamie.Wellnitz@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
-rw-r--r-- | drivers/scsi/lpfc/lpfc_scsi.c | 5 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 17 |
2 files changed, 16 insertions, 6 deletions
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index 094f18f1fa05..f93799873721 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c | |||
@@ -467,6 +467,11 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, | |||
467 | sdev = cmd->device; | 467 | sdev = cmd->device; |
468 | cmd->scsi_done(cmd); | 468 | cmd->scsi_done(cmd); |
469 | 469 | ||
470 | if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) { | ||
471 | lpfc_release_scsi_buf(phba, lpfc_cmd); | ||
472 | return; | ||
473 | } | ||
474 | |||
470 | if (!result && pnode != NULL && | 475 | if (!result && pnode != NULL && |
471 | ((jiffies - pnode->last_ramp_up_time) > | 476 | ((jiffies - pnode->last_ramp_up_time) > |
472 | LPFC_Q_RAMP_UP_INTERVAL * HZ) && | 477 | LPFC_Q_RAMP_UP_INTERVAL * HZ) && |
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index d08fd89dd44f..764aadbec71b 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
@@ -1154,12 +1154,17 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba * phba, | |||
1154 | cmdiocbq = lpfc_sli_iocbq_lookup(phba, pring, | 1154 | cmdiocbq = lpfc_sli_iocbq_lookup(phba, pring, |
1155 | &rspiocbq); | 1155 | &rspiocbq); |
1156 | if ((cmdiocbq) && (cmdiocbq->iocb_cmpl)) { | 1156 | if ((cmdiocbq) && (cmdiocbq->iocb_cmpl)) { |
1157 | spin_unlock_irqrestore( | 1157 | if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) { |
1158 | phba->host->host_lock, iflag); | 1158 | (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, |
1159 | (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, | 1159 | &rspiocbq); |
1160 | &rspiocbq); | 1160 | } else { |
1161 | spin_lock_irqsave(phba->host->host_lock, | 1161 | spin_unlock_irqrestore( |
1162 | iflag); | 1162 | phba->host->host_lock, iflag); |
1163 | (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, | ||
1164 | &rspiocbq); | ||
1165 | spin_lock_irqsave(phba->host->host_lock, | ||
1166 | iflag); | ||
1167 | } | ||
1163 | } | 1168 | } |
1164 | break; | 1169 | break; |
1165 | default: | 1170 | default: |