[Yaffs] Re: performans off YAFFS1 on NOR flash

Charles Manning manningc2 at actrix.gen.nz
Thu Oct 13 02:10:14 BST 2005


The main reason for this is that YAFFS is primarily designed for NAND, not 
NOR. NOR can be made to work, but there have always been expected to be 
performance issues.

All, or at least most of, the YAFFS NOR performance issues could be made to go 
away with some effort. Since YAFFS's niche is mainly the larger (32MB+) NAND 
array, little effort has been put into tuning YAFFS for NOR. 

Most of the performance issues on NOR boil down to the slow write performance 
and erase performance in NOR. With NAND, the faster write and erase meant 
that gross locking could be used instead, allowing much simpler locking 
strategies.

To make NOR work better, there are a few things that could be done:
1) Asynchronous erasure. Currently YAFFS just does its erasures synchronously 
because that is all that NAND supports. Secondly, NAND erasure is fast (2msec 
vs 1sec for NOR). Asynchronous erasure means two things:
a.) Firstly decouple the erasure. Currently YAFFS erases flash as soon as it 
becomes available to erase. Instead, the dirty blocks could be put on a list 
for subsequent erasure.
b) Use of erase suspend. This allows the erasures to be interrupted by other 
read/write activities, then restarted.

2) Running a background gc thread. Currently gc is done as a parasitic 
activity as part of any write operation. This means that any operations that 
cause garbage to be created slow down subsequent write operations. Again, 
this is not a big issue with NAND. Doing more gc while the file system is 
inactive (from a user/application point of view) would give the applications 
a better run at writing etc since less gc would be done during the actual 
writes.

3) The use of finer grain locking could potentially improve the situation for 
NOR too. This would allow multi-process reads while writing is blocked by 
gc/writing.

4) Tuning gc for NOR rather than NAND.

While all these things **can** be done, I would not want to do anything that 
impacts on YAFFS' NAND performance, since YAFFS is primarily a NAND fs.

More below:

On Thursday 13 October 2005 12:04, Peter Barada wrote:
> I started with YAFFS from CVS back on 2005-05-26, and have made YAFFS
> work on a 547x running linux-2.4.26 targeting Intel strata-flash (32Mb,
> 0x20000 block size), using 512 byte chunks and creating a spare area at
> the end of each flash block so I get 248 chunks per flash block
> (131072 / (512 + 16)), and I have it all working.

> What I'm finding however is that its performance as a filesystem can at
> times be abysmal.  I'm not sure why, but I'm finding cases where the
> gross lock is held in excess of a *minute* which causes other processes
> that access the filesystem to block.  This was observed while copying
> 2.3MB of data from /lib into the flash, and at the same time doing a
> 'du' of the flash filesystem.
>
> To make matters worse, the code in yaffs_GrossLock() uses down() instead
> of down_interruptible() which makes it impossible to interrupt any
> processes waiting for the lock.
>
> 1) Has anyone patched Yaffs to use down_interruptible() instead of
> 'down'?

My POSIXness is not the best by any means, but I have a hunch that regular 
file writes (as opposed to special character devices) may not be interrupted.

>
> I've instrumented yaffs_grossLock/yaffs_grossUnlock to discern where the
> time goes, and turned nShortOpCache to zero
>
> [root at localhost root]# cp /lib/libc* /mnt/flash-user/junk/
> yaffs_GrossLockPriv: blocked by yaffs_file_write:806
> yaffs_GrossLockPriv: blocked by yaffs_file_write:806
> yaffs_GrossLockPriv: blocked by yaffs_file_write:806
>
> [root at localhost root]# rm /mnt/flash-user/junk/*
> yaffs_GrossUnlock: lock held by yaffs_unlink:1053 for 4 jiffies
> [root at localhost root]# cp /lib/libc* /mnt/flash-user/junk/
> yaffs_GrossUnlock: lock held by yaffs_file_write:806 for 78 jiffies
> yaffs_GrossLockPriv: blocked by yaffs_file_write:806
> yaffs_GrossLockPriv: yaffs_readdir:871 wait 21297 jiffies by
> yaffs_file_flush:488
> [root at localhost root]#
>
>
> Notices that the file flush holds the lock for over three *MINUTES*.


This seems rather odd. If there was no cache (nShortOpCache==0), then all that 
gets done is updating the object header. This is only one write + whatever 
gc.

The other part of this is that it is hard to determine what is also going on 
in the mtd layer. Any yaffs locking will get stuck behind any locking on the 
nor device.

>
> 2) Is there anyway to more finely lock YAFFS instead of the gross lock
> that exists now?
> 3)  How can yaffs_file_flush take *so* long is nShortOpCache is set to
> zero so yaffs_FlushFilesChunkCache should take no time?

Agreed. That does seem rather bizarre. Did the real-world time match the 
instrumenting?

> 4)  Has anyone seen this type of problem on other NOR-based YAFFS
> implementations?

Feedback will be interesting...

-- Charles




More information about the yaffs mailing list