• C
    NFS: Eliminate nfs_get_user_pages() · 06cf6f2e
    Chuck Lever 提交于
    Neil Brown observed that the kmalloc() in nfs_get_user_pages() is more
    likely to fail if the I/O is large enough to require the allocation of more
    than a single page to keep track of all the pinned pages in the user's
    buffer.
    
    Instead of tracking one large page array per dreq/iocb, track pages per
    nfs_read/write_data, just like the cached I/O path does.  An array for
    pages is already allocated for us by nfs_readdata_alloc() (and the write
    and commit equivalents).
    
    This is also required for adding support for vectored I/O to the NFS direct
    I/O path.
    
    The original reason to pin the user buffer and allocate all the NFS data
    structures before trying to schedule I/O was to ensure all needed resources
    are allocated on the client before starting to send requests.  This reduces
    the chance that resource exhaustion on the client will cause a short read
    or write.
    
    On the other hand, for an application making very large application I/O
    requests, this means that it will be nearly impossible for the application
    to make forward progress on a resource-limited client.
    
    Thus, moving the buffer pinning functionality into the I/O scheduling
    loops should be good for scalability.  The next patch will do the same for
    NFS data structure allocation.
    Signed-off-by: NChuck Lever <cel@netapp.com>
    Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
    06cf6f2e
direct.c 26.0 KB