• Chuck Lever's avatar
    xprtrdma: Introduce ->alloc_slot call-out for xprtrdma · 48be539d
    Chuck Lever authored
    rpcrdma_buffer_get acquires an rpcrdma_req and rep for each RPC.
    Currently this is done in the call_allocate action, and sometimes it
    can fail if there are many outstanding RPCs.
    
    When call_allocate fails, the RPC task is put on the delayq. It is
    awoken a few milliseconds later, but there's no guarantee it will
    get a buffer at that time. The RPC task can be repeatedly put back
    to sleep or even starved.
    
    The call_allocate action should rarely fail. The delayq mechanism is
    not meant to deal with transport congestion.
    
    In the current sunrpc stack, there is a friendlier way to deal with
    this situation. These objects are actually tantamount to an RPC
    slot (rpc_rqst) and there is a separate FSM action, distinct from
    call_allocate, for allocating slot resources. This is the
    call_reserve action.
    
    When allocation fails during this action, the RPC is placed on the
    transport's backlog queue. The backlog mechanism provides a stronger
    guarantee that when the RPC is awoken, a buffer will be available
    for it; and backlogged RPCs are awoken one-at-a-time.
    
    To make slot resource allocation occur in the call_reserve action,
    create special ->alloc_slot and ->free_slot call-outs for xprtrdma.
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
    48be539d
transport.c 24.7 KB