[Yaffs] [PATCH] Optional support for larger tnode structure (speeds up big NAND chips)

Andre Renaud andre at bluewatersys.com
Mon Nov 14 21:41:38 GMT 2005


I'm not 100% sure about this patch - it changes the tnode/level0
structure around a bit to try and lessen the need for chunkgroups on
large cards.

The patch probably isn't suitable to go straight in, but if someone has
some comments on it, that would be good.

With this patch our random read speed on 512MB NAND chips increased from
500kB/s to 710kB/s.

Thanks,
Andre
-- 
Bluewater Systems Ltd - ARM Technology Solutions Centre

       Andre Renaud                             Bluewater Systems Ltd
Phone: +64 3 3779127 (Aus 1 800 148 751)        Level 17, 119 Armagh St
Fax:   +64 3 3779135                            PO Box 13889
Email: arenaud at bluewatersys.com                 Christchurch
Web:   http://www.bluewatersys.com              New Zealand
-------------- next part --------------
--- /home/andre/snapper/yaffs2/Kconfig	2005-09-22 03:16:59.000000000 +1200
+++ Kconfig	2005-11-15 10:37:36.000000000 +1300
@@ -80,3 +80,14 @@
 	  but makes look-ups faster.
 
 	  If unsure, say Y.
+
+config YAFFS_TNODE_LARGE_NAND
+	bool "Optimise for large NAND devices"
+	depends on YAFFS_FS
+	default n
+	help
+	  If this config is set, then the memory structure will be optimised
+	  for large NAND devices (> 64MB). This uses more memory, but speeds
+	  up access significantly on large devices.
+
+	  If unsure, say N.
--- /home/andre/snapper/yaffs2/yaffs_guts.c	2005-11-09 15:13:58.000000000 +1300
+++ yaffs_guts.c	2005-11-15 10:36:35.000000000 +1300
@@ -5409,14 +5409,17 @@
 	if (extraBits > 0)
 		bits++;
 
-	/* Level0 Tnodes are 16 bits, so if the bitwidth of the
-	 * chunk range we're using is greater than 16 we need
+	/* Level0 Tnodes are YAFFS_TNODES_LEVEL0_WIDTH bits, so if the bitwidth of the
+	 * chunk range we're using is greater than YAFFS_TNODES_LEVEL0_WIDTH we need
 	 * to figure out chunk shift and chunkGroupSize
 	 */
-	if (bits <= 16) {
+	if (bits <= YAFFS_TNODES_LEVEL0_WIDTH) {
 		dev->chunkGroupBits = 0;
 	} else {
-		dev->chunkGroupBits = bits - 16;
+		dev->chunkGroupBits = bits - YAFFS_TNODES_LEVEL0_WIDTH;
+                T(YAFFS_TRACE_ALWAYS,
+                      (TSTR("yaffs: performance warning, chunkGroupBits: %d\n" TENDSTR),
+                       dev->chunkGroupBits));
 	}
 
 	dev->chunkGroupSize = 1 << dev->chunkGroupBits;
@@ -5657,7 +5660,7 @@
 /*      yaffs_CheckStruct(yaffs_TagsUnion,8,"yaffs_TagsUnion") */
 /*      yaffs_CheckStruct(yaffs_Spare,16,"yaffs_Spare") */
 #ifndef CONFIG_YAFFS_TNODE_LIST_DEBUG
-	yaffs_CheckStruct(yaffs_Tnode, 2 * YAFFS_NTNODES_LEVEL0, "yaffs_Tnode")
+	yaffs_CheckStruct(yaffs_Tnode, (YAFFS_TNODES_LEVEL0_WIDTH / 8) * YAFFS_NTNODES_LEVEL0, "yaffs_Tnode")
 #endif
 	    yaffs_CheckStruct(yaffs_ObjectHeader, 512, "yaffs_ObjectHeader")
 
--- /home/andre/snapper/yaffs2/yaffs_guts.h	2005-10-09 20:55:00.000000000 +1300
+++ yaffs_guts.h	2005-11-15 10:12:58.000000000 +1300
@@ -34,14 +34,28 @@
  */
 #define YAFFS_MAGIC			0x5941FF53
 
+#ifdef CONFIG_YAFFS_TNODE_LARGE_NAND
+#define YAFFS_NTNODES_LEVEL0		8
+#define YAFFS_TNODES_LEVEL0_BITS	3
+#define YAFFS_TNODES_LEVEL0_MASK	0x7
+#define YAFFS_TNODES_LEVEL0_TYPE	__u32
+
+#define YAFFS_NTNODES_INTERNAL 		8
+#define YAFFS_TNODES_INTERNAL_BITS 	3
+#define YAFFS_TNODES_INTERNAL_MASK	0x7
+#define YAFFS_TNODES_MAX_LEVEL		6
+#else
 #define YAFFS_NTNODES_LEVEL0	  	16
 #define YAFFS_TNODES_LEVEL0_BITS	4
 #define YAFFS_TNODES_LEVEL0_MASK	0xf
+#define YAFFS_TNODES_LEVEL0_TYPE	__u16
 
 #define YAFFS_NTNODES_INTERNAL 		(YAFFS_NTNODES_LEVEL0 / 2)
 #define YAFFS_TNODES_INTERNAL_BITS 	(YAFFS_TNODES_LEVEL0_BITS - 1)
 #define YAFFS_TNODES_INTERNAL_MASK	0x7
 #define YAFFS_TNODES_MAX_LEVEL		6
+#endif
+#define YAFFS_TNODES_LEVEL0_WIDTH	(sizeof(YAFFS_TNODES_LEVEL0_TYPE) * 8)
 
 #ifndef CONFIG_YAFFS_NO_YAFFS1
 #define YAFFS_BYTES_PER_SPARE		16
@@ -325,7 +339,7 @@
 #else
 	union yaffs_Tnode_union *internal[YAFFS_NTNODES_INTERNAL];
 #endif
-	__u16 level0[YAFFS_NTNODES_LEVEL0];
+	YAFFS_TNODES_LEVEL0_TYPE level0[YAFFS_NTNODES_LEVEL0];
 
 };
 


More information about the yaffs mailing list