• Yamin Friedman's avatar
    RDMA/core: Introduce shared CQ pool API · c7ff819a
    Yamin Friedman authored
    Allow a ULP to ask the core to provide a completion queue based on a
    least-used search on a per-device CQ pools. The device CQ pools grow in a
    lazy fashion when more CQs are requested.
    
    This feature reduces the amount of interrupts when using many QPs.  Using
    shared CQs allows for more effcient completion handling. It also reduces
    the amount of overhead needed for CQ contexts.
    
    Test setup:
    Intel(R) Xeon(R) Platinum 8176M CPU @ 2.10GHz servers.
    Running NVMeoF 4KB read IOs over ConnectX-5EX across Spectrum switch.
    TX-depth = 32. The patch was applied in the nvme driver on both the target
    and initiator. Four controllers are accessed from each core. In the
    current test case we have exposed sixteen NVMe namespaces using four
    different subsystems (four namespaces per subsystem) from one NVM port.
    Each controller allocated X queues (RDMA QPs) and attached to Y CQs.
    Before this series we had X == Y, i.e for four controllers we've created
    total of 4X QPs and 4X CQs. In the shared case, we've created 4X QPs and
    only X CQs which means that we have four controllers that share a
    completion queue per core. Until fourteen cores there is no significant
    change in performance and the number of interrupts per second is less than
    a million in the current case.
    ==================================================
    |Cores|Current KIOPs  |Shared KIOPs  |improvement|
    |-----|---------------|--------------|-----------|
    |14   |2332           |2723          |16.7%      |
    |-----|---------------|--------------|-----------|
    |20   |2086           |2712          |30%        |
    |-----|---------------|--------------|-----------|
    |28   |1971           |2669          |35.4%      |
    |=================================================
    |Cores|Current avg lat|Shared avg lat|improvement|
    |-----|---------------|--------------|-----------|
    |14   |767us          |657us         |14.3%      |
    |-----|---------------|--------------|-----------|
    |20   |1225us         |943us         |23%        |
    |-----|---------------|--------------|-----------|
    |28   |1816us         |1341us        |26.1%      |
    ========================================================
    |Cores|Current interrupts|Shared interrupts|improvement|
    |-----|------------------|-----------------|-----------|
    |14   |1.6M/sec          |0.4M/sec         |72%        |
    |-----|------------------|-----------------|-----------|
    |20   |2.8M/sec          |0.6M/sec         |72.4%      |
    |-----|------------------|-----------------|-----------|
    |28   |2.9M/sec          |0.8M/sec         |63.4%      |
    ====================================================================
    |Cores|Current 99.99th PCTL lat|Shared 99.99th PCTL lat|improvement|
    |-----|------------------------|-----------------------|-----------|
    |14   |67ms                    |6ms                    |90.9%      |
    |-----|------------------------|-----------------------|-----------|
    |20   |5ms                     |6ms                    |-10%       |
    |-----|------------------------|-----------------------|-----------|
    |28   |8.7ms                   |6ms                    |25.9%      |
    |===================================================================
    
    Performance improvement with sixteen disks (sixteen CQs per core) is
    comparable.
    
    Link: https://lore.kernel.org/r/1590568495-101621-3-git-send-email-yaminf@mellanox.comSigned-off-by: default avatarYamin Friedman <yaminf@mellanox.com>
    Reviewed-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
    Reviewed-by: default avatarMax Gurtovoy <maxg@mellanox.com>
    Reviewed-by: default avatarLeon Romanovsky <leonro@mellanox.com>
    Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
    c7ff819a
cq.c 12.6 KB