nand performance

John-Mark Gurney jmg at
Thu Dec 20 20:07:39 UTC 2012

Ian Lepore wrote this message on Wed, Dec 19, 2012 at 17:41 -0700:
> I've been working to get nandfs going on a low-end Atmel arm system.
> Performance is horrible.  Last weekend I got my nand-based DreamPlug
> unbricked and got nandfs working on it too.  Performance is horrible.
> By that I'm referring not to the slow nature of the nand chips
> themselves, but to the fact that accessing them locks out userland
> processes, sometimes for many seconds at a time.  The problem is real
> easy to see, just format and populate a nandfs filesystem, then do
> something like this
>   mount -r -t nandfs /dev/gnand0s.root /mnt
>   nice +20 find /mnt -type f | xargs -J% cat % > /dev/null
> and then try to type in another terminal -- sometimes what you're typing
> doesn't get echoed for 10+ seconds a time.
> The problem is that the "I/O" on a nand chip is really just the cpu
> copying from one memory interface to another, a byte at a time, and it
> must also use busy-wait loops to wait for chip-ready and status info.
> This is being done by high-priority kernel threads, so everything else
> is locked out.
> It seems to me that this is about the same situation as classic ATA PIO
> mode, but PIO doesn't make a system that unresponsive.  
> I'm curious what techniques are used to migitate performance problems
> for ATA PIO modes, and whether we can do something similar for nand.  I
> poked around a bit in dev/ata but the PIO code I saw (which surely
> wasn't the whole picture) just used a bus_space_read_multi().  Can
> someone clue me in as to how ATA manages to do PIO without usurping the
> whole system?

Looks like the problem is all the DELAY calls in dev/nand/nand_generic.c..
DELAY is a busy wait not letting the cpu do anything else...  The bad one
is probably generic_erase_block as it looks like the default is 3ms,
plenty of time to let other code run...  If it could be interrupt driven,
that'd be best...

I can't find the interface that would allow sub-hz sleeping, but there is
tsleep that could be used for some of the larger sleeps...  But switching
to interrupts + wakeup would be best...

  John-Mark Gurney				Voice: +1 415 225 5579

     "All that I will do, has been done, All that I have, has not."

More information about the freebsd-arm mailing list