From patchwork Mon Oct 29 23:45:02 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Al Chu X-Patchwork-Id: 1667991 X-Patchwork-Delegate: alexne@voltaire.com Return-Path: X-Original-To: patchwork-linux-rdma@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id C4026DFB7A for ; Mon, 29 Oct 2012 23:54:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1761336Ab2J2Xyh (ORCPT ); Mon, 29 Oct 2012 19:54:37 -0400 Received: from prdiron-3.llnl.gov ([128.15.143.173]:53762 "EHLO prdiron-3.llnl.gov" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758880Ab2J2Xyh (ORCPT ); Mon, 29 Oct 2012 19:54:37 -0400 X-Greylist: delayed 578 seconds by postgrey-1.27 at vger.kernel.org; Mon, 29 Oct 2012 19:54:37 EDT X-Attachments: Received: from auk59.llnl.gov (HELO [134.9.93.24]) ([134.9.93.24]) by prdiron-3.llnl.gov with ESMTP; 29 Oct 2012 16:45:02 -0700 Subject: [PATCH 2/2] opensm: Protect against spurious wakeups when calling cl_event_wait_on From: Albert Chu To: linux-rdma@vger.kernel.org Date: Mon, 29 Oct 2012 16:45:02 -0700 Message-Id: <1351554302.25353.21.camel@auk59.llnl.gov> Mime-Version: 1.0 X-Mailer: Evolution 2.12.3 (2.12.3-19.el5) Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org Signed-off-by: Albert Chu --- opensm/osm_congestion_control.c | 4 ++-- opensm/osm_perfmgr.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/opensm/osm_congestion_control.c b/opensm/osm_congestion_control.c index b5d9cdb..e103ab1 100644 --- a/opensm/osm_congestion_control.c +++ b/opensm/osm_congestion_control.c @@ -525,8 +525,8 @@ static void cc_poller_send(osm_congestion_control_t *p_cc, status = osm_vendor_send(p_cc->bind_handle, p_madw, TRUE); if (status == IB_SUCCESS) { cl_atomic_inc(&p_cc->outstanding_mads_on_wire); - if (p_cc->outstanding_mads_on_wire > - (int32_t)p_opt->cc_max_outstanding_mads) + while (p_cc->outstanding_mads_on_wire > + (int32_t)p_opt->cc_max_outstanding_mads) cl_event_wait_on(&p_cc->sig_mads_on_wire_continue, EVENT_NO_TIMEOUT, TRUE); diff --git a/opensm/osm_perfmgr.c b/opensm/osm_perfmgr.c index 98b4c07..d8f933e 100644 --- a/opensm/osm_perfmgr.c +++ b/opensm/osm_perfmgr.c @@ -419,13 +419,13 @@ static ib_api_status_t perfmgr_send_pc_mad(osm_perfmgr_t * perfmgr, if (status == IB_SUCCESS) { /* pause thread if there are too many outstanding requests */ cl_atomic_inc(&(perfmgr->outstanding_queries)); - if (perfmgr->outstanding_queries > - (int32_t)perfmgr->max_outstanding_queries) { + while (perfmgr->outstanding_queries > + (int32_t)perfmgr->max_outstanding_queries) { perfmgr->sweep_state = PERFMGR_SWEEP_SUSPENDED; cl_event_wait_on(&perfmgr->sig_query, EVENT_NO_TIMEOUT, TRUE); - perfmgr->sweep_state = PERFMGR_SWEEP_ACTIVE; } + perfmgr->sweep_state = PERFMGR_SWEEP_ACTIVE; } OSM_LOG_EXIT(perfmgr->log);