Mercurial > illumos > illumos-gate
changeset 13102:579992f451e3
6973916 pmcs smp synchronization change causing livelocks
author | Jesse Butler <jesse.butler@oracle.com> |
---|---|
date | Thu, 12 Aug 2010 14:52:21 -0600 |
parents | 08bbd228b732 |
children | 5257d5374986 |
files | usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_scsa.c usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c |
diffstat | 2 files changed, 8 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_scsa.c Thu Aug 12 13:32:15 2010 -0600 +++ b/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_scsa.c Thu Aug 12 14:52:21 2010 -0600 @@ -1118,6 +1118,8 @@ pmcs_unlock_phy(pptr); WAIT_FOR(pwrk, smp_pkt->smp_pkt_timeout * 1000, result); pmcs_pwork(pwp, pwrk); + pmcs_smp_release(iport); + pmcs_rele_iport(iport); pmcs_lock_phy(pptr); if (result) { pmcs_timed_out(pwp, htag, __func__); @@ -1130,15 +1132,11 @@ "%s: Issuing SMP ABORT for htag 0x%08x", __func__, htag); } - pmcs_smp_release(iport); - pmcs_rele_iport(iport); pmcs_unlock_phy(pptr); pmcs_release_scratch(pwp); smp_pkt->smp_pkt_reason = ETIMEDOUT; return (DDI_FAILURE); } - pmcs_smp_release(iport); - pmcs_rele_iport(iport); status = LE_32(msg[2]); if (status == PMCOUT_STATUS_OVERFLOW) { status = PMCOUT_STATUS_OK;
--- a/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c Thu Aug 12 13:32:15 2010 -0600 +++ b/usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c Thu Aug 12 14:52:21 2010 -0600 @@ -846,6 +846,8 @@ pmcs_unlock_phy(pptr); WAIT_FOR(pwrk, 1000, result); pmcs_pwork(pwp, pwrk); + pmcs_smp_release(iport); + pmcs_rele_iport(iport); pmcs_lock_phy(pptr); if (result) { pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL, pmcs_timeo, __func__); @@ -859,12 +861,8 @@ "%s: Issuing SMP ABORT for htag 0x%08x", __func__, htag); } - pmcs_smp_release(iport); - pmcs_rele_iport(iport); return (EIO); } - pmcs_smp_release(iport); - pmcs_rele_iport(iport); status = LE_32(iomb[stsoff]); if (status != PMCOUT_STATUS_OK) { @@ -4221,6 +4219,8 @@ pmcs_unlock_phy(pptr); WAIT_FOR(pwrk, 1000, result); pmcs_pwork(pwp, pwrk); + pmcs_smp_release(iport); + pmcs_rele_iport(iport); pmcs_lock_phy(pptr); if (result) { pmcs_timed_out(pwp, htag, __func__); @@ -4231,13 +4231,9 @@ "%s: SMP ABORT failed for cmd (htag 0x%08x)", __func__, htag); } - pmcs_smp_release(iport); - pmcs_rele_iport(iport); result = 0; goto out; } - pmcs_smp_release(iport); - pmcs_rele_iport(iport); mutex_enter(&pwp->config_lock); if (pwp->config_changed) { @@ -4457,6 +4453,8 @@ pmcs_unlock_phy(expander); WAIT_FOR(pwrk, 1000, result); pmcs_pwork(pwp, pwrk); + pmcs_smp_release(iport); + pmcs_rele_iport(iport); pmcs_lock_phy(expander); if (result) { pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, NULL, @@ -4466,13 +4464,9 @@ "%s: SMP ABORT failed for cmd (htag 0x%08x)", __func__, htag); } - pmcs_smp_release(iport); - pmcs_rele_iport(iport); result = -ETIMEDOUT; goto out; } - pmcs_smp_release(iport); - pmcs_rele_iport(iport); mutex_enter(&pwp->config_lock); if (pwp->config_changed) {