• NeilBrown's avatar
    NFS: fix usage of mempools. · 518662e0
    NeilBrown authored
    When passed GFP flags that allow sleeping (such as
    GFP_NOIO), mempool_alloc() will never return NULL, it will
    wait until memory is available.
    
    This means that we don't need to handle failure, but that we
    do need to ensure one thread doesn't call mempool_alloc()
    twice on the one pool without queuing or freeing the first
    allocation.  If multiple threads did this during times of
    high memory pressure, the pool could be exhausted and a
    deadlock could result.
    
    pnfs_generic_alloc_ds_commits() attempts to allocate from
    the nfs_commit_mempool while already holding an allocation
    from that pool.  This is not safe.  So change
    nfs_commitdata_alloc() to take a flag that indicates whether
    failure is acceptable.
    
    In pnfs_generic_alloc_ds_commits(), accept failure and
    handle it as we currently do.  Else where, do not accept
    failure, and do not handle it.
    
    Even when failure is acceptable, we want to succeed if
    possible.  That means both
     - using an entry from the pool if there is one
     - waiting for direct reclaim is there isn't.
    
    We call mempool_alloc(GFP_NOWAIT) to achieve the first, then
    kmem_cache_alloc(GFP_NOIO|__GFP_NORETRY) to achieve the
    second.  Each of these can fail, but together they do the
    best they can without blocking indefinitely.
    
    The objects returned by kmem_cache_alloc() will still be freed
    by mempool_free().  This is safe as mempool_alloc() uses
    exactly the same function to allocate objects (since the mempool
    was created with mempool_create_slab_pool()).  The object returned
    by mempool_alloc() and kmem_cache_alloc() are indistinguishable
    so mempool_free() will handle both identically, either adding to the
    pool or calling kmem_cache_free().
    
    Also, don't test for failure when allocating from
    nfs_wdata_mempool.
    Signed-off-by: default avatarNeilBrown <neilb@suse.com>
    Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
    518662e0
pnfs_nfs.c 23.9 KB