[Yaffs] Checkpointing... big mount speed up

Charles Manning manningc2 at actrix.gen.nz
Mon May 8 20:49:26 BST 2006


Hi all

Last night (my time) I checked in code to do the so-called "checkpointing" for 
YAFFS2. This stores away information in NAND which can be read quickly to 
reconstitute a file system without having to scan the whole NAND array. 
Result:way faster mount times.

I've been testing this on a Linux ARM board with 128MB of 2kpage NAND. Boot 
time for partition loaded with 2000 files each holding 50kbytes of data (ie 
100MB in use) is around 0.22 seconds. Which is between 15 and 20 times as 
fast as it was with only the lazy loading.

================ snippet from log ==============
sh-2.05a# time umount yaffs

real    0m0.080s
user    0m0.010s
sys     0m0.020s
sh-2.05a# time mount -t yaffs2 /dev/mtdblock/1 yaffs
yaffs: dev is 7937 name is "1f:01"
yaffs: Attempting MTD mount on 31.1, "1f:01"
checkpt blocks 0 20 21 999
checkpoint byte count 224532
yaffs: restored from checkpoint

real    0m0.240s
user    0m0.010s
sys     0m0.200s
sh-2.05a# df yaffs
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/mtdblock/1         125312    104812     20500  84% /mnt/yaffs
================== end snippet ===================

The code has been checked in to CVS, but the kernel makefile has not been 
updated yet because I'm currently using a hacked build. Easy to do yourself 
though: add yaffs_checkptrw.c and yaffs_nand.c to your build.

There is one twist: The checkpoint data is invalidated by any writes to the 
partition. At present, a clean unmount will refresh the checkpoint data. This 
only takes approx 0.2 seconds.

Tuning: 

The checkpoint data is saved in NAND blocks in a region specified by
dev->checkpointStartBlock to dev->checkpointEndBlock.  From yaffs_fs.c
               dev->checkpointStartBlock = 0;
                dev->checkpointEndBlock = 20;
                dev->startBlock = dev->checkpointEndBlock + 1;
                dev->endBlock = nBlocks - 1;

You can defeat the checkpointing by setting the checkpoint and main areas to 
overlap. eg:
               dev->checkpointStartBlock = 0;
                dev->checkpointEndBlock = 0;
                dev->startBlock = 0;
                dev->endBlock = nBlocks - 1;

So how many blocks doyou need to store checkpoint data? I'll add this detail 
some time... but for playing around a start number of 20 or so should be fine 
for a 128MB partition. The checkpointing data for the situation mentioned 
above only needs 225kB of data (~2 blocks) + a few more for bad blocks....

-- Charles




More information about the yaffs mailing list