yaffs: Add yaffs direct code for tracking flash traffic
authorCharles Manning <cdhmanning@gmail.com>
Thu, 19 Aug 2010 23:56:12 +0000 (11:56 +1200)
committerCharles Manning <cdhmanning@gmail.com>
Thu, 19 Aug 2010 23:56:12 +0000 (11:56 +1200)
Helps for accessing gc overheads.

Signed-off-by: Charles Manning <cdhmanning@gmail.com>
direct/basic-test/dtest.c
direct/basic-test/yaffsnewcfg.c
direct/yaffsfs.c
direct/yaffsfs.h

index b9fc0eafe0fd36c3e6bbbd34a41eb357da6e37c4..3ac5604284dbd3c3a577aabc19c48d47f9685861 100644 (file)
@@ -22,6 +22,9 @@
 
 #include "yaffsfs.h"
 
 
 #include "yaffsfs.h"
 
+#include "yaffs_guts.h" /* Only for dumping device innards */
+
+extern int yaffs_traceMask;
 
 void dumpDir(const char *dname);
 
 
 void dumpDir(const char *dname);
 
@@ -177,21 +180,22 @@ void create_file_of_size(const char *fn,int syze)
        int h;
        int n;
        int result;
        int h;
        int n;
        int result;
-       
+       int iteration = 0;
        char xx[200];
        char xx[200];
-       
-       int iterations = (syze + strlen(fn) -1)/ strlen(fn);
-       
+
        h = yaffs_open(fn, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE);
                
        h = yaffs_open(fn, O_CREAT | O_RDWR | O_TRUNC, S_IREAD | S_IWRITE);
                
-       while (iterations > 0)
+       while (syze > 0)
        {
        {
-               sprintf(xx,"%s %8d",fn,iterations);
+               sprintf(xx,"%s %8d",fn,iteration);
                n = strlen(xx);
                result = yaffs_write(h,xx,n);
                n = strlen(xx);
                result = yaffs_write(h,xx,n);
-               if(result != n)
-                       printf("Wrote %d, should have been %d\n",result,n);
-               iterations--;
+               if(result != n){
+                       printf("Wrote %d, should have been %d. syze is %d\n",result,n,syze);
+                       syze = 0;
+               } else
+                       syze-=n;
+               iteration++;
        }
        yaffs_close (h);
 }
        }
        yaffs_close (h);
 }
@@ -2639,7 +2643,48 @@ void big_xattr_test(const char *mountpt)
        list_xattr(name);
 
 }
        list_xattr(name);
 
 }
+
+
+void dump_dev_stats(yaffs_Device *dev, const char * str)
+{
+       printf("%s\n",str);
+       printf( "space free %d erased %d "
+               "nand reads %d writes %d erases %d "
+               "gc all %d passive %d oldestdirty %d blocks %d copies %d \n",
+               dev->nFreeChunks, dev->nErasedBlocks * dev->param.nChunksPerBlock,
+               dev->nPageReads, dev->nPageWrites, dev->nBlockErasures,
+               dev->allGCs, dev->passiveGCs, dev->oldestDirtyGCs, dev->nGCBlocks, dev->nGCCopies);
+}
+
+void test_flash_traffic(const char *mountpt)
+{
+       char name0[100];
+       char name1[100];
+       int i;
+       yaffs_Device *dev;
+
+       yaffs_traceMask = 0;
+
+       yaffs_StartUp();
+
+       yaffs_mount(mountpt);
        
        
+       dev = yaffs_getdev(mountpt);
+
+       strcpy(name0,mountpt);
+       strcat(name0,"/x");
+
+       strcpy(name1,mountpt);
+       strcat(name1,"/y");
+
+       dump_dev_stats(dev,"start");
+       create_file_of_size(name0,32 * 1024 * 1024);
+       dump_dev_stats(dev,"32MB written");
+       for(i = 0; i < 20; i++)
+               create_file_of_size(name1,1024 * 1024);
+       dump_dev_stats(dev,"20x 1MB files written");
+
+}
 
 int random_seed;
 int simulate_power_failure;
 
 int random_seed;
 int simulate_power_failure;
@@ -2693,9 +2738,6 @@ int main(int argc, char *argv[])
        
        //link_test("/flash/flash");
        
        
        //link_test("/flash/flash");
        
-       
-       
-       
        // cache_bypass_bug_test();
        
         //free_space_check();
        // cache_bypass_bug_test();
        
         //free_space_check();
@@ -2705,7 +2747,9 @@ int main(int argc, char *argv[])
         //basic_xattr_test("/yaffs2");
         //big_xattr_test("/yaffs2");
 
         //basic_xattr_test("/yaffs2");
         //big_xattr_test("/yaffs2");
 
-        null_name_test("yaffs2");
+        //null_name_test("yaffs2");
+
+        test_flash_traffic("yaffs2");
 
         return 0;
        
 
         return 0;
        
index 6ee43b78137cc454b05d342f7445742488212d93..fa993421caa4f8529c5f5d811b0092bab4f01193 100644 (file)
@@ -101,7 +101,7 @@ int yaffs_StartUp(void)
        // Stuff to configure YAFFS
        // Stuff to initialise anything special (eg lock semaphore).
        yaffsfs_LocalInitialisation();
        // Stuff to configure YAFFS
        // Stuff to initialise anything special (eg lock semaphore).
        yaffsfs_LocalInitialisation();
-       yramsim_CreateRamSim("yaffs2",1,200,0,0);
+       yramsim_CreateRamSim("yaffs2",1,1000,0,0);
        yramsim_CreateRamSim("p0",0,0x400,1,0xff);
        yramsim_CreateRamSim("p1",0,0x400,1,0);
        
        yramsim_CreateRamSim("p0",0,0x400,1,0xff);
        yramsim_CreateRamSim("p1",0,0x400,1,0);
        
index b93f29534962ac909489f81cfcfd91a17532fdd1..d9be4907e2064d5d1f3d8d76ff2f9632fa43c272 100644 (file)
@@ -1660,6 +1660,14 @@ int yaffs_mkdir(const YCHAR *path, mode_t mode)
        return retVal;
 }
 
        return retVal;
 }
 
+void * yaffs_getdev(const YCHAR *path)
+{
+       yaffs_Device *dev=NULL;
+       YCHAR *dummy;
+       dev = yaffsfs_FindDevice(path,&dummy);
+       return (void *)dev;
+}
+
 int yaffs_mount2(const YCHAR *path,int readOnly)
 {
        int retVal=-1;
 int yaffs_mount2(const YCHAR *path,int readOnly)
 {
        int retVal=-1;
index 7961dff71ced4719bea2f5ed28bd9d40a0f970dd..4b2ebe94176c8c29e164a840a07bf226230710cd 100644 (file)
@@ -164,6 +164,10 @@ void yaffs_AddDevice(struct yaffs_DeviceStruct *dev);
 
 int yaffs_StartUp(void);
 
 
 int yaffs_StartUp(void);
 
+
+/* Function only for debugging */
+void * yaffs_getdev(const YCHAR *path);
+
 #endif
 
 
 #endif