• Chuck Lever's avatar
    xprtrdma: Re-write rpcrdma_flush_cqs() · 5c166bef
    Chuck Lever authored
    Currently rpcrdma_flush_cqs() attempts to avoid code duplication,
    and simply invokes rpcrdma_recvcq_upcall and rpcrdma_sendcq_upcall.
    
    1. rpcrdma_flush_cqs() can run concurrently with provider upcalls.
       Both flush_cqs() and the upcalls were invoking ib_poll_cq() in
       different threads using the same wc buffers (ep->rep_recv_wcs
       and ep->rep_send_wcs), added by commit 1c00dd07 ("xprtrmda:
       Reduce calls to ib_poll_cq() in completion handlers").
    
       During transport disconnect processing, this sometimes resulted
       in the same reply getting added to the rpcrdma_tasklets_g list
       more than once, which corrupted the list.
    
    2. The upcall functions drain only a limited number of CQEs,
       thanks to the poll budget added by commit 8301a2c0
       ("xprtrdma: Limit work done by completion handler").
    
    Fixes: a7bc211a ("xprtrdma: On disconnect, don't ignore ... ")
    BugLink: https://bugzilla.linux-nfs.org/show_bug.cgi?id=276Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
    Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
    5c166bef
verbs.c 53.5 KB