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);
 }
 /*
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to