6973916 pmcs smp synchronization change causing livelocks
authorJesse Butler <jesse.butler@oracle.com>
Thu, 12 Aug 2010 14:52:21 -0600
changeset 13102 579992f451e3
parent 13101 08bbd228b732
child 13103 5257d5374986
6973916 pmcs smp synchronization change causing livelocks
usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_scsa.c
usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_subr.c
--- 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) {