Testers with sili(4) hardware needed

Francois Tigeot ftigeot at wolfpond.org
Mon May 6 03:43:52 PDT 2013


Hi,

I'm trying to make sure the Silicon Image SATA chipsets can properly
handle I/O requests of 256KB (their apparent theoretical limit). 

If you use this hardware, could you please apply the attached patch and
report your findings ?

Running this command as root will generate 256KB I/O requests:

    dd if=/dev/da0 of=/dev/null bs=1m count=10k

I'm also interested if there is any issue in the course of regular
operation.

Thanks!

-- 
Francois Tigeot
-------------- next part --------------
diff --git a/sys/cpu/i386/include/param.h b/sys/cpu/i386/include/param.h
index d6547ce..2f48017 100644
--- a/sys/cpu/i386/include/param.h
+++ b/sys/cpu/i386/include/param.h
@@ -121,7 +121,7 @@
 #define BLKDEV_IOSIZE	PAGE_SIZE	/* default block device I/O size */
 #endif
 #define DFLTPHYS	(64 * 1024)	/* default max raw I/O transfer size */
-#define MAXPHYS		(128 * 1024)	/* max raw I/O transfer size */
+#define MAXPHYS		(256 * 1024)	/* max raw I/O transfer size */
 #define MAXDUMPPGS	(MAXPHYS/PAGE_SIZE)
 
 #define IOPAGES	2		/* pages of i/o permission bitmap */
diff --git a/sys/cpu/x86_64/include/param.h b/sys/cpu/x86_64/include/param.h
index 15a489d..23a5e04 100644
--- a/sys/cpu/x86_64/include/param.h
+++ b/sys/cpu/x86_64/include/param.h
@@ -143,7 +143,7 @@
 #define BLKDEV_IOSIZE	PAGE_SIZE	/* default block device I/O size */
 #endif
 #define DFLTPHYS	(64 * 1024)	/* default max raw I/O transfer size */
-#define MAXPHYS		(128 * 1024)	/* max raw I/O transfer size */
+#define MAXPHYS		(256 * 1024)	/* max raw I/O transfer size */
 #define MAXDUMPPGS	(MAXPHYS/PAGE_SIZE)
 
 #define IOPAGES	2		/* pages of i/o permission bitmap */
diff --git a/sys/dev/disk/sili/sili.h b/sys/dev/disk/sili/sili.h
index 8f89419..6ce701a 100644
--- a/sys/dev/disk/sili/sili.h
+++ b/sys/dev/disk/sili/sili.h
@@ -629,18 +629,19 @@ struct sili_sge {
 #define SILI_SGE_FLAGS_XCF	0x10000000	/* external cmd fetch	*/
 
 /*
- * Each sge is 16 bytes.  We need to accomodate MAXPHYS (128K) which is
- * at least 32 entries, plus one for page slop, plus one more for every
- * 3 entries for the link entry.
+ * Each sge is 16 bytes.
  *
  * We want our prb structure to be power-of-2 aligned (it is required to be
  * at least 8-byte aligned).  the prb base header is 4 SGE's but includes 2
  * SGE's within it.
+ * The prb structure also can't cross a 64KB boundary, and thus can only
+ * have a maximum size of 65536 / 16 / 32  == ~128 entries (128 - 4)
  */
-#define SILI_MAX_SGET		(64 - 4)
+#define SILI_MAX_SGET		(128 - 4)
 #define SILI_MAX_PMPORTS	16
+#define SILI_MAXPHYS		(256 * 1024)	/* 256 KB */
 
-#if MAXPHYS / PAGE_SIZE + 1 > (SILI_MAX_SGET * 3 / 4)
+#if SILI_MAXPHYS / PAGE_SIZE + 1 > (SILI_MAX_SGET * 3 / 4)
 #error "SILI_MAX_SGET is not big enough"
 #endif
 
diff --git a/sys/dev/disk/sili/sili_cam.c b/sys/dev/disk/sili/sili_cam.c
index cd6e69f..99fc1c8 100644
--- a/sys/dev/disk/sili/sili_cam.c
+++ b/sys/dev/disk/sili/sili_cam.c
@@ -872,6 +872,7 @@ sili_xpt_action(struct cam_sim *sim, union ccb *ccb)
 		ccb->cpi.transport_version = 1;
 		ccb->cpi.protocol = PROTO_SCSI;
 		ccb->cpi.protocol_version = SCSI_REV_2;
+		ccb->cpi.maxio = SILI_MAXPHYS;
 
 		ccbh->status = CAM_REQ_CMP;
 		if (ccbh->target_id == CAM_TARGET_WILDCARD) {


More information about the Kernel mailing list