Skip to content
  • Mike Marciniszyn's avatar
    IB/qib: Reduce sdma_lock contention · 551ace12
    Mike Marciniszyn authored
    
    
    Profiling has shown that sdma_lock is proving a bottleneck for
    performance. The situations include:
     - RDMA reads when krcvqs > 1
     - post sends from multiple threads
    
    For RDMA read the current global qib_wq mechanism runs on all CPUs
    and contends for the sdma_lock when multiple RMDA read requests are
    fielded on differenct CPUs. For post sends, the direct call to
    qib_do_send() from multiple threads causes the contention.
    
    Since the sdma mechanism is per port, this fix converts the existing
    workqueue to a per port single thread workqueue to reduce the lock
    contention in the RDMA read case, and for any other case where the QP
    is scheduled via the workqueue mechanism from more than 1 CPU.
    
    For the post send case, This patch modifies the post send code to test
    for a non empty sdma engine.  If the sdma is not idle the (now single
    thread) workqueue will be used to trigger the send engine instead of
    the direct call to qib_do_send().
    
    Signed-off-by: default avatarMike Marciniszyn <mike.marciniszyn@intel.com>
    Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
    551ace12