• Chuck Lever's avatar
    svcrdma: Implement multi-stage Read completion again · d3dba534
    Chuck Lever authored
    Having an nfsd thread waiting for an RDMA Read completion is
    problematic if the Read responder (ie, the client) stops responding.
    We need to go back to handling RDMA Reads by getting the svc scheduler
    to call svc_rdma_recvfrom() a second time to finish building an RPC
    message after a Read completion.
    
    This is the final patch, and makes several changes that have to
    happen concurrently:
    
    1. svc_rdma_process_read_list no longer waits for a completion, but
       simply builds and posts the Read WRs.
    
    2. svc_rdma_read_done() now queues a completed Read on
       sc_read_complete_q for later processing rather than calling
       complete().
    
    3. The completed RPC message is no longer built in the
       svc_rdma_process_read_list() path. Finishing the message is now
       done in svc_rdma_recvfrom() when it notices work on the
       sc_read_complete_q. The "finish building this RPC message" code
       is removed from the svc_rdma_process_read_list() path.
    
    This arrangement avoids the need for an nfsd thread to wait for an
    RDMA Read non-interruptibly without a timeout. It's basically the
    same code structure that Tom Tucker used for Read chunks along with
    some clean-up and modernization.
    Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    d3dba534
svc_rdma_rw.c 30.3 KB