Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 20 Dec 2012 12:07:28 -0800
From:      John-Mark Gurney <jmg@funkthat.com>
To:        Ian Lepore <freebsd@damnhippie.dyndns.org>
Cc:        freebsd-arm@freebsd.org
Subject:   Re: nand performance
Message-ID:  <20121220200728.GK1563@funkthat.com>
In-Reply-To: <1355964085.1198.255.camel@revolution.hippie.lan>
References:  <1355964085.1198.255.camel@revolution.hippie.lan>

next in thread | previous in thread | raw e-mail | index | archive | help
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."



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20121220200728.GK1563>