lkml.org 
[lkml]   [2013]   [Apr]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[ 060/171 ] IPoIB: Fix send lockup due to missed TX completion
    3.6.11.2 stable review patch.
    If anyone has any objections, please let me know.

    ------------------

    From: Mike Marciniszyn <mike.marciniszyn@intel.com>

    [ Upstream commit 1ee9e2aa7b31427303466776f455d43e5e3c9275 ]

    Commit f0dc117abdfa ("IPoIB: Fix TX queue lockup with mixed UD/CM
    traffic") attempts to solve an issue where unprocessed UD send
    completions can deadlock the netdev.

    The patch doesn't fully resolve the issue because if more than half
    the tx_outstanding's were UD and all of the destinations are RC
    reachable, arming the CQ doesn't solve the issue.

    This patch uses the IB_CQ_REPORT_MISSED_EVENTS on the
    ib_req_notify_cq(). If the rc is above 0, the UD send cq completion
    callback is called directly to re-arm the send completion timer.

    This issue is seen in very large parallel filesystem deployments
    and the patch has been shown to correct the issue.

    Cc: <stable@vger.kernel.org>
    Reviewed-by: Dean Luick <dean.luick@intel.com>
    Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
    Signed-off-by: Roland Dreier <roland@purestorage.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    ---
    drivers/infiniband/ulp/ipoib/ipoib_cm.c | 8 ++++++--
    1 file changed, 6 insertions(+), 2 deletions(-)

    diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
    index 24683fd..2ad27ce 100644
    --- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
    +++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
    @@ -755,9 +755,13 @@ void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_
    if (++priv->tx_outstanding == ipoib_sendq_size) {
    ipoib_dbg(priv, "TX ring 0x%x full, stopping kernel net queue\n",
    tx->qp->qp_num);
    - if (ib_req_notify_cq(priv->send_cq, IB_CQ_NEXT_COMP))
    - ipoib_warn(priv, "request notify on send CQ failed\n");
    netif_stop_queue(dev);
    + rc = ib_req_notify_cq(priv->send_cq,
    + IB_CQ_NEXT_COMP | IB_CQ_REPORT_MISSED_EVENTS);
    + if (rc < 0)
    + ipoib_warn(priv, "request notify on send CQ failed\n");
    + else if (rc)
    + ipoib_send_comp_handler(priv->send_cq, dev);
    }
    }
    }
    --
    1.7.10.4



    \
     
     \ /
      Last update: 2013-04-12 00:01    [W:4.253 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site