Date: Wed, 19 Dec 2012 17:41:25 -0700 From: Ian Lepore <freebsd@damnhippie.dyndns.org> To: freebsd-arm@freebsd.org Subject: nand performance Message-ID: <1355964085.1198.255.camel@revolution.hippie.lan>
next in thread | raw e-mail | index | archive | help
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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1355964085.1198.255.camel>