PERFORCE change 183877 for review

Ken Merry ken at FreeBSD.org
Thu Sep 16 22:51:48 UTC 2010


http://p4web.freebsd.org/@@183877?ac=10

Change 183877 by ken at ken.spectra.vm-freebsd on 2010/09/16 22:51:11

	According to the MPT2 spec, task management commands are
	serialized, and so no I/O should start while task management
	commands are active.
	
	So, to comply with that, freeze the SIM queue before we send any
	task management commands (abort, target reset, etc.) down to the
	IOC.  We unfreeze the queue once the task management command
	completes.
	
	It isn't clear from the spec whether multiple simultaneous task
	management commands are supported.  Right now it is possible to
	have multiple outstanding task management commands, especially in
	the abort case.  Multiple outstanding aborts do complete
	successfully, so it may be supported.
	
	We also don't yet have any recovery mechanism (e.g. reset the IOC)
	if the task management command fails.

Affected files ...

.. //depot/projects/mps/src/sys/dev/mps/mps_sas.c#3 edit

Differences ...

==== //depot/projects/mps/src/sys/dev/mps/mps_sas.c#3 (text+ko) ====

@@ -438,6 +438,7 @@
 	cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
 	cm->cm_complete = mpssas_remove_device;
 	cm->cm_targ = targ;
+	xpt_freeze_simq(sc->sassc->sim, 1);
 	mps_map_command(sc, cm);
 }
 
@@ -453,6 +454,7 @@
 
 	reply = (MPI2_SCSI_TASK_MANAGE_REPLY *)cm->cm_reply;
 	handle = cm->cm_targ->handle;
+	xpt_release_simq(sc->sassc->sim, 1);
 	if (reply->IOCStatus != MPI2_IOCSTATUS_SUCCESS) {
 		mps_printf(sc, "Failure 0x%x reseting device 0x%04x\n", 
 		   reply->IOCStatus, handle);
@@ -983,6 +985,11 @@
 	mps_printf(sc, "%s: abort request on handle %#04x SMID %d "
 		   "complete\n", __func__, req->DevHandle, req->TaskMID);
 
+	/*
+	 * Release the SIM queue, we froze it when we sent the abort.
+	 */
+	xpt_release_simq(sc->sassc->sim, 1);
+
 	mps_free_command(sc, cm);
 }
 
@@ -1013,10 +1020,19 @@
 	cm->cm_data = NULL;
 	cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
 
+	/*
+	 * Freeze the SIM queue while we issue the abort.  According to the
+	 * Fusion-MPT 2.0 spec, task management requests are serialized,
+	 * and so the host should not send any I/O requests while task
+	 * management requests are pending.
+	 */
+	xpt_freeze_simq(sc->sassc->sim, 1);
+
 	error = mps_map_command(sc, cm);
 
 	if (error != 0) {
 		mps_printf(sc, "%s: error mapping abort request!\n", __func__);
+		xpt_release_simq(sc->sassc->sim, 1);
 	}
 #if 0
 	error = mpssas_reset(sc, targ, &resetcm);
@@ -1361,7 +1377,13 @@
 	cm->cm_data = NULL;
 	cm->cm_desc.Default.RequestFlags = MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
 
+	xpt_freeze_simq(sassc->sim, 1);
+
 	error = mps_map_command(sassc->sc, cm);
+
+	if (error != 0)
+		xpt_release_simq(sassc->sim, 1);
+
 	return (error);
 }
 
@@ -1385,6 +1407,9 @@
 		ccb->ccb_h.status = CAM_REQ_CMP_ERR;
 
 	mps_free_command(sc, cm);
+
+	xpt_release_simq(sc->sassc->sim, 1);
+
 	xpt_done(ccb);
 }
 


More information about the p4-projects mailing list