• Chuck Lever's avatar
    xprtrdma: ->send_request returns -EAGAIN when there are no free MRs · 9e679d5e
    Chuck Lever authored
    Currently, when the MR free list is exhausted during marshaling, the
    RPC/RDMA transport places the RPC task on the delayq, which forces a
    wait for HZ >> 2 before the marshal and send is retried.
    
    With this change, the transport now places such an RPC task on the
    pending queue, and wakes it just as soon as more MRs have been
    created. Creating more MRs typically takes less than a millisecond,
    and this waking mechanism is less deadlock-prone.
    
    Moreover, the waiting RPC task is holding the transport's write
    lock, which blocks the transport from sending RPCs. Therefore faster
    recovery from MR exhaustion is desirable.
    
    This is the same mechanism that the TCP transport utilizes when
    handling write buffer space exhaustion.
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
    9e679d5e
rpc_rdma.c 37.8 KB