[ofa-general] [PATCH RFC] opensm: use malloc instead of cl_qlock_pool in osm_mad_pool.c
Sasha Khapyorsky
sashak at voltaire.com
Sun Dec 9 06:24:40 PST 2007
Use regular malloc/free instead of cl_qlock_pool allocator in
osm_mad_pool.c. malloc() is more than twice faster than cl_qlock_pool
analogs and using this doesn't require any locking.
Signed-off-by: Sasha Khapyorsky <sashak at voltaire.com>
---
opensm/include/opensm/osm_mad_pool.h | 7 +---
opensm/include/opensm/osm_madw.h | 80 +++-------------------------------
opensm/opensm/osm_mad_pool.c | 56 ++++--------------------
opensm/opensm/osm_vl15intf.c | 6 +-
4 files changed, 20 insertions(+), 129 deletions(-)
diff --git a/opensm/include/opensm/osm_mad_pool.h b/opensm/include/opensm/osm_mad_pool.h
index 9ec0a7a..b8421b9 100644
--- a/opensm/include/opensm/osm_mad_pool.h
+++ b/opensm/include/opensm/osm_mad_pool.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved.
+ * Copyright (c) 2004-2007 Voltaire, Inc. All rights reserved.
* Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
* Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
*
@@ -50,7 +50,6 @@
#include <iba/ib_types.h>
#include <complib/cl_atomic.h>
-#include <complib/cl_qlockpool.h>
#include <opensm/osm_base.h>
#include <vendor/osm_vendor.h>
#include <opensm/osm_madw.h>
@@ -97,7 +96,6 @@ BEGIN_C_DECLS
*/
typedef struct _osm_mad_pool {
osm_log_t *p_log;
- cl_qlock_pool_t madw_pool;
atomic32_t mads_out;
} osm_mad_pool_t;
/*
@@ -105,9 +103,6 @@ typedef struct _osm_mad_pool {
* p_log
* Pointer to the log object.
*
-* lock
-* Spinlock guarding the pool.
-*
* mads_out
* Running total of the number of MADs outstanding.
*
diff --git a/opensm/include/opensm/osm_madw.h b/opensm/include/opensm/osm_madw.h
index d4bcbc1..31707ad 100644
--- a/opensm/include/opensm/osm_madw.h
+++ b/opensm/include/opensm/osm_madw.h
@@ -409,7 +409,7 @@ typedef struct _osm_mad_addr {
* SYNOPSIS
*/
typedef struct _osm_madw {
- cl_pool_item_t pool_item;
+ cl_list_item_t list_item;
osm_bind_handle_t h_bind;
osm_vend_wrap_t vend_wrap;
osm_mad_addr_t mad_addr;
@@ -423,8 +423,8 @@ typedef struct _osm_madw {
} osm_madw_t;
/*
* FIELDS
-* pool_item
-* List linkage for pools and lists. MUST BE FIRST MEMBER!
+* list_item
+* List linkage for lists. MUST BE FIRST MEMBER!
*
* h_bind
* Bind handle for the port on which this MAD will be sent
@@ -467,72 +467,6 @@ typedef struct _osm_madw {
* SEE ALSO
*********/
-/****f* OpenSM: MAD Wrapper/osm_madw_construct
-* NAME
-* osm_madw_construct
-*
-* DESCRIPTION
-* This function constructs a MAD Wrapper object.
-*
-* SYNOPSIS
-*/
-static inline void osm_madw_construct(IN osm_madw_t * const p_madw)
-{
- /*
- Don't touch the pool_item since that is an opaque object.
- Clear all other objects in the mad wrapper.
- */
- memset(((uint8_t *) p_madw) + sizeof(cl_pool_item_t), 0,
- sizeof(*p_madw) - sizeof(cl_pool_item_t));
-}
-
-/*
-* PARAMETERS
-* p_madw
-* [in] Pointer to a MAD Wrapper object to construct.
-*
-* RETURN VALUE
-* This function does not return a value.
-*
-* NOTES
-* Allows calling osm_madw_init, osm_madw_destroy
-*
-* Calling osm_madw_construct is a prerequisite to calling any other
-* method except osm_madw_init.
-*
-* SEE ALSO
-* MAD Wrapper object, osm_madw_init, osm_madw_destroy
-*********/
-
-/****f* OpenSM: MAD Wrapper/osm_madw_destroy
-* NAME
-* osm_madw_destroy
-*
-* DESCRIPTION
-* The osm_madw_destroy function destroys a node, releasing
-* all resources.
-*
-* SYNOPSIS
-*/
-void osm_madw_destroy(IN osm_madw_t * const p_madw);
-/*
-* PARAMETERS
-* p_madw
-* [in] Pointer to a MAD Wrapper object to destroy.
-*
-* RETURN VALUE
-* This function does not return a value.
-*
-* NOTES
-* Performs any necessary cleanup of the specified MAD Wrapper object.
-* Further operations should not be attempted on the destroyed object.
-* This function should only be called after a call to osm_madw_construct or
-* osm_madw_init.
-*
-* SEE ALSO
-* MAD Wrapper object, osm_madw_construct, osm_madw_init
-*********/
-
/****f* OpenSM: MAD Wrapper/osm_madw_init
* NAME
* osm_madw_init
@@ -548,7 +482,7 @@ osm_madw_init(IN osm_madw_t * const p_madw,
IN const uint32_t mad_size,
IN const osm_mad_addr_t * const p_mad_addr)
{
- osm_madw_construct(p_madw);
+ memset(p_madw, 0, sizeof(*p_madw));
p_madw->h_bind = h_bind;
p_madw->fail_msg = CL_DISP_MSGID_NONE;
p_madw->mad_size = mad_size;
@@ -602,7 +536,7 @@ static inline ib_smp_t *osm_madw_get_smp_ptr(IN const osm_madw_t * const p_madw)
* NOTES
*
* SEE ALSO
-* MAD Wrapper object, osm_madw_construct, osm_madw_destroy
+* MAD Wrapper object
*********/
/****f* OpenSM: MAD Wrapper/osm_madw_get_sa_mad_ptr
@@ -631,7 +565,7 @@ static inline ib_sa_mad_t *osm_madw_get_sa_mad_ptr(IN const osm_madw_t *
* NOTES
*
* SEE ALSO
-* MAD Wrapper object, osm_madw_construct, osm_madw_destroy
+* MAD Wrapper object
*********/
/****f* OpenSM: MAD Wrapper/osm_madw_get_perfmgt_mad_ptr
@@ -657,7 +591,7 @@ static inline ib_perfmgt_mad_t *osm_madw_get_perfmgt_mad_ptr(IN const osm_madw_t
* NOTES
*
* SEE ALSO
-* MAD Wrapper object, osm_madw_construct, osm_madw_destroy
+* MAD Wrapper object
*********/
/****f* OpenSM: MAD Wrapper/osm_madw_get_ni_context_ptr
diff --git a/opensm/opensm/osm_mad_pool.c b/opensm/opensm/osm_mad_pool.c
index c3f3f2a..f9ef54c 100644
--- a/opensm/opensm/osm_mad_pool.c
+++ b/opensm/opensm/osm_mad_pool.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved.
+ * Copyright (c) 2004-2007 Voltaire, Inc. All rights reserved.
* Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
* Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
*
@@ -56,24 +56,6 @@
#include <opensm/osm_log.h>
#include <vendor/osm_vendor_api.h>
-#define OSM_MAD_POOL_MIN_SIZE 256
-#define OSM_MAD_POOL_GROW_SIZE 256
-
-/**********************************************************************
- **********************************************************************/
-cl_status_t
-__osm_mad_pool_ctor(IN void *const p_object,
- IN void *context, OUT cl_pool_item_t ** const pp_pool_item)
-{
- osm_madw_t *p_madw = p_object;
-
- UNUSED_PARAM(context);
- osm_madw_construct(p_madw);
- /* CHECK THIS. DOCS DON'T DESCRIBE THIS OUT PARAM. */
- *pp_pool_item = &p_madw->pool_item;
- return (CL_SUCCESS);
-}
-
/**********************************************************************
**********************************************************************/
void osm_mad_pool_construct(IN osm_mad_pool_t * const p_pool)
@@ -81,7 +63,6 @@ void osm_mad_pool_construct(IN osm_mad_pool_t * const p_pool)
CL_ASSERT(p_pool);
memset(p_pool, 0, sizeof(*p_pool));
- cl_qlock_pool_construct(&p_pool->madw_pool);
}
/**********************************************************************
@@ -89,9 +70,6 @@ void osm_mad_pool_construct(IN osm_mad_pool_t * const p_pool)
void osm_mad_pool_destroy(IN osm_mad_pool_t * const p_pool)
{
CL_ASSERT(p_pool);
-
- /* HACK: we still rarely see some mads leaking - so ignore this */
- /* cl_qlock_pool_destroy( &p_pool->madw_pool ); */
}
/**********************************************************************
@@ -99,29 +77,12 @@ void osm_mad_pool_destroy(IN osm_mad_pool_t * const p_pool)
ib_api_status_t
osm_mad_pool_init(IN osm_mad_pool_t * const p_pool, IN osm_log_t * const p_log)
{
- ib_api_status_t status;
-
OSM_LOG_ENTER(p_log, osm_mad_pool_init);
p_pool->p_log = p_log;
- status = cl_qlock_pool_init(&p_pool->madw_pool,
- OSM_MAD_POOL_MIN_SIZE,
- 0,
- OSM_MAD_POOL_GROW_SIZE,
- sizeof(osm_madw_t),
- __osm_mad_pool_ctor, NULL, p_pool);
- if (status != IB_SUCCESS) {
- osm_log(p_log, OSM_LOG_ERROR,
- "osm_mad_pool_init: ERR 0702: "
- "Grow pool initialization failed (%s)\n",
- ib_get_err_str(status));
- goto Exit;
- }
-
- Exit:
OSM_LOG_EXIT(p_log);
- return (status);
+ return IB_SUCCESS;
}
/**********************************************************************
@@ -142,7 +103,7 @@ osm_madw_t *osm_mad_pool_get(IN osm_mad_pool_t * const p_pool,
/*
First, acquire a mad wrapper from the mad wrapper pool.
*/
- p_madw = (osm_madw_t *) cl_qlock_pool_get(&p_pool->madw_pool);
+ p_madw = malloc(sizeof(*p_madw));
if (p_madw == NULL) {
osm_log(p_pool->p_log, OSM_LOG_ERROR,
"osm_mad_pool_get: ERR 0703: "
@@ -162,8 +123,7 @@ osm_madw_t *osm_mad_pool_get(IN osm_mad_pool_t * const p_pool,
"Unable to acquire wire MAD\n");
/* Don't leak wrappers! */
- cl_qlock_pool_put(&p_pool->madw_pool,
- (cl_pool_item_t *) p_madw);
+ free(p_madw);
p_madw = NULL;
goto Exit;
}
@@ -202,7 +162,7 @@ osm_madw_t *osm_mad_pool_get_wrapper(IN osm_mad_pool_t * const p_pool,
/*
First, acquire a mad wrapper from the mad wrapper pool.
*/
- p_madw = (osm_madw_t *) cl_qlock_pool_get(&p_pool->madw_pool);
+ p_madw = malloc(sizeof(*p_madw));
if (p_madw == NULL) {
osm_log(p_pool->p_log, OSM_LOG_ERROR,
"osm_mad_pool_get_wrapper: ERR 0705: "
@@ -234,7 +194,9 @@ osm_madw_t *osm_mad_pool_get_wrapper_raw(IN osm_mad_pool_t * const p_pool)
OSM_LOG_ENTER(p_pool->p_log, osm_mad_pool_get_wrapper_raw);
- p_madw = (osm_madw_t *) cl_qlock_pool_get(&p_pool->madw_pool);
+ p_madw = malloc(sizeof(*p_madw));
+ if (!p_madw)
+ return NULL;
osm_log(p_pool->p_log, OSM_LOG_DEBUG,
"osm_mad_pool_get_wrapper_raw: "
@@ -270,7 +232,7 @@ osm_mad_pool_put(IN osm_mad_pool_t * const p_pool, IN osm_madw_t * const p_madw)
/*
Return the mad wrapper to the wrapper pool
*/
- cl_qlock_pool_put(&p_pool->madw_pool, (cl_pool_item_t *) p_madw);
+ free(p_madw);
cl_atomic_dec(&p_pool->mads_out);
OSM_LOG_EXIT(p_pool->p_log);
diff --git a/opensm/opensm/osm_vl15intf.c b/opensm/opensm/osm_vl15intf.c
index 74e749f..5d10ed6 100644
--- a/opensm/opensm/osm_vl15intf.c
+++ b/opensm/opensm/osm_vl15intf.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved.
+ * Copyright (c) 2004-2007 Voltaire, Inc. All rights reserved.
* Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
* Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
*
@@ -340,10 +340,10 @@ void osm_vl15_post(IN osm_vl15_t * const p_vl, IN osm_madw_t * const p_madw)
*/
cl_spinlock_acquire(&p_vl->lock);
if (p_madw->resp_expected == TRUE) {
- cl_qlist_insert_tail(&p_vl->rfifo, (cl_list_item_t *) p_madw);
+ cl_qlist_insert_tail(&p_vl->rfifo, &p_madw->list_item);
cl_atomic_inc(&p_vl->p_stats->qp0_mads_outstanding);
} else
- cl_qlist_insert_tail(&p_vl->ufifo, (cl_list_item_t *) p_madw);
+ cl_qlist_insert_tail(&p_vl->ufifo, &p_madw->list_item);
cl_spinlock_release(&p_vl->lock);
if (osm_log_is_active(p_vl->p_log, OSM_LOG_DEBUG))
--
1.5.3.rc2.29.gc4640f
More information about the general
mailing list