nand performance

Ian Lepore freebsd at
Thu Dec 20 00:41:36 UTC 2012

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?

-- Ian

More information about the freebsd-arm mailing list