Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 27 Feb 2008 13:50:33 +0100
From:      Pierre Beyssac <beyssac@enst.fr>
To:        Ivan Voras <ivoras@freebsd.org>
Cc:        freebsd-scsi@freebsd.org
Subject:   Re: iscsi initiator speed very low in FreeBSD 7
Message-ID:  <20080227125033.GA35933@bofh.enst.fr>
In-Reply-To: <fq3lrg$iun$2@ger.gmane.org>
References:  <4A66E92B3FBF8541A78CD11D1C0E3CFC491D952009@wp-ex02.hq.webpartner.dk> <20080226155813.GD75747@bofh.enst.fr> <20080226160527.GE75747@bofh.enst.fr> <fq3lrg$iun$2@ger.gmane.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Feb 27, 2008 at 01:45:35PM +0100, Ivan Voras wrote:
> > Better with the patch... :-)
> I think you need to send a file with a .txt extension for it to pass the
> spam / list filters.

Here it is inline...

--- isc_sm.c	2007-07-24 17:35:02.000000000 +0200
+++ /tmp/isc_sm.c	2008-02-26 16:53:54.000000000 +0100
@@ -325,7 +325,9 @@
 	  mtx_unlock(&sp->io_mtx);	// XXX
      }
 #else
+     mtx_lock(&sp->io_mtx);	// XXX
      wakeup(&sp->flags);
+     mtx_unlock(&sp->io_mtx);	// XXX
 #endif
      return error;
 }
@@ -454,6 +456,11 @@
      }
 }
 
+/*
+ * Should be called with sp->io_mtx held to avoid race condition
+ * on queue empty.
+ * Returns with sp->io_mtx held.
+ */
 static int
 proc_out(isc_session_t *sp)
 {
@@ -481,6 +488,8 @@
 	  if((pq = i_dqueue_snd(sp, which)) == NULL)
 	       break;
 
+	  mtx_unlock(&sp->io_mtx);
+
 	  pp = &pq->pdu;
 	  bhs = &pp->ipdu.bhs;
 	  switch(bhs->opcode) {
@@ -523,6 +532,8 @@
 	       xdebug("error=%d ndone=%d opcode=0x%x ccb=%p itt=%x",
 		      error, ndone, bhs->opcode, pq->ccb, ntohl(bhs->itt));
 	       if(error == EPIPE) {
+		    pdu_free(sp->isc, pq);
+		    mtx_lock(&sp->io_mtx);
 		    // XXX: better do some error recovery ...
 		    break;
 	       }
@@ -540,6 +551,7 @@
 	  }
 	  if(pq->ccb == NULL || error)
 	       pdu_free(sp->isc, pq);
+	  mtx_lock(&sp->io_mtx);
      }
      return ndone;
 }
@@ -558,13 +570,13 @@
 
      sp->flags |= ISC_SM_RUNNING;
      do {
+	  mtx_lock(&sp->io_mtx);
 	  if(sp->flags & ISC_SM_HOLD)
 	       odone = 0;
 	  else
 	       odone = proc_out(sp);
 	  sdebug(7, "odone=%d", odone);
 	  if(odone == 0) {
-	       mtx_lock(&sp->io_mtx);
 #ifdef ISC_OWAITING
 	       sp->flags |= ISC_OWAITING;
 #endif
@@ -574,8 +586,8 @@
 #ifdef ISC_OWAITING
 	       sp->flags &= ~ISC_OWAITING;
 #endif
-	       mtx_unlock(&sp->io_mtx);
 	  }
+	  mtx_unlock(&sp->io_mtx);
      } while(sp->flags & ISC_SM_RUN);
 
      sp->flags &= ~ISC_SM_RUNNING;
-- 
A: Yes.					  Pierre Beyssac pb@enst.fr
>Q: Are you sure?
>>A: Because it reverses the logical flow of conversation.
>>>Q: Why is top posting annoying in email?



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