[openib-general] [PATCH] RFC: opensm: serialize osm_state_mgr_process()
Sasha Khapyorsky
sashak at voltaire.com
Sun May 21 16:02:12 PDT 2006
Hello,
Please comment (and test).
Thanks,
Sasha.
This serializes execution of osm_state_mgr_process() and removes the big
state_lock. This should reduce "locked state" time and prevent potential
dispatcher blocking.
Other important change here is direct usage of pthread primitives
instead of "traditional" cl_thread* stuff.
Signed-off-by: Sasha Khapyorsky <sashak at voltaire.com>
---
osm/include/Makefile.am | 1
osm/include/opensm/osm_msgdef.h | 15 --
osm/include/opensm/osm_sm.h | 36 ++++-
osm/include/opensm/osm_state_mgr.h | 4 -
osm/include/opensm/osm_state_mgr_ctrl.h | 236 -------------------------------
osm/opensm/Makefile.am | 5 -
osm/opensm/osm_helper.c | 1
osm/opensm/osm_node_info_rcv.c | 5 -
osm/opensm/osm_port_info_rcv.c | 3
osm/opensm/osm_sm.c | 160 +++++++++++----------
osm/opensm/osm_sm_mad_ctrl.c | 26 ---
osm/opensm/osm_sm_state_mgr.c | 8 +
osm/opensm/osm_sminfo_rcv.c | 8 +
osm/opensm/osm_state_mgr.c | 24 ---
osm/opensm/osm_state_mgr_ctrl.c | 132 -----------------
osm/opensm/osm_sw_info_rcv.c | 3
osm/opensm/osm_sweep_fail_ctrl.c | 4 -
osm/opensm/osm_trap_rcv.c | 3
osm/opensm/osm_vl15intf.c | 25 ---
19 files changed, 143 insertions(+), 556 deletions(-)
diff --git a/osm/include/Makefile.am b/osm/include/Makefile.am
index 2bee762..0af78a0 100644
--- a/osm/include/Makefile.am
+++ b/osm/include/Makefile.am
@@ -120,7 +120,6 @@ EXTRA_DIST = \
$(srcdir)/opensm/osm_vl15intf.h \
$(srcdir)/opensm/osm_drop_mgr.h \
$(srcdir)/opensm/osm_port_info_rcv.h \
- $(srcdir)/opensm/osm_state_mgr_ctrl.h \
$(srcdir)/complib/cl_thread_osd.h \
$(srcdir)/complib/cl_packon.h \
$(srcdir)/complib/cl_atomic_osd.h \
diff --git a/osm/include/opensm/osm_msgdef.h b/osm/include/opensm/osm_msgdef.h
index a1b5743..6956c86 100644
--- a/osm/include/opensm/osm_msgdef.h
+++ b/osm/include/opensm/osm_msgdef.h
@@ -148,20 +148,6 @@ BEGIN_C_DECLS
*
* SOURCE
***********/
-/****d* OpenSM: Dispatcher Messages/OSM_MSG_NO_SMPS_OUTSTANDING
-* NAME
-* OSM_MSG_NO_SMPS_OUTSTANDING
-*
-* DESCRIPTION
-* Message indicating that there are no outstanding SMPs on the subnet.
-*
-* NOTES
-* Sent by: osm_mad_ctrl_t
-* Received by: osm_state_mgr_ctrl_t
-* Delivery notice: no
-*
-* SOURCE
-***********/
enum
{
OSM_MSG_REQ = 0,
@@ -169,7 +155,6 @@ enum
OSM_MSG_MAD_PORT_INFO,
OSM_MSG_MAD_SWITCH_INFO,
OSM_MSG_MAD_NODE_DESC,
- OSM_MSG_NO_SMPS_OUTSTANDING,
OSM_MSG_MAD_NODE_RECORD,
OSM_MSG_MAD_PORTINFO_RECORD,
OSM_MSG_MAD_SERVICE_RECORD,
diff --git a/osm/include/opensm/osm_sm.h b/osm/include/opensm/osm_sm.h
index d6086d4..def43c8 100644
--- a/osm/include/opensm/osm_sm.h
+++ b/osm/include/opensm/osm_sm.h
@@ -69,7 +69,6 @@ #include <opensm/osm_port_info_rcv_ctrl.
#include <opensm/osm_sw_info_rcv_ctrl.h>
#include <opensm/osm_node_desc_rcv_ctrl.h>
#include <opensm/osm_sm_mad_ctrl.h>
-#include <opensm/osm_state_mgr_ctrl.h>
#include <opensm/osm_lid_mgr.h>
#include <opensm/osm_ucast_mgr.h>
#include <opensm/osm_link_mgr.h>
@@ -131,7 +130,6 @@ BEGIN_C_DECLS
typedef struct _osm_sm
{
osm_thread_state_t thread_state;
- cl_event_t signal;
cl_event_t subnet_up_event;
cl_thread_t sweeper;
osm_subn_t *p_subn;
@@ -143,6 +141,9 @@ typedef struct _osm_sm
cl_dispatcher_t *p_disp;
cl_plock_t *p_lock;
atomic32_t sm_trans_id;
+ unsigned signal_mask;
+ pthread_mutex_t mutex;
+ pthread_cond_t cond;
osm_req_t req;
osm_req_ctrl_t req_ctrl;
osm_resp_t resp;
@@ -155,7 +156,6 @@ typedef struct _osm_sm
osm_sm_mad_ctrl_t mad_ctrl;
osm_si_rcv_t si_rcv;
osm_si_rcv_ctrl_t si_rcv_ctrl;
- osm_state_mgr_ctrl_t state_mgr_ctrl;
osm_lid_mgr_t lid_mgr;
osm_ucast_mgr_t ucast_mgr;
osm_link_mgr_t link_mgr;
@@ -387,6 +387,33 @@ osm_sm_init(
* SM object, osm_sm_construct, osm_sm_destroy
*********/
+/****f* OpenSM: SM/osm_sm_signal
+* NAME
+* osm_sm_signal
+*
+* DESCRIPTION
+* Forward signal to state engine
+*
+* SYNOPSIS
+*/
+void
+osm_sm_signal(
+ IN osm_sm_t* const p_sm,
+ IN osm_signal_t signal );
+/*
+* PARAMETERS
+* p_sm
+* [in] Pointer to an osm_sm_t object.
+*
+* signal
+* [in] Signal to the state engine.
+*
+* NOTES
+*
+* SEE ALSO
+* SM object
+*********/
+
/****f* OpenSM: SM/osm_sm_sweep
* NAME
* osm_sm_sweep
@@ -404,9 +431,6 @@ osm_sm_sweep(
* p_sm
* [in] Pointer to an osm_sm_t object.
*
-* RETURN VALUES
-* IB_SUCCESS if the sweep completed successfully.
-*
* NOTES
*
* SEE ALSO
diff --git a/osm/include/opensm/osm_state_mgr.h b/osm/include/opensm/osm_state_mgr.h
index ad4afa0..5e76463 100644
--- a/osm/include/opensm/osm_state_mgr.h
+++ b/osm/include/opensm/osm_state_mgr.h
@@ -116,7 +116,6 @@ typedef struct _osm_state_mgr
osm_stats_t *p_stats;
struct _osm_sm_state_mgr *p_sm_state_mgr;
const osm_sm_mad_ctrl_t *p_mad_ctrl;
- cl_spinlock_t state_lock;
cl_spinlock_t idle_lock;
cl_qlist_t idle_time_list;
cl_plock_t *p_lock;
@@ -161,9 +160,6 @@ typedef struct _osm_state_mgr
* p_mad_ctrl
* Pointer to the SM's MAD Controller object.
*
-* state_lock
-* Spinlock guarding the state and processes.
-*
* p_lock
* lock guarding the subnet object.
*
diff --git a/osm/include/opensm/osm_state_mgr_ctrl.h b/osm/include/opensm/osm_state_mgr_ctrl.h
deleted file mode 100644
index 9ffcfb0..0000000
--- a/osm/include/opensm/osm_state_mgr_ctrl.h
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved.
- * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
- * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses. You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the
- * OpenIB.org BSD license below:
- *
- * Redistribution and use in source and binary forms, with or
- * without modification, are permitted provided that the following
- * conditions are met:
- *
- * - Redistributions of source code must retain the above
- * copyright notice, this list of conditions and the following
- * disclaimer.
- *
- * - Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * $Id$
- */
-
-
-/*
- * Abstract:
- * Declaration of osm_state_mgr_ctrl_t.
- * This object represents a controller that receives the
- * State indication after a subnet sweep.
- * This object is part of the OpenSM family of objects.
- *
- * Environment:
- * Linux User Mode
- *
- * $Revision: 1.4 $
- */
-
-#ifndef _OSM_STATE_MGR_CTRL_H_
-#define _OSM_STATE_MGR_CTRL_H_
-
-
-#include <complib/cl_dispatcher.h>
-#include <opensm/osm_base.h>
-#include <opensm/osm_state_mgr.h>
-#include <opensm/osm_log.h>
-
-#ifdef __cplusplus
-# define BEGIN_C_DECLS extern "C" {
-# define END_C_DECLS }
-#else /* !__cplusplus */
-# define BEGIN_C_DECLS
-# define END_C_DECLS
-#endif /* __cplusplus */
-
-BEGIN_C_DECLS
-
-/****h* OpenSM/State Manager Controller
-* NAME
-* State Manager Controller
-*
-* DESCRIPTION
-* The State Manager Controller object encapsulates the information
-* needed to pass the dispatcher message from the dispatcher
-* to the State Manager.
-*
-* The State Manager Controller object is thread safe.
-*
-* This object should be treated as opaque and should be
-* manipulated only through the provided functions.
-*
-* AUTHOR
-* Steve King, Intel
-*
-*********/
-/****s* OpenSM: State Manager Controller/osm_state_mgr_ctrl_t
-* NAME
-* osm_state_mgr_ctrl_t
-*
-* DESCRIPTION
-* State Manager Controller structure.
-*
-* This object should be treated as opaque and should
-* be manipulated only through the provided functions.
-*
-* SYNOPSIS
-*/
-typedef struct _osm_state_mgr_ctrl
-{
- osm_state_mgr_t *p_mgr;
- osm_log_t *p_log;
- cl_dispatcher_t *p_disp;
- cl_disp_reg_handle_t h_disp;
-
-} osm_state_mgr_ctrl_t;
-/*
-* FIELDS
-* p_mgr
-* Pointer to the State Manager object.
-*
-* p_log
-* Pointer to the log object.
-*
-* p_disp
-* Pointer to the Dispatcher.
-*
-* h_disp
-* Handle returned from dispatcher registration.
-*
-* SEE ALSO
-* State Manager Controller object
-*********/
-
-/****f* OpenSM: State Manager Controller/osm_state_mgr_ctrl_construct
-* NAME
-* osm_state_mgr_ctrl_construct
-*
-* DESCRIPTION
-* This function constructs a State Manager Controller object.
-*
-* SYNOPSIS
-*/
-void
-osm_state_mgr_ctrl_construct(
- IN osm_state_mgr_ctrl_t* const p_ctrl );
-/*
-* PARAMETERS
-* p_ctrl
-* [in] Pointer to a State Manager Controller
-* object to construct.
-*
-* RETURN VALUE
-* This function does not return a value.
-*
-* NOTES
-* Allows calling osm_state_mgr_ctrl_init, osm_state_mgr_ctrl_destroy,
-* and osm_state_mgr_ctrl_is_inited.
-*
-* Calling osm_state_mgr_ctrl_construct is a prerequisite to calling any other
-* method except osm_state_mgr_ctrl_init.
-*
-* SEE ALSO
-* State Manager Controller object, osm_state_mgr_ctrl_init,
-* osm_state_mgr_ctrl_destroy
-*********/
-
-/****f* OpenSM: State Manager Controller/osm_state_mgr_ctrl_destroy
-* NAME
-* osm_state_mgr_ctrl_destroy
-*
-* DESCRIPTION
-* The osm_state_mgr_ctrl_destroy function destroys the object, releasing
-* all resources.
-*
-* SYNOPSIS
-*/
-void
-osm_state_mgr_ctrl_destroy(
- IN osm_state_mgr_ctrl_t* const p_ctrl );
-/*
-* PARAMETERS
-* p_ctrl
-* [in] Pointer to the object to destroy.
-*
-* RETURN VALUE
-* This function does not return a value.
-*
-* NOTES
-* Performs any necessary cleanup of the specified
-* State Manager Controller object.
-* Further operations should not be attempted on the destroyed object.
-* This function should only be called after a call to
-* osm_state_mgr_ctrl_construct or osm_state_mgr_ctrl_init.
-*
-* SEE ALSO
-* State Manager Controller object, osm_state_mgr_ctrl_construct,
-* osm_state_mgr_ctrl_init
-*********/
-
-/****f* OpenSM: State Manager Controller/osm_state_mgr_ctrl_init
-* NAME
-* osm_state_mgr_ctrl_init
-*
-* DESCRIPTION
-* The osm_state_mgr_ctrl_init function initializes a
-* State Manager Controller object for use.
-*
-* SYNOPSIS
-*/
-ib_api_status_t
-osm_state_mgr_ctrl_init(
- IN osm_state_mgr_ctrl_t* const p_ctrl,
- IN osm_state_mgr_t* const p_mgr,
- IN osm_log_t* const p_log,
- IN cl_dispatcher_t* const p_disp );
-/*
-* PARAMETERS
-* p_ctrl
-* [in] Pointer to an osm_state_mgr_ctrl_t object to initialize.
-*
-* p_mgr
-* [in] Pointer to an osm_state_mgr_t object.
-*
-* p_log
-* [in] Pointer to the log object.
-*
-* p_disp
-* [in] Pointer to the OpenSM central Dispatcher.
-*
-* RETURN VALUES
-* IB_SUCCESS if the State Manager Controller object
-* was initialized successfully.
-*
-* NOTES
-* Allows calling other State Manager Controller methods.
-*
-* SEE ALSO
-* State Manager Controller object, osm_state_mgr_ctrl_construct,
-* osm_state_mgr_ctrl_destroy
-*********/
-
-END_C_DECLS
-
-#endif /* OSM_STATE_MGR_CTRL_H_ */
diff --git a/osm/opensm/Makefile.am b/osm/opensm/Makefile.am
index 43fe8c1..7b1060a 100644
--- a/osm/opensm/Makefile.am
+++ b/osm/opensm/Makefile.am
@@ -78,8 +78,7 @@ opensm_SOURCES = main.c osm_console.c os
osm_slvl_map_rcv.c osm_slvl_map_rcv_ctrl.c \
osm_sm.c osm_sminfo_rcv.c \
osm_sminfo_rcv_ctrl.c osm_sm_mad_ctrl.c \
- osm_sm_state_mgr.c osm_state_mgr.c \
- osm_state_mgr_ctrl.c osm_subnet.c \
+ osm_sm_state_mgr.c osm_state_mgr.c osm_subnet.c \
osm_sweep_fail_ctrl.c osm_sw_info_rcv.c \
osm_sw_info_rcv_ctrl.c osm_switch.c \
osm_prtn.c osm_prtn_config.c osm_qos.c \
@@ -104,7 +103,7 @@ # we need to be able to load libraries f
# we always give precedence to local tree libs and then use the pre-installed ones.
opensm_LDADD = -L../complib -L../libvendor -L. $(OSMV_LDADD) -lopensm -losmcomp -losmvendor
-opensm_LDFLAGS = -Wl,--rpath -Wl,$(libdir) -lpthread
+opensm_LDFLAGS = -Wl,--rpath -Wl,$(libdir) -lpthread -lrt
opensmincludedir = $(includedir)/infiniband/opensm
diff --git a/osm/opensm/osm_helper.c b/osm/opensm/osm_helper.c
index 3886609..a966bbe 100644
--- a/osm/opensm/osm_helper.c
+++ b/osm/opensm/osm_helper.c
@@ -1895,7 +1895,6 @@ static const char* const __osm_disp_msg_
"OSM_MSG_MAD_PORT_INFO,",
"OSM_MSG_MAD_SWITCH_INFO",
"OSM_MSG_MAD_NODE_DESC",
- "OSM_MSG_NO_SMPS_OUTSTANDING",
"OSM_MSG_MAD_NODE_RECORD",
"OSM_MSG_MAD_PORTINFO_RECORD",
"OSM_MSG_MAD_SERVICE_RECORD",
diff --git a/osm/opensm/osm_node_info_rcv.c b/osm/opensm/osm_node_info_rcv.c
index 59257a0..7ea4366 100644
--- a/osm/opensm/osm_node_info_rcv.c
+++ b/osm/opensm/osm_node_info_rcv.c
@@ -69,6 +69,7 @@ #include <opensm/osm_subnet.h>
#include <opensm/osm_mad_pool.h>
#include <opensm/osm_helper.h>
#include <opensm/osm_msgdef.h>
+#include <opensm/osm_opensm.h>
/**********************************************************************
@@ -1088,11 +1089,11 @@ osm_ni_rcv_process(
/*
* If we processed a new node - need to signal to the state_mgr that
- * change detected. BUT - we cannot call the osm_state_mgr_process
+ * change detected. BUT - we cannot call the osm_sm_signal
* from within the lock of p_rcv->p_lock (can cause a deadlock).
*/
if ( process_new_flag )
- osm_state_mgr_process( p_rcv->p_state_mgr, OSM_SIGNAL_CHANGE_DETECTED );
+ osm_sm_signal( &p_rcv->p_subn->p_osm->sm, OSM_SIGNAL_CHANGE_DETECTED );
Exit:
OSM_LOG_EXIT( p_rcv->p_log );
diff --git a/osm/opensm/osm_port_info_rcv.c b/osm/opensm/osm_port_info_rcv.c
index a08c57c..7405ef0 100644
--- a/osm/opensm/osm_port_info_rcv.c
+++ b/osm/opensm/osm_port_info_rcv.c
@@ -69,6 +69,7 @@ #include <opensm/osm_helper.h>
#include <vendor/osm_vendor_api.h>
#include <opensm/osm_pkey.h>
#include <opensm/osm_remote_sm.h>
+#include <opensm/osm_opensm.h>
/**********************************************************************
**********************************************************************/
@@ -701,7 +702,7 @@ osm_pi_rcv_process(
" port = %u, Commencing heavy sweep\n",
cl_ntoh64( node_guid ),
cl_ntoh64( port_guid ) );
- osm_state_mgr_process( p_rcv->p_state_mgr,
+ osm_sm_signal( &p_rcv->p_subn->p_osm->sm,
OSM_SIGNAL_CHANGE_DETECTED );
goto Exit;
}
diff --git a/osm/opensm/osm_sm.c b/osm/opensm/osm_sm.c
index 0e09f26..5b5eb3f 100644
--- a/osm/opensm/osm_sm.c
+++ b/osm/opensm/osm_sm.c
@@ -55,6 +55,8 @@ #if HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
+#include <time.h>
+#include <errno.h>
#include <string.h>
#include <complib/cl_memory.h>
#include <complib/cl_qmap.h>
@@ -79,53 +81,65 @@ void
__osm_sm_sweeper(
IN void *p_ptr )
{
- ib_api_status_t status;
osm_sm_t *const p_sm = ( osm_sm_t * ) p_ptr;
+ unsigned i, signals;
OSM_LOG_ENTER( p_sm->p_log, __osm_sm_sweeper );
- if( p_sm->thread_state == OSM_THREAD_STATE_INIT )
- {
- p_sm->thread_state = OSM_THREAD_STATE_RUN;
- }
-
- /* If the sweep interval was updated before - then run only if
- * it is not zero. */
- while( p_sm->thread_state == OSM_THREAD_STATE_RUN &&
- p_sm->p_subn->opt.sweep_interval != 0 )
- {
- /* do the sweep only if we are in MASTER state */
- if( p_sm->p_subn->sm_state == IB_SMINFO_STATE_MASTER ||
- p_sm->p_subn->sm_state == IB_SMINFO_STATE_DISCOVERING )
- osm_state_mgr_process( &p_sm->state_mgr, OSM_SIGNAL_SWEEP );
+ do {
+ signals = 0;
+ pthread_mutex_lock(&p_sm->mutex);
+ if (p_sm->signal_mask == 0)
+ pthread_cond_wait(&p_sm->cond, &p_sm->mutex);
+ signals = p_sm->signal_mask;
+ p_sm->signal_mask = 0;
+ pthread_mutex_unlock(&p_sm->mutex);
+ for (i = 0 ; signals ; i++) {
+ if (signals&1)
+ osm_state_mgr_process( &p_sm->state_mgr, i);
+ signals >>= 1;
+ }
+ } while (p_sm->thread_state == OSM_THREAD_STATE_RUN);
- /*
- * Wait on the event with a timeout.
- * Sweeps may be iniated "off schedule" by simply
- * signaling the event.
- */
- status = cl_event_wait_on( &p_sm->signal,
- p_sm->p_subn->opt.sweep_interval * 1000000,
- TRUE );
+ OSM_LOG_EXIT( p_sm->p_log );
+}
- if( status == CL_SUCCESS )
- {
- if( osm_log_is_active( p_sm->p_log, OSM_LOG_DEBUG ) )
- {
- osm_log( p_sm->p_log, OSM_LOG_DEBUG,
- "__osm_sm_sweeper: " "Off schedule sweep signalled\n" );
- }
+/**********************************************************************
+ **********************************************************************/
+void
+__osm_sm_sweeper_periodic(
+ IN void *p_ptr )
+{
+ struct timespec times;
+ osm_sm_t *const p_sm = ( osm_sm_t * ) p_ptr;
+ unsigned i, signals;
+ int ret;
+
+ OSM_LOG_ENTER( p_sm->p_log, __osm_sm_sweeper_periodic );
+
+ do {
+ clock_gettime(CLOCK_REALTIME, ×);
+ times.tv_sec += p_sm->p_subn->opt.sweep_interval;
+ signals = 0;
+ pthread_mutex_lock(&p_sm->mutex);
+ if (p_sm->signal_mask == 0 &&
+ (ret = pthread_cond_timedwait(&p_sm->cond, &p_sm->mutex,
+ ×)) == ETIMEDOUT &&
+ ( p_sm->p_subn->sm_state == IB_SMINFO_STATE_MASTER ||
+ p_sm->p_subn->sm_state == IB_SMINFO_STATE_DISCOVERING )) {
+ signals = OSM_SIGNAL_SWEEP;
}
- else
- {
- if( status != CL_TIMEOUT )
- {
- osm_log( p_sm->p_log, OSM_LOG_ERROR,
- "__osm_sm_sweeper: ERR 2E01: "
- "Event wait failed (%s)\n", CL_STATUS_MSG( status ) );
- }
+ else {
+ signals = p_sm->signal_mask;
+ p_sm->signal_mask = 0;
}
- }
+ pthread_mutex_unlock(&p_sm->mutex);
+ for (i = 0 ; signals ; i++) {
+ if (signals&1)
+ osm_state_mgr_process( &p_sm->state_mgr, i);
+ signals >>= 1;
+ }
+ } while (p_sm->thread_state == OSM_THREAD_STATE_RUN);
OSM_LOG_EXIT( p_sm->p_log );
}
@@ -139,7 +153,6 @@ osm_sm_construct(
memset( p_sm, 0, sizeof( *p_sm ) );
p_sm->thread_state = OSM_THREAD_STATE_NONE;
p_sm->sm_trans_id = OSM_SM_INITIAL_TID_VALUE;
- cl_event_construct( &p_sm->signal );
cl_event_construct( &p_sm->subnet_up_event );
cl_thread_construct( &p_sm->sweeper );
osm_req_construct( &p_sm->req );
@@ -158,7 +171,6 @@ osm_sm_construct(
osm_ucast_mgr_construct( &p_sm->ucast_mgr );
osm_link_mgr_construct( &p_sm->link_mgr );
osm_state_mgr_construct( &p_sm->state_mgr );
- osm_state_mgr_ctrl_construct( &p_sm->state_mgr_ctrl );
osm_drop_mgr_construct( &p_sm->drop_mgr );
osm_lft_rcv_construct( &p_sm->lft_rcv );
osm_lft_rcv_ctrl_construct( &p_sm->lft_rcv_ctrl );
@@ -185,24 +197,14 @@ void
osm_sm_shutdown(
IN osm_sm_t * const p_sm )
{
- boolean_t signal_event = FALSE;
-
OSM_LOG_ENTER( p_sm->p_log, osm_sm_shutdown );
/*
* Signal our threads that we're leaving.
- */
- if( p_sm->thread_state != OSM_THREAD_STATE_NONE )
- signal_event = TRUE;
-
- p_sm->thread_state = OSM_THREAD_STATE_EXIT;
-
- /*
- * Don't trigger unless event has been initialized.
* Destroy the thread before we tear down the other objects.
*/
- if( signal_event )
- cl_event_signal( &p_sm->signal );
+ p_sm->thread_state = OSM_THREAD_STATE_EXIT;
+ osm_sm_signal( p_sm, OSM_SIGNAL_NONE );
cl_thread_destroy( &p_sm->sweeper );
@@ -225,7 +227,6 @@ osm_sm_shutdown(
osm_vla_rcv_ctrl_destroy( &p_sm->vla_rcv_ctrl );
osm_pkey_rcv_ctrl_destroy( &p_sm->pkey_rcv_ctrl );
osm_sweep_fail_ctrl_destroy( &p_sm->sweep_fail_ctrl );
- osm_state_mgr_ctrl_destroy( &p_sm->state_mgr_ctrl );
OSM_LOG_EXIT( p_sm->p_log );
}
@@ -257,12 +258,14 @@ osm_sm_destroy(
osm_state_mgr_destroy( &p_sm->state_mgr );
osm_sm_state_mgr_destroy( &p_sm->sm_state_mgr );
osm_mcast_mgr_destroy( &p_sm->mcast_mgr );
- cl_event_destroy( &p_sm->signal );
cl_event_destroy( &p_sm->subnet_up_event );
if( p_sm->p_report_buf != NULL )
cl_free( p_sm->p_report_buf );
+ pthread_cond_destroy(&p_sm->cond);
+ pthread_mutex_destroy(&p_sm->mutex);
+
osm_log( p_sm->p_log, OSM_LOG_SYS, "Exiting SM\n" ); /* Format Waived */
OSM_LOG_EXIT( p_sm->p_log );
}
@@ -303,14 +306,15 @@ osm_sm_init(
status = IB_INSUFFICIENT_MEMORY;
goto Exit;
}
- status = cl_event_init( &p_sm->signal, FALSE );
- if( status != CL_SUCCESS )
- goto Exit;
status = cl_event_init( &p_sm->subnet_up_event, FALSE );
if( status != CL_SUCCESS )
goto Exit;
+ p_sm->signal_mask = 0;
+ pthread_mutex_init(&p_sm->mutex, NULL);
+ pthread_cond_init(&p_sm->cond, NULL);
+
status = osm_sm_mad_ctrl_init( &p_sm->mad_ctrl,
p_sm->p_subn,
p_sm->p_mad_pool,
@@ -416,12 +420,6 @@ osm_sm_init(
if( status != IB_SUCCESS )
goto Exit;
- status = osm_state_mgr_ctrl_init( &p_sm->state_mgr_ctrl,
- &p_sm->state_mgr,
- p_sm->p_log, p_sm->p_disp );
- if( status != IB_SUCCESS )
- goto Exit;
-
status = osm_drop_mgr_init( &p_sm->drop_mgr,
p_sm->p_subn,
p_sm->p_log, &p_sm->req, p_sm->p_lock );
@@ -523,16 +521,15 @@ osm_sm_init(
/*
* Now that the component objects are initialized, start
- * the sweeper thread if the user wants sweeping.
+ * the sweeper thread.
*/
- if( p_sm->p_subn->opt.sweep_interval )
- {
- p_sm->thread_state = OSM_THREAD_STATE_INIT;
- status = cl_thread_init( &p_sm->sweeper, __osm_sm_sweeper, p_sm,
- "opensm sweeper" );
- if( status != IB_SUCCESS )
- goto Exit;
- }
+ p_sm->thread_state = OSM_THREAD_STATE_RUN;
+ status = cl_thread_init( &p_sm->sweeper,
+ p_sm->p_subn->opt.sweep_interval > 0 ?
+ __osm_sm_sweeper_periodic : __osm_sm_sweeper,
+ p_sm, "opensm sweeper" );
+ if( status != IB_SUCCESS )
+ goto Exit;
Exit:
OSM_LOG_EXIT( p_log );
@@ -542,11 +539,26 @@ osm_sm_init(
/**********************************************************************
**********************************************************************/
void
+osm_sm_signal(
+ IN osm_sm_t* const p_sm,
+ IN osm_signal_t signal )
+{
+ OSM_LOG_ENTER( p_sm->p_log, osm_sm_signal );
+ pthread_mutex_lock(&p_sm->mutex);
+ p_sm->signal_mask |= (1 << signal);
+ pthread_cond_signal(&p_sm->cond);
+ pthread_mutex_unlock(&p_sm->mutex);
+ OSM_LOG_EXIT( p_sm->p_log );
+}
+
+/**********************************************************************
+ **********************************************************************/
+void
osm_sm_sweep(
IN osm_sm_t * const p_sm )
{
OSM_LOG_ENTER( p_sm->p_log, osm_sm_sweep );
- osm_state_mgr_process( &p_sm->state_mgr, OSM_SIGNAL_SWEEP );
+ osm_sm_signal( p_sm, OSM_SIGNAL_SWEEP );
OSM_LOG_EXIT( p_sm->p_log );
}
diff --git a/osm/opensm/osm_sm_mad_ctrl.c b/osm/opensm/osm_sm_mad_ctrl.c
index 9dceef2..1982873 100644
--- a/osm/opensm/osm_sm_mad_ctrl.c
+++ b/osm/opensm/osm_sm_mad_ctrl.c
@@ -81,7 +81,6 @@ __osm_sm_mad_ctrl_retire_trans_mad(
IN osm_madw_t* const p_madw )
{
uint32_t outstanding;
- cl_status_t status;
OSM_LOG_ENTER( p_ctrl->p_log, __osm_sm_mad_ctrl_retire_trans_mad );
@@ -115,31 +114,10 @@ __osm_sm_mad_ctrl_retire_trans_mad(
The wire is clean.
Signal the state manager.
*/
- if( osm_log_is_active( p_ctrl->p_log, OSM_LOG_DEBUG ) )
- {
- osm_log( p_ctrl->p_log, OSM_LOG_DEBUG,
- "__osm_sm_mad_ctrl_retire_trans_mad: "
- "Posting Dispatcher message %s\n",
- osm_get_disp_msg_str( OSM_MSG_NO_SMPS_OUTSTANDING ) );
- }
-
- status = cl_disp_post( p_ctrl->h_disp,
- OSM_MSG_NO_SMPS_OUTSTANDING,
- (void *)OSM_SIGNAL_NO_PENDING_TRANSACTIONS,
- NULL,
- NULL );
-
- if( status != CL_SUCCESS )
- {
- osm_log( p_ctrl->p_log, OSM_LOG_ERROR,
- "__osm_sm_mad_ctrl_retire_trans_mad: ERR 3101: "
- "Dispatcher post message failed (%s)\n",
- CL_STATUS_MSG( status ) );
- goto Exit;
- }
+ osm_sm_signal( &p_ctrl->p_subn->p_osm->sm,
+ OSM_SIGNAL_NO_PENDING_TRANSACTIONS );
}
- Exit:
OSM_LOG_EXIT( p_ctrl->p_log );
}
/************/
diff --git a/osm/opensm/osm_sm_state_mgr.c b/osm/opensm/osm_sm_state_mgr.c
index feeda45..2c6da4e 100644
--- a/osm/opensm/osm_sm_state_mgr.c
+++ b/osm/opensm/osm_sm_state_mgr.c
@@ -563,7 +563,7 @@ osm_sm_state_mgr_process(
/*
* Stop the discovering
*/
- osm_state_mgr_process( p_sm_mgr->p_state_mgr,
+ osm_sm_signal( &p_sm_mgr->p_subn->p_osm->sm,
OSM_SIGNAL_MASTER_OR_HIGHER_SM_DETECTED );
break;
case OSM_SM_SIGNAL_MASTER_OR_HIGHER_SM_DETECTED_DONE:
@@ -610,7 +610,7 @@ osm_sm_state_mgr_process(
__osm_sm_state_mgr_discovering_msg( p_sm_mgr );
p_sm_mgr->p_subn->sm_state = IB_SMINFO_STATE_DISCOVERING;
p_sm_mgr->p_subn->coming_out_of_standby = TRUE;
- osm_state_mgr_process( p_sm_mgr->p_state_mgr, OSM_SIGNAL_EXIT_STBY );
+ osm_sm_signal( &p_sm_mgr->p_subn->p_osm->sm, OSM_SIGNAL_EXIT_STBY );
break;
case OSM_SM_SIGNAL_DISABLE:
/*
@@ -641,7 +641,7 @@ osm_sm_state_mgr_process(
*/
p_sm_mgr->p_subn->master_sm_base_lid = p_sm_mgr->p_subn->sm_base_lid;
p_sm_mgr->p_subn->coming_out_of_standby = TRUE;
- osm_state_mgr_process( p_sm_mgr->p_state_mgr, OSM_SIGNAL_EXIT_STBY );
+ osm_sm_signal( &p_sm_mgr->p_subn->p_osm->sm, OSM_SIGNAL_EXIT_STBY );
break;
case OSM_SM_SIGNAL_ACKNOWLEDGE:
/*
@@ -704,7 +704,7 @@ osm_sm_state_mgr_process(
"Received OSM_SM_SIGNAL_HANDOVER\n" );
p_sm_mgr->p_polling_sm = NULL;
p_sm_mgr->p_subn->force_immediate_heavy_sweep = TRUE;
- osm_state_mgr_process( p_sm_mgr->p_state_mgr, OSM_SIGNAL_SWEEP );
+ osm_sm_signal( &p_sm_mgr->p_subn->p_osm->sm, OSM_SIGNAL_SWEEP );
break;
case OSM_SM_SIGNAL_HANDOVER_SENT:
/*
diff --git a/osm/opensm/osm_sminfo_rcv.c b/osm/opensm/osm_sminfo_rcv.c
index 5914984..4af549b 100644
--- a/osm/opensm/osm_sminfo_rcv.c
+++ b/osm/opensm/osm_sminfo_rcv.c
@@ -425,10 +425,10 @@ __osm_sminfo_rcv_process_set_request(
}
/**********************************************************************
- * Return a signal with which to call the osm_state_mgr_process.
+ * Return a signal with which to call the osm_sm_signal.
* This is done since we are locked by p_rcv->p_lock in this function,
- * and thus cannot call osm_state_mgr_process (that locks the state_lock).
- * If return OSM_SIGNAL_NONE - do not call osm_state_mgr_process.
+ * and thus cannot call osm_sm_signal.
+ * If return OSM_SIGNAL_NONE - do not call osm_sm_signal.
**********************************************************************/
osm_signal_t
__osm_sminfo_rcv_process_get_sm(
@@ -676,7 +676,7 @@ __osm_sminfo_rcv_process_get_response(
/* If process_get_sm_ret_val != OSM_SIGNAL_NONE then we have to signal
* to the state_mgr with that signal. */
if (process_get_sm_ret_val != OSM_SIGNAL_NONE)
- osm_state_mgr_process( p_rcv->p_state_mgr,
+ osm_sm_signal( &p_rcv->p_subn->p_osm->sm,
process_get_sm_ret_val );
OSM_LOG_EXIT( p_rcv->p_log );
}
diff --git a/osm/opensm/osm_state_mgr.c b/osm/opensm/osm_state_mgr.c
index 724b2b7..ff1c65c 100644
--- a/osm/opensm/osm_state_mgr.c
+++ b/osm/opensm/osm_state_mgr.c
@@ -83,7 +83,6 @@ osm_state_mgr_construct(
IN osm_state_mgr_t * const p_mgr )
{
memset( p_mgr, 0, sizeof( *p_mgr ) );
- cl_spinlock_construct( &p_mgr->state_lock );
cl_spinlock_construct( &p_mgr->idle_lock );
p_mgr->state = OSM_SM_STATE_INIT;
}
@@ -99,7 +98,6 @@ osm_state_mgr_destroy(
OSM_LOG_ENTER( p_mgr->p_log, osm_state_mgr_destroy );
/* destroy the locks */
- cl_spinlock_destroy( &p_mgr->state_lock );
cl_spinlock_destroy( &p_mgr->idle_lock );
OSM_LOG_EXIT( p_mgr->p_log );
@@ -162,14 +160,6 @@ osm_state_mgr_init(
p_mgr->state_step_mode = OSM_STATE_STEP_CONTINUOUS;
p_mgr->next_stage_signal = OSM_SIGNAL_NONE;
- status = cl_spinlock_init( &p_mgr->state_lock );
- if( status != CL_SUCCESS )
- {
- osm_log( p_mgr->p_log, OSM_LOG_ERROR,
- "osm_state_mgr_init: ERR 3301: "
- "Spinlock init failed (%s)\n", CL_STATUS_MSG( status ) );
- }
-
cl_qlist_init( &p_mgr->idle_time_list );
status = cl_spinlock_init( &p_mgr->idle_lock );
@@ -1897,16 +1887,6 @@ osm_state_mgr_process(
if( osm_exit_flag )
signal = OSM_SIGNAL_NONE;
- /*
- * The state lock prevents many race conditions from screwing
- * up the state transition process. For example, if an function
- * puts transactions on the wire, the state lock guarantees this
- * loop will see the return code ("DONE PENDING") of the function
- * before the "NO OUTSTANDING TRANSACTIONS" signal is asynchronously
- * received.
- */
- cl_spinlock_acquire( &p_mgr->state_lock );
-
while( signal != OSM_SIGNAL_NONE )
{
if( osm_log_is_active( p_mgr->p_log, OSM_LOG_DEBUG ) )
@@ -2957,8 +2937,6 @@ osm_state_mgr_process(
p_mgr->state_step_mode = OSM_STATE_STEP_BREAK;
}
- cl_spinlock_release( &p_mgr->state_lock );
-
OSM_LOG_EXIT( p_mgr->p_log );
}
@@ -2994,7 +2972,7 @@ osm_state_mgr_process_idle(
cl_qlist_insert_tail( &p_mgr->idle_time_list, &p_idle_item->list_item );
cl_spinlock_release( &p_mgr->idle_lock );
- osm_state_mgr_process( p_mgr, OSM_SIGNAL_IDLE_TIME_PROCESS_REQUEST );
+ osm_sm_signal( &p_mgr->p_subn->p_osm->sm, OSM_SIGNAL_IDLE_TIME_PROCESS_REQUEST );
OSM_LOG_EXIT( p_mgr->p_log );
diff --git a/osm/opensm/osm_state_mgr_ctrl.c b/osm/opensm/osm_state_mgr_ctrl.c
deleted file mode 100644
index 0bde333..0000000
--- a/osm/opensm/osm_state_mgr_ctrl.c
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved.
- * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
- * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses. You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the
- * OpenIB.org BSD license below:
- *
- * Redistribution and use in source and binary forms, with or
- * without modification, are permitted provided that the following
- * conditions are met:
- *
- * - Redistributions of source code must retain the above
- * copyright notice, this list of conditions and the following
- * disclaimer.
- *
- * - Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials
- * provided with the distribution.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * $Id$
- */
-
-
-/*
- * Abstract:
- * Implementation of osm_state_mgr_ctrl_t.
- * This object represents the State Manager Controller object.
- * This object is part of the opensm family of objects.
- *
- * Environment:
- * Linux User Mode
- *
- * $Revision: 1.5 $
- */
-
-/*
- Next available error code: 0x1601
-*/
-
-#if HAVE_CONFIG_H
-# include <config.h>
-#endif /* HAVE_CONFIG_H */
-
-#include <string.h>
-#include <opensm/osm_state_mgr_ctrl.h>
-#include <opensm/osm_msgdef.h>
-
-/**********************************************************************
- **********************************************************************/
-void
-__osm_state_mgr_ctrl_disp_callback(
- IN void *context,
- IN void *p_data )
-{
- /* ignore return status when invoked via the dispatcher */
- osm_state_mgr_process( ((osm_state_mgr_ctrl_t*)context)->p_mgr,
- (osm_signal_t)(p_data) );
-}
-
-/**********************************************************************
- **********************************************************************/
-void
-osm_state_mgr_ctrl_construct(
- IN osm_state_mgr_ctrl_t* const p_ctrl )
-{
- memset( p_ctrl, 0, sizeof(*p_ctrl) );
- p_ctrl->h_disp = CL_DISP_INVALID_HANDLE;
-}
-
-/**********************************************************************
- **********************************************************************/
-void
-osm_state_mgr_ctrl_destroy(
- IN osm_state_mgr_ctrl_t* const p_ctrl )
-{
- CL_ASSERT( p_ctrl );
- cl_disp_unregister( p_ctrl->h_disp );
-}
-
-/**********************************************************************
- **********************************************************************/
-ib_api_status_t
-osm_state_mgr_ctrl_init(
- IN osm_state_mgr_ctrl_t* const p_ctrl,
- IN osm_state_mgr_t* const p_mgr,
- IN osm_log_t* const p_log,
- IN cl_dispatcher_t* const p_disp )
-{
- ib_api_status_t status = IB_SUCCESS;
-
- OSM_LOG_ENTER( p_log, osm_state_mgr_ctrl_init );
-
- osm_state_mgr_ctrl_construct( p_ctrl );
- p_ctrl->p_log = p_log;
-
- p_ctrl->p_mgr = p_mgr;
- p_ctrl->p_disp = p_disp;
-
- p_ctrl->h_disp = cl_disp_register(
- p_disp,
- OSM_MSG_NO_SMPS_OUTSTANDING,
- __osm_state_mgr_ctrl_disp_callback,
- p_ctrl );
-
- if( p_ctrl->h_disp == CL_DISP_INVALID_HANDLE )
- {
- osm_log( p_log, OSM_LOG_ERROR,
- "osm_state_mgr_ctrl_init: ERR 3401: "
- "Dispatcher registration failed\n" );
- status = IB_INSUFFICIENT_RESOURCES;
- goto Exit;
- }
-
- Exit:
- OSM_LOG_EXIT( p_log );
- return( status );
-}
-
diff --git a/osm/opensm/osm_sw_info_rcv.c b/osm/opensm/osm_sw_info_rcv.c
index 6bbd73a..61aff27 100644
--- a/osm/opensm/osm_sw_info_rcv.c
+++ b/osm/opensm/osm_sw_info_rcv.c
@@ -60,6 +60,7 @@ #include <opensm/osm_sw_info_rcv.h>
#include <opensm/osm_log.h>
#include <opensm/osm_switch.h>
#include <opensm/osm_subnet.h>
+#include <opensm/osm_opensm.h>
#include <opensm/osm_helper.h>
/**********************************************************************
@@ -673,7 +674,7 @@ osm_si_rcv_process(
if (__osm_si_rcv_process_existing( p_rcv, p_node, p_sw, p_madw ))
{
CL_PLOCK_RELEASE( p_rcv->p_lock );
- osm_state_mgr_process( p_rcv->p_state_mgr,
+ osm_sm_signal( &p_rcv->p_subn->p_osm->sm,
OSM_SIGNAL_CHANGE_DETECTED );
goto Exit;
}
diff --git a/osm/opensm/osm_sweep_fail_ctrl.c b/osm/opensm/osm_sweep_fail_ctrl.c
index e27a540..9e41ec7 100644
--- a/osm/opensm/osm_sweep_fail_ctrl.c
+++ b/osm/opensm/osm_sweep_fail_ctrl.c
@@ -52,6 +52,8 @@ #endif /* HAVE_CONFIG_H */
#include <string.h>
#include <opensm/osm_sweep_fail_ctrl.h>
#include <opensm/osm_msgdef.h>
+#include <opensm/osm_sm.h>
+#include <opensm/osm_opensm.h>
/**********************************************************************
**********************************************************************/
@@ -68,7 +70,7 @@ __osm_sweep_fail_ctrl_disp_callback(
/*
Notify the state manager that we had a light sweep failure.
*/
- osm_state_mgr_process( p_ctrl->p_state_mgr,
+ osm_sm_signal( &p_ctrl->p_state_mgr->p_subn->p_osm->sm,
OSM_SIGNAL_LIGHT_SWEEP_FAIL );
OSM_LOG_EXIT( p_ctrl->p_log );
diff --git a/osm/opensm/osm_trap_rcv.c b/osm/opensm/osm_trap_rcv.c
index 9865f53..fb32ce9 100644
--- a/osm/opensm/osm_trap_rcv.c
+++ b/osm/opensm/osm_trap_rcv.c
@@ -589,8 +589,7 @@ __osm_trap_rcv_process_request(
p_rcv->p_subn->force_immediate_heavy_sweep = TRUE;
}
- osm_state_mgr_process( p_rcv->p_state_mgr,
- OSM_SIGNAL_SWEEP );
+ osm_sm_signal( &p_rcv->p_subn->p_osm->sm, OSM_SIGNAL_SWEEP );
}
/* If we reached here due to trap 129/130/131 - do not need to do
diff --git a/osm/opensm/osm_vl15intf.c b/osm/opensm/osm_vl15intf.c
index 68f17c5..c3adb6e 100644
--- a/osm/opensm/osm_vl15intf.c
+++ b/osm/opensm/osm_vl15intf.c
@@ -62,6 +62,7 @@ #include <opensm/osm_madw.h>
#include <vendor/osm_vendor_api.h>
#include <opensm/osm_log.h>
#include <opensm/osm_helper.h>
+#include <opensm/osm_opensm.h>
#include <complib/cl_thread.h>
#include <signal.h>
@@ -156,7 +157,6 @@ __osm_vl15_poller(
if( status != IB_SUCCESS )
{
uint32_t outstanding;
- cl_status_t cl_status;
osm_log( p_vl->p_log, OSM_LOG_ERROR,
"__osm_vl15_poller: ERR 3E03: "
@@ -202,27 +202,8 @@ __osm_vl15_poller(
The wire is clean.
Signal the state manager.
*/
- if( osm_log_is_active( p_vl->p_log, OSM_LOG_DEBUG ) )
- {
- osm_log( p_vl->p_log, OSM_LOG_DEBUG,
- "__osm_vl15_poller: "
- "Posting Dispatcher message %s\n",
- osm_get_disp_msg_str( OSM_MSG_NO_SMPS_OUTSTANDING ) );
- }
-
- cl_status = cl_disp_post( p_vl->h_disp,
- OSM_MSG_NO_SMPS_OUTSTANDING,
- (void *)OSM_SIGNAL_NO_PENDING_TRANSACTIONS,
- NULL,
- NULL );
-
- if( cl_status != CL_SUCCESS )
- {
- osm_log( p_vl->p_log, OSM_LOG_ERROR,
- "__osm_vl15_poller: ERR 3E06: "
- "Dispatcher post message failed (%s)\n",
- CL_STATUS_MSG( cl_status ) );
- }
+ osm_sm_signal( &p_vl->p_subn->p_osm->sm,
+ OSM_SIGNAL_NO_PENDING_TRANSACTIONS );
}
}
}
More information about the general
mailing list