Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 19 Aug 2011 01:11:07 +0000 (UTC)
From:      Xin LI <delphij@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r224991 - stable/8/sys/dev/arcmsr
Message-ID:  <201108190111.p7J1B7Gx081002@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: delphij
Date: Fri Aug 19 01:11:06 2011
New Revision: 224991
URL: http://svn.freebsd.org/changeset/base/224991

Log:
  MFC r224905:
  
  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>

Modified:
  stable/8/sys/dev/arcmsr/arcmsr.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)

Modified: stable/8/sys/dev/arcmsr/arcmsr.c
==============================================================================
--- stable/8/sys/dev/arcmsr/arcmsr.c	Fri Aug 19 00:44:37 2011	(r224990)
+++ stable/8/sys/dev/arcmsr/arcmsr.c	Fri Aug 19 01:11:06 2011	(r224991)
@@ -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?201108190111.p7J1B7Gx081002>