From mboxrd@z Thu Jan 1 00:00:00 1970 From: James.Bottomley@HansenPartnership.com (James Bottomley) Date: Fri, 07 Jan 2011 13:11:07 -0600 Subject: still nfs problems [Was: Linux 2.6.37-rc8] In-Reply-To: <20110107190229.GX31708@n2100.arm.linux.org.uk> References: <20110105210448.GM8638@n2100.arm.linux.org.uk> <1294262208.2952.4.camel@heimdal.trondhjem.org> <1294268808.2952.18.camel@heimdal.trondhjem.org> <1294270104.16957.73.camel@mulgrave.site> <1294335614.22825.154.camel@mulgrave.site> <1294336054.2905.1.camel@heimdal.trondhjem.org> <1294426405.2929.23.camel@heimdal.trondhjem.org> <20110107190229.GX31708@n2100.arm.linux.org.uk> Message-ID: <1294427467.4895.66.camel@mulgrave.site> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Fri, 2011-01-07 at 19:02 +0000, Russell King - ARM Linux wrote: > On Fri, Jan 07, 2011 at 01:53:25PM -0500, Trond Myklebust wrote: > > I'd still like to keep the existing code for those architectures that > > don't have problems, since that allows us to send 32k READDIR requests > > instead of being limited to 4k. For large directories, that is a clear > > win. > > For the NOMMU case we will just go back to using a single page for > > storage (and 4k READDIR requests only). Should I just do the same for > > architectures like ARM and PARISC? > > I think you said that readdir reads via the vmalloc mapping of the > group of pages, but XDR writes to the individual pages. Actually it's the other way around, but the point still stands. > As I understand NFS, you receive a packet, you then have to use XDR > to unpack the data, which you presumably write into the set of > struct page *'s using kmap? > > Isn't a solution to have XDR write directly into the vmalloc mapping > rather than using struct page * and kmap? So, unfortuantely, I looked at doing this and we can't. the ->readdir() call takes an array of pages, not a kernel virtual address of the pages, so there's no way to tell it to use a different mapping from the usual kernel one on them. On the other hand, the xdr routines, since they take the pages anyway, could use a scatterlist approach to writing through the kernel mapping instead of using vmap ... we have all the machinery for this in lib/scatterlist.c ... it's not designed for this case, since it's designed to allow arbitrary linear reads and writes on a block scatterlist, but the principle is the same ... it looks like it would be rather a big patch, though ... James