svn commit: r257916 - head/sys/dev/isp

Alexander Motin mav at FreeBSD.org
Sun Nov 10 13:37:45 UTC 2013


Author: mav
Date: Sun Nov 10 13:37:44 2013
New Revision: 257916
URL: http://svnweb.freebsd.org/changeset/base/257916

Log:
  Save one more register read per command by not reading rqstoutrp register
  every time.  The purpose of that register is unlikely output queue overflow
  detection, so read it only when its last known (and probably stale now)
  value signals overflow.
  
  This reduces CPU load and lock congestion and rises bottleneck in CTL
  while doing target mode via two 8Gbps ports from 100K to 120K IOPS.

Modified:
  head/sys/dev/isp/isp_library.c

Modified: head/sys/dev/isp/isp_library.c
==============================================================================
--- head/sys/dev/isp/isp_library.c	Sun Nov 10 13:16:28 2013	(r257915)
+++ head/sys/dev/isp/isp_library.c	Sun Nov 10 13:37:44 2013	(r257916)
@@ -322,9 +322,13 @@ isp_destroy_handle(ispsoftc_t *isp, uint
 void *
 isp_getrqentry(ispsoftc_t *isp)
 {
-	isp->isp_reqodx = ISP_READ(isp, isp->isp_rqstoutrp);
-	if (ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp)) == isp->isp_reqodx) {
-		return (NULL);
+	uint32_t next;
+
+	next = ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp));
+	if (next == isp->isp_reqodx) {
+		isp->isp_reqodx = ISP_READ(isp, isp->isp_rqstoutrp);
+		if (next == isp->isp_reqodx)
+			return (NULL);
 	}
 	return (ISP_QUEUE_ENTRY(isp->isp_rquest, isp->isp_reqidx));
 }


More information about the svn-src-head mailing list