[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