• Long Li's avatar
    net: mana: Fix doorbell out of order violation and avoid unnecessary doorbell rings · 58a63729
    Long Li authored
    After napi_complete_done() is called when NAPI is polling in the current
    process context, another NAPI may be scheduled and start running in
    softirq on another CPU and may ring the doorbell before the current CPU
    does. When combined with unnecessary rings when there is no need to arm
    the CQ, it triggers error paths in the hardware.
    
    This patch fixes this by calling napi_complete_done() after doorbell
    rings. It limits the number of unnecessary rings when there is
    no need to arm. MANA hardware specifies that there must be one doorbell
    ring every 8 CQ wraparounds. This driver guarantees one doorbell ring as
    soon as the number of consumed CQEs exceeds 4 CQ wraparounds. In practical
    workloads, the 4 CQ wraparounds proves to be big enough that it rarely
    exceeds this limit before all the napi weight is consumed.
    
    To implement this, add a per-CQ counter cq->work_done_since_doorbell,
    and make sure the CQ is armed as soon as passing 4 wraparounds of the CQ.
    
    Cc: stable@vger.kernel.org
    Fixes: e1b5683f ("net: mana: Move NAPI from EQ to CQ")
    Reviewed-by: default avatarHaiyang Zhang <haiyangz@microsoft.com>
    Signed-off-by: default avatarLong Li <longli@microsoft.com>
    Link: https://patch.msgid.link/1723219138-29887-1-git-send-email-longli@linuxonhyperv.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    58a63729
mana_en.c 71.7 KB