From patchwork Wed Mar 31 17:57:47 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ralph Campbell X-Patchwork-Id: 89993 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o2VHvQ7N030198 for ; Wed, 31 Mar 2010 17:57:49 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757954Ab0CaR5s (ORCPT ); Wed, 31 Mar 2010 13:57:48 -0400 Received: from vpn.pathscale.com ([198.186.3.75]:39710 "HELO mx.mv.qlogic.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with SMTP id S1757949Ab0CaR5s (ORCPT ); Wed, 31 Mar 2010 13:57:48 -0400 Received: from chromite.mv.qlogic.com (chromite.mv.qlogic.com [10.29.2.82]) by mx.mv.qlogic.com (Postfix) with ESMTP id C1137143007E; Wed, 31 Mar 2010 10:57:47 -0700 (PDT) Received: from chromite.mv.qlogic.com (localhost.localdomain [127.0.0.1]) by chromite.mv.qlogic.com (Postfix) with ESMTP id BFB57142997; Wed, 31 Mar 2010 10:57:47 -0700 (PDT) From: Ralph Campbell Subject: [PATCH 1/3] IB/core: use IB_CQ_REPORT_MISSED_EVENTS to avoid missed CQ callbacks To: Roland Dreier Cc: linux-rdma@vger.kernel.org Date: Wed, 31 Mar 2010 10:57:47 -0700 Message-ID: <20100331175747.24522.88472.stgit@chromite.mv.qlogic.com> In-Reply-To: <20100331175742.24522.17850.stgit@chromite.mv.qlogic.com> References: <20100331175742.24522.17850.stgit@chromite.mv.qlogic.com> User-Agent: StGIT/0.14.3 MIME-Version: 1.0 Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Wed, 31 Mar 2010 17:57:49 +0000 (UTC) diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c index e351b15..54c413e 100644 --- a/drivers/infiniband/core/mad.c +++ b/drivers/infiniband/core/mad.c @@ -2226,10 +2226,11 @@ static void ib_mad_completion_handler(struct work_struct *work) { struct ib_mad_port_private *port_priv; struct ib_wc wc; + int ret; port_priv = container_of(work, struct ib_mad_port_private, work); - ib_req_notify_cq(port_priv->cq, IB_CQ_NEXT_COMP); +again: while (ib_poll_cq(port_priv->cq, 1, &wc) == 1) { if (wc.status == IB_WC_SUCCESS) { switch (wc.opcode) { @@ -2246,6 +2247,10 @@ static void ib_mad_completion_handler(struct work_struct *work) } else mad_error_handler(port_priv, &wc); } + ret = ib_req_notify_cq(port_priv->cq, IB_CQ_NEXT_COMP | + IB_CQ_REPORT_MISSED_EVENTS); + if (ret > 0) + goto again; } static void cancel_mads(struct ib_mad_agent_private *mad_agent_priv)