nfs pessimized by vnode pages changes
Gleb Smirnoff
glebius at FreeBSD.org
Tue Mar 29 03:03:49 UTC 2016
On Tue, Mar 29, 2016 at 01:24:27PM +1100, Bruce Evans wrote:
B> > On Tue, Mar 29, 2016 at 10:59:26AM +1100, Bruce Evans wrote:
B> > ...
B> >
B> > B> I couldn't get full-fs-block input to work right in ncl_getpages(). In
B> > B> the old version, vm_fault_hold() almost always calls it with the pages
B> > B> for exactly 1 full block, because vm_fault_additional_pages() somehow
B> > B> finds this many pages.
B> >
B> > The last quoted paragraph is a correct observation. According to your
B> > investigations, prior to r292373 NFS was doing multiple page pageins,
B> > despite it should have reported that it can't. My reading of the code
B> > is the same: both before r292373 and after r292373 NFS should page in
B> > a single page at request. I quickly reviewed the whole codepath and I
B> > can't see how with older code it was able to do multiple page pageins.
B>
B> I found it. In old versions, vm_fault_additional_pages() exists and
B> calls vnode_pager_haspage() to locate some additional pages.
B> VOP_BMAP() is vop_stdbmap() for nfs. This doesn't locate any
B> additional fs blocks, but vnode_pager_haspage() locates the page within
B> the single nfs block and returns the number of pages to read behind and
B> ahead to fill in the block.
Ah. I also looked at stdbmap, but missed that it doesn't actually return
error value.
I will come up with a patch.
B> Probably similarly in most file systems that don't really support bmap.
B> They can always use vop_stdbmap(). Probably they mostly do, so the
B> fallback code for when VOP_BMAP() fails is mostly unreachable.
--
Totus tuus, Glebius.
More information about the freebsd-fs
mailing list