From patchwork Wed Mar 31 17:57:58 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ralph Campbell X-Patchwork-Id: 89994 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 o2VHwEm2030375 for ; Wed, 31 Mar 2010 17:58:35 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758007Ab0CaR57 (ORCPT ); Wed, 31 Mar 2010 13:57:59 -0400 Received: from vpn.pathscale.com ([198.186.3.75]:39714 "HELO mx.mv.qlogic.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with SMTP id S1757998Ab0CaR56 (ORCPT ); Wed, 31 Mar 2010 13:57:58 -0400 Received: from chromite.mv.qlogic.com (chromite.mv.qlogic.com [10.29.2.82]) by mx.mv.qlogic.com (Postfix) with ESMTP id 0D7D8143007F; Wed, 31 Mar 2010 10:57:58 -0700 (PDT) Received: from chromite.mv.qlogic.com (localhost.localdomain [127.0.0.1]) by chromite.mv.qlogic.com (Postfix) with ESMTP id 06AF2142997; Wed, 31 Mar 2010 10:57:58 -0700 (PDT) From: Ralph Campbell Subject: [PATCH 3/3] IB/iser: 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:58 -0700 Message-ID: <20100331175757.24522.71999.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:58:36 +0000 (UTC) diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c index 308d17b..8cfd1c0 100644 --- a/drivers/infiniband/ulp/iser/iser_verbs.c +++ b/drivers/infiniband/ulp/iser/iser_verbs.c @@ -783,8 +783,11 @@ static void iser_cq_tasklet_fn(unsigned long data) unsigned long xfer_len; struct iser_conn *ib_conn; int completed_tx, completed_rx; + int ret; + completed_tx = completed_rx = 0; +again: while (ib_poll_cq(cq, 1, &wc) == 1) { desc = (struct iser_rx_desc *) (unsigned long) wc.wr_id; BUG_ON(desc == NULL); @@ -807,9 +810,10 @@ static void iser_cq_tasklet_fn(unsigned long data) if (!(completed_rx & 63)) completed_tx += iser_drain_tx_cq(device); } - /* #warning "it is assumed here that arming CQ only once its empty" * - * " would not cause interrupts to be missed" */ - ib_req_notify_cq(cq, IB_CQ_NEXT_COMP); + ret = ib_req_notify_cq(cq, IB_CQ_NEXT_COMP | + IB_CQ_REPORT_MISSED_EVENTS); + if (ret > 0) + goto again; completed_tx += iser_drain_tx_cq(device); iser_dbg("got %d rx %d tx completions\n", completed_rx, completed_tx);