svn commit: r224905 - head/sys/dev/arcmsr
Xin LI
delphij at FreeBSD.org
Tue Aug 16 08:41:38 UTC 2011
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);
}
/*
More information about the svn-src-all
mailing list