• NeilBrown's avatar
    SUNRPC: improve 'swap' handling: scheduling and PF_MEMALLOC · 8db55a03
    NeilBrown authored
    rpc tasks can be marked as RPC_TASK_SWAPPER.  This causes GFP_MEMALLOC
    to be used for some allocations.  This is needed in some cases, but not
    in all where it is currently provided, and in some where it isn't
    provided.
    
    Currently *all* tasks associated with a rpc_client on which swap is
    enabled get the flag and hence some GFP_MEMALLOC support.
    
    GFP_MEMALLOC is provided for ->buf_alloc() but only swap-writes need it.
    However xdr_alloc_bvec does not get GFP_MEMALLOC - though it often does
    need it.
    
    xdr_alloc_bvec is called while the XPRT_LOCK is held.  If this blocks,
    then it blocks all other queued tasks.  So this allocation needs
    GFP_MEMALLOC for *all* requests, not just writes, when the xprt is used
    for any swap writes.
    
    Similarly, if the transport is not connected, that will block all
    requests including swap writes, so memory allocations should get
    GFP_MEMALLOC if swap writes are possible.
    
    So with this patch:
     1/ we ONLY set RPC_TASK_SWAPPER for swap writes.
     2/ __rpc_execute() sets PF_MEMALLOC while handling any task
        with RPC_TASK_SWAPPER set, or when handling any task that
        holds the XPRT_LOCKED lock on an xprt used for swap.
        This removes the need for the RPC_IS_SWAPPER() test
        in ->buf_alloc handlers.
     3/ xprt_prepare_transmit() sets PF_MEMALLOC after locking
        any task to a swapper xprt.  __rpc_execute() will clear it.
     3/ PF_MEMALLOC is set for all the connect workers.
    
    Reviewed-by: Chuck Lever <chuck.lever@oracle.com> (for xprtrdma parts)
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
    8db55a03
xprt.c 53.6 KB