From patchwork Sat Feb 12 19:33:30 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arlin Davis X-Patchwork-Id: 552191 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p1CJSjGg025061 for ; Sat, 12 Feb 2011 19:33:34 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752530Ab1BLTdd (ORCPT ); Sat, 12 Feb 2011 14:33:33 -0500 Received: from mga01.intel.com ([192.55.52.88]:22853 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752416Ab1BLTdd convert rfc822-to-8bit (ORCPT ); Sat, 12 Feb 2011 14:33:33 -0500 Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga101.fm.intel.com with ESMTP; 12 Feb 2011 11:33:32 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.60,462,1291622400"; d="scan'208";a="657099950" Received: from orsmsx602.amr.corp.intel.com ([10.22.226.211]) by fmsmga002.fm.intel.com with ESMTP; 12 Feb 2011 11:33:32 -0800 Received: from orsmsx506.amr.corp.intel.com ([10.22.226.44]) by orsmsx602.amr.corp.intel.com ([10.22.226.211]) with mapi; Sat, 12 Feb 2011 11:33:32 -0800 From: "Davis, Arlin R" To: linux-rdma , "ofw@lists.openfabrics.org" Date: Sat, 12 Feb 2011 11:33:30 -0800 Subject: [PATCH 1/3] DAPL v2.0: ucm, scm: remove use of usec_sleep delays and use events for disc and destroy Thread-Topic: [PATCH 1/3] DAPL v2.0: ucm, scm: remove use of usec_sleep delays and use events for disc and destroy Thread-Index: AcvK67plwJir9/gDQBuTq7gBXQYMxA== Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US 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.6 (demeter1.kernel.org [140.211.167.41]); Sat, 12 Feb 2011 19:33:34 +0000 (UTC) diff --git a/dapl/openib_scm/cm.c b/dapl/openib_scm/cm.c index b0fbadf..1145f17 100644 --- a/dapl/openib_scm/cm.c +++ b/dapl/openib_scm/cm.c @@ -362,6 +362,8 @@ void dapls_cm_release(dp_ib_cm_handle_t cm_ptr) dapl_os_lock(&cm_ptr->lock); cm_ptr->ref_count--; if (cm_ptr->ref_count) { + if (cm_ptr->ref_count == 1) + dapl_os_wait_object_wakeup(&cm_ptr->event); dapl_os_unlock(&cm_ptr->lock); return; } @@ -437,10 +439,13 @@ void dapls_cm_free(dp_ib_cm_handle_t cm_ptr) /* free from internal workq, wait until EP is last ref */ dapl_os_lock(&cm_ptr->lock); cm_ptr->state = DCM_FREE; - while (cm_ptr->ref_count != 1) { - dapli_cm_thread_signal(cm_ptr); + dapl_os_unlock(&cm_ptr->lock); + + dapli_cm_thread_signal(cm_ptr); + dapl_os_lock(&cm_ptr->lock); + if (cm_ptr->ref_count != 1) { dapl_os_unlock(&cm_ptr->lock); - dapl_os_sleep_usec(10000); + dapl_os_wait_object_wait(&cm_ptr->event, DAT_TIMEOUT_INFINITE); dapl_os_lock(&cm_ptr->lock); } dapl_os_unlock(&cm_ptr->lock); diff --git a/dapl/openib_ucm/cm.c b/dapl/openib_ucm/cm.c index c5ddf04..69f7610 100644 --- a/dapl/openib_ucm/cm.c +++ b/dapl/openib_ucm/cm.c @@ -649,7 +649,8 @@ static void dapli_cm_dealloc(dp_ib_cm_handle_t cm) { dapl_os_assert(!cm->ref_count); dapl_os_lock_destroy(&cm->lock); - dapl_os_wait_object_destroy(&cm->event); + dapl_os_wait_object_destroy(&cm->d_event); + dapl_os_wait_object_destroy(&cm->f_event); dapl_os_free(cm, sizeof(*cm)); } @@ -665,6 +666,8 @@ void dapls_cm_release(dp_ib_cm_handle_t cm) dapl_os_lock(&cm->lock); cm->ref_count--; if (cm->ref_count) { + if (cm->ref_count == 1) + dapl_os_wait_object_wakeup(&cm->f_event); dapl_os_unlock(&cm->lock); return; } @@ -693,10 +696,15 @@ dp_ib_cm_handle_t dapls_ib_cm_create(DAPL_EP *ep) if (dapl_os_lock_init(&cm->lock)) goto bail; - if (dapl_os_wait_object_init(&cm->event)) { + if (dapl_os_wait_object_init(&cm->f_event)) { dapl_os_lock_destroy(&cm->lock); goto bail; } + if (dapl_os_wait_object_init(&cm->d_event)) { + dapl_os_lock_destroy(&cm->lock); + dapl_os_wait_object_destroy(&cm->f_event); + goto bail; + } dapls_cm_acquire(cm); cm->msg.ver = htons(DCM_VER); @@ -708,7 +716,8 @@ dp_ib_cm_handle_t dapls_ib_cm_create(DAPL_EP *ep) cm->msg.sport = htons(ucm_get_port(&hca->ib_trans, 0)); if (!cm->msg.sport) { - dapl_os_wait_object_destroy(&cm->event); + dapl_os_wait_object_destroy(&cm->f_event); + dapl_os_wait_object_destroy(&cm->d_event); dapl_os_lock_destroy(&cm->lock); goto bail; } @@ -758,10 +767,13 @@ void dapls_cm_free(dp_ib_cm_handle_t cm) if (cm->state != DCM_FREE) cm->state = DCM_FREE; - while (cm->ref_count != 1) { + dapl_os_unlock(&cm->lock); + dapls_thread_signal(&cm->hca->ib_trans.signal); + + dapl_os_lock(&cm->lock); + if (cm->ref_count != 1) { dapl_os_unlock(&cm->lock); - dapls_thread_signal(&cm->hca->ib_trans.signal); - dapl_os_sleep_usec(10000); + dapl_os_wait_object_wait(&cm->f_event, DAT_TIMEOUT_INFINITE); dapl_os_lock(&cm->lock); } dapl_os_unlock(&cm->lock); @@ -836,6 +848,8 @@ static void ucm_disconnect_final(dp_ib_cm_handle_t cm) else dapl_evd_connection_callback(cm, IB_CME_DISCONNECTED, NULL, 0, cm->ep); + dapl_os_wait_object_wakeup(&cm->d_event); + } /* @@ -888,7 +902,7 @@ DAT_RETURN dapli_cm_disconnect(dp_ib_cm_handle_t cm) dapl_os_unlock(&cm->lock); return DAT_SUCCESS; default: - dapl_log(DAPL_DBG_TYPE_WARN, + dapl_log(DAPL_DBG_TYPE_EP, " disconnect UNKNOWN state: ep %p cm %p %s %s" " %x %x %x %s %x %x %x r_id %x l_id %x\n", cm->ep, cm, @@ -1684,13 +1698,13 @@ dapls_ib_disconnect(IN DAPL_EP *ep_ptr, IN DAT_CLOSE_FLAGS close_flags) /* ABRUPT close, wait for callback and DISCONNECTED state */ if (close_flags == DAT_CLOSE_ABRUPT_FLAG) { dapl_os_lock(&ep_ptr->header.lock); - while (ep_ptr->param.ep_state != DAT_EP_STATE_DISCONNECTED) { - dapl_os_unlock(&ep_ptr->header.lock); - dapl_os_sleep_usec(10000); - dapl_os_lock(&ep_ptr->header.lock); + if (ep_ptr->param.ep_state != DAT_EP_STATE_DISCONNECTED) { + dapl_os_unlock(&ep_ptr->header.lock); + dapl_os_wait_object_wait(&cm_ptr->d_event, DAT_TIMEOUT_INFINITE); + dapl_os_lock(&ep_ptr->header.lock); } dapl_os_unlock(&ep_ptr->header.lock); - } + } return DAT_SUCCESS; } diff --git a/dapl/openib_ucm/dapl_ib_util.h b/dapl/openib_ucm/dapl_ib_util.h index 7769307..efeec4d 100644 --- a/dapl/openib_ucm/dapl_ib_util.h +++ b/dapl/openib_ucm/dapl_ib_util.h @@ -38,7 +38,8 @@ struct ib_cm_handle { struct dapl_llist_entry list_entry; struct dapl_llist_entry local_entry; - DAPL_OS_WAIT_OBJECT event; + DAPL_OS_WAIT_OBJECT d_event; + DAPL_OS_WAIT_OBJECT f_event; DAPL_OS_LOCK lock; DAPL_OS_TIMEVAL timer; int ref_count;