Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Aug 2011 08:41:37 +0000 (UTC)
From:      Xin LI <delphij@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r224905 - head/sys/dev/arcmsr
Message-ID:  <201108160841.p7G8fbrR048790@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: delphij
Date: Tue Aug 16 08:41:37 2011
New Revision: 224905
URL: http://svn.freebsd.org/changeset/base/224905

Log:
  Update arcmsr(4) to 1.20.00.22 to solve recursive acquisition of buffer
  mutex, which would lead to a deadlock.
  
  Many thanks to Areca for their continued support of FreeBSD.
  
  Submitted by:	Ching Huang <ching2048 areca com tw>
  Tested by:	Willem Jan Withagen <wjw digiware nl>
  MFC after:	3 days
  Approved by:	re (kib)

Modified:
  head/sys/dev/arcmsr/arcmsr.c

Modified: head/sys/dev/arcmsr/arcmsr.c
==============================================================================
--- head/sys/dev/arcmsr/arcmsr.c	Tue Aug 16 08:41:09 2011	(r224904)
+++ head/sys/dev/arcmsr/arcmsr.c	Tue Aug 16 08:41:37 2011	(r224905)
@@ -68,6 +68,7 @@
 **     1.20.00.21	02/08/2011		Ching Huang			 Implement I/O request timeout
 **               	02/14/2011		Ching Huang			 Modified pktRequestCount
 **     1.20.00.21	03/03/2011		Ching Huang			 if a command timeout, then wait its ccb back before free it
+**     1.20.00.22	07/04/2011		Ching Huang			 Fixed multiple MTX panic
 ******************************************************************************************
 * $FreeBSD$
 */
@@ -150,7 +151,7 @@
 #define arcmsr_callout_init(a)	callout_init(a);
 #endif
 
-#define ARCMSR_DRIVER_VERSION			"Driver Version 1.20.00.21 2010-03-03"
+#define ARCMSR_DRIVER_VERSION			"Driver Version 1.20.00.22 2011-07-04"
 #include <dev/arcmsr/arcmsr.h>
 #define	SRB_SIZE						((sizeof(struct CommandControlBlock)+0x1f) & 0xffe0)
 #define ARCMSR_SRBS_POOL_SIZE           (SRB_SIZE * ARCMSR_MAX_FREESRB_NUM)
@@ -1293,11 +1294,15 @@ static void arcmsr_stop_adapter_bgrb(str
 static void arcmsr_poll(struct cam_sim * psim)
 {
 	struct AdapterControlBlock *acb;
+	int	mutex;
 
 	acb = (struct AdapterControlBlock *)cam_sim_softc(psim);
-	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
+	mutex = mtx_owned(&acb->qbuffer_lock);
+	if( mutex == 0 )
+		ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
 	arcmsr_interrupt(acb);
-	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
+	if( mutex == 0 )
+		ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
 	return;
 }
 /*
@@ -2089,8 +2094,11 @@ struct CommandControlBlock * arcmsr_get_
 {
 	struct CommandControlBlock *srb=NULL;
 	u_int32_t workingsrb_startindex, workingsrb_doneindex;
+	int	mutex;
 
-	ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
+	mutex = mtx_owned(&acb->qbuffer_lock);
+	if( mutex == 0 )
+		ARCMSR_LOCK_ACQUIRE(&acb->qbuffer_lock);
 	workingsrb_doneindex=acb->workingsrb_doneindex;
 	workingsrb_startindex=acb->workingsrb_startindex;
 	srb=acb->srbworkingQ[workingsrb_startindex];
@@ -2101,7 +2109,8 @@ struct CommandControlBlock * arcmsr_get_
 	} else {
 		srb=NULL;
 	}
-	ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
+	if( mutex == 0 )
+		ARCMSR_LOCK_RELEASE(&acb->qbuffer_lock);
 	return(srb);
 }
 /*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201108160841.p7G8fbrR048790>