return ib_convert_cl_status( cl_status );\r
}\r
#endif\r
- cl_status = cl_async_proc_init( gp_async_proc_mgr, 1, "Althread" );\r
+ cl_status = cl_async_proc_init( gp_async_proc_mgr, 1, "AL_MISC" );\r
if( cl_status != CL_SUCCESS )\r
{\r
AL_PRINT( TRACE_LEVEL_ERROR, AL_DBG_ERROR,\r
al_mgr_t *gp_al_mgr;\r
ib_al_handle_t gh_al;\r
ib_pool_handle_t gh_mad_pool;\r
+void *gp_tmp;\r
+cl_obj_mgr_t *gp_obj_mgr;\r
+\r
\r
\r
ib_api_status_t\r
..\ib_common.c \\r
..\ib_statustext.c\r
\r
-INCLUDES=..;..\..\..\inc;..\..\..\inc\kernel;..\..\bus\kernel\$O;\r
+INCLUDES=..;..\..\..\inc;..\..\..\inc\kernel;..\..\bus\kernel;..\..\bus\kernel\$O;\r
\r
C_DEFINES=$(C_DEFINES) -DDRIVER -DDEPRECATE_DDK_FUNCTIONS \\r
-DEXPORT_AL_SYMBOLS\r
bus_driver.c \\r
bus_pnp.c \\r
bus_port_mgr.c \\r
- bus_iou_mgr.c\r
+ bus_iou_mgr.c \\r
+ bus_stat.c\r
\r
INCLUDES=..\..\..\inc;..\..\..\inc\kernel;..\..\al;..\..\al\kernel;..\..\bus\kernel\$O;\r
\r
\r
/* Store the driver object pointer in the global parameters. */\r
bus_globals.p_driver_obj = p_driver_obj;\r
+ bus_st_init();\r
+ g_stat.drv.p_globals = &bus_globals;\r
\r
/* Get the registry values. */\r
status = __read_registry( p_registry_path );\r
#include "bus_iou_mgr.h"\r
#include "al_dev.h"\r
#include <rdma/verbs.h>\r
+#include "bus_stat.h"\r
\r
/* Safe string functions. */\r
#if WINVER == 0x500\r
PIO_WORKITEM p_po_work_item;\r
/* current PnP state */\r
PNP_DEVICE_STATE pnp_state; /* state for PnP Manager */\r
+ /* statistics */\r
+ PBUS_ST_DEVICE p_stat;\r
\r
} bus_fdo_ext_t;\r
\r
}\r
p_ext->device_power_state = PowerDeviceD0;\r
\r
+ p_ext->p_stat = bus_st_dev_add();\r
+ if ( p_ext->p_stat ) \r
+ p_ext->p_stat->p_fdo = p_ext;\r
+ \r
+\r
lock_control_event();\r
if ( !gp_async_proc_mgr ) {\r
/* Initialize AL */\r
}\r
AL_init_here = TRUE;\r
BUS_TRACE( BUS_DBG_PNP, ("AL initialized\n"));\r
+ /* for debug */\r
+ g_stat.drv.gp_async_obj_mgr = gp_async_obj_mgr;\r
+ g_stat.drv.gp_async_proc_mgr = gp_async_proc_mgr;\r
+ g_stat.drv.gp_async_pnp_mgr = gp_async_pnp_mgr;\r
+ g_stat.drv.gp_al_mgr = gp_al_mgr;\r
+ g_stat.drv.gp_obj_mgr = gp_obj_mgr;\r
}\r
unlock_control_event();\r
\r
NTSTATUS status;\r
bus_filter_t *p_bfi;\r
int ic;\r
+ PBUS_ST_DEVICE p_stat;\r
\r
BUS_ENTER( BUS_DBG_PNP );\r
\r
p_ext = p_dev_obj->DeviceExtension;\r
ic = get_bfi_count();\r
+ p_stat = p_ext->p_stat;\r
\r
p_bfi = p_ext->bus_filter;\r
CL_ASSERT( p_bfi );\r
/* if not last Buf Filter Instance, then exit, otherwise cleanup/shutdown */\r
if ( ic > 0 ) {\r
BUS_TRACE_EXIT( BUS_DBG_PNP, ("%d remaining BusFilters\n", ic ));\r
+ bus_st_dev_rmv( p_stat );\r
return;\r
}\r
\r
}\r
#endif \r
\r
+ bus_st_dev_rmv( p_stat );\r
+\r
BUS_TRACE_EXIT( BUS_DBG_PNP, \r
("=====> IBBUS: fdo_release_resources exited \n") );\r
}\r
--- /dev/null
+/*++
+
+Copyright (c) 2005-2009 Mellanox Technologies. All rights reserved.
+
+Module Name:
+ bus_stat.h
+
+Abstract:
+ Statistics Collector header file
+
+Revision History:
+
+Notes:
+
+--*/
+
+#include "al_debug.h"
+#include "bus_stat.h"
+
+#if defined (EVENT_TRACING)
+#ifdef offsetof
+#undef offsetof
+#endif
+#include "bus_stat.tmh"
+#endif
+
+BUS_ST_STAT g_stat;
+
+void bus_st_dev_rmv( PBUS_ST_DEVICE p_stat )
+{
+ if ( p_stat )
+ p_stat->valid = FALSE;
+}
+
+PBUS_ST_DEVICE bus_st_dev_add()
+{
+ int i;
+
+ for ( i = 0; i < BUS_ST_MAX_DEVICES; ++i ) {
+ if ( g_stat.dev[i].valid == FALSE ) {
+ g_stat.dev[i].valid = TRUE;
+ return &g_stat.dev[i];
+ }
+ }
+
+ return NULL;
+}
+
+void bus_st_init()
+{
+ memset( &g_stat, 0, sizeof(g_stat) );
+}
+
--- /dev/null
+/*++\r
+\r
+Copyright (c) 2005-2009 Mellanox Technologies. All rights reserved.\r
+\r
+Module Name:\r
+ bus_stat.h\r
+\r
+Abstract:\r
+ Statistics Collector header file\r
+\r
+Revision History:\r
+\r
+Notes:\r
+\r
+--*/\r
+\r
+#pragma once\r
+\r
+#include <ntddk.h>\r
+#include "al_mgr.h"\r
+//\r
+// restrictions\r
+//\r
+\r
+#define BUS_ST_MAX_DEVICES 8\r
+\r
+//\r
+// enums\r
+// \r
+\r
+//\r
+// structures\r
+//\r
+\r
+// device\r
+\r
+typedef struct _bus_fdo_ext bus_fdo_ext_t;\r
+typedef struct _bus_globals bus_globals_t;\r
+typedef struct _al_mgr al_mgr_t;\r
+\r
+\r
+\r
+typedef struct _BUS_ST_DEVICE\r
+{\r
+ boolean_t valid;\r
+ bus_fdo_ext_t *p_fdo;\r
+ \r
+} BUS_ST_DEVICE, *PBUS_ST_DEVICE;\r
+\r
+// driver\r
+typedef struct _BUS_ST_DRIVER\r
+{\r
+ bus_globals_t *p_globals;\r
+ cl_obj_mgr_t *gp_obj_mgr;\r
+ cl_async_proc_t *gp_async_proc_mgr;\r
+ cl_async_proc_t *gp_async_pnp_mgr;\r
+ cl_async_proc_t *gp_async_obj_mgr;\r
+ al_mgr_t *gp_al_mgr;\r
+ \r
+} BUS_ST_DRIVER, *PBUS_ST_DRIVER;\r
+\r
+// driver stack\r
+\r
+typedef struct _BUS_ST_STAT\r
+{\r
+ BUS_ST_DRIVER drv;\r
+ BUS_ST_DEVICE dev[BUS_ST_MAX_DEVICES];\r
+ \r
+} BUS_ST_STAT, *PBUS_ST_STAT;\r
+\r
+extern BUS_ST_STAT g_stat;\r
+\r
+//\r
+// functions \r
+//\r
+\r
+void bus_st_dev_rmv( PBUS_ST_DEVICE p_stat );\r
+\r
+PBUS_ST_DEVICE bus_st_dev_add();\r
+\r
+void bus_st_init();\r
+\r
+\r
+\r
* will signal all the threads.\r
*/\r
cl_atomic_inc( &p_thread_pool->running_count );\r
+\r
+ /* for debug only */\r
+ if ( i < sizeof(p_thread_pool->p_thread)/sizeof(cl_thread_t*) )\r
+ p_thread_pool->p_thread[i] = p_thread;\r
}\r
p_thread_pool->state = CL_INITIALIZED;\r
return( CL_SUCCESS );\r
* $Id$\r
*/\r
\r
-\r
#include "complib/cl_thread.h"\r
\r
\r
CL_ASSERT( p_thread && pfn_callback );\r
CL_ASSERT( KeGetCurrentIrql() == PASSIVE_LEVEL );\r
\r
- UNUSED_PARAM( name );\r
-\r
cl_thread_construct( p_thread );\r
\r
p_thread->pfn_callback = pfn_callback;\r
p_thread->context = context;\r
+ strncpy( &p_thread->name[0], name, sizeof(p_thread->name) );\r
\r
/* Create a new thread, storing both the handle and thread id. */\r
InitializeObjectAttributes( &attr, NULL, OBJ_KERNEL_HANDLE, NULL, NULL );\r
IN const cl_thread_t* const p_thread )\r
{\r
return( p_thread->osd.p_thread == KeGetCurrentThread() );\r
-}
\ No newline at end of file
+}\r
boolean_t exit;\r
cl_state_t state;\r
atomic32_t running_count;\r
+ // for debug\r
+ cl_thread_t *p_thread[8];\r
\r
} cl_thread_pool_t;\r
/*\r
ipoib_endpoint.c \\r
ipoib_port.c \\r
ipoib_ibat.c \\r
- ipoib_xfr_mgr.c\r
+ ipoib_xfr_mgr.c \\r
+ ipoib_stat.c\r
\r
INCLUDES=..;..\..\..\inc;..\..\..\inc\kernel;\r
\r
#include <complib/cl_vector.h>\r
#include <ip_packet.h>\r
#include "ip_stats.h"\r
+#include "ipoib_stat.h"\r
\r
\r
/*\r
\r
cl_perf_t perf;\r
ib_al_ifc_t *p_ifc;\r
+ PIPOIB_ST_DEVICE p_stat;\r
\r
} ipoib_adapter_t;\r
/*\r
\r
KeInitializeSpinLock( &g_ipoib.lock );\r
cl_qlist_init( &g_ipoib.adapter_list );\r
+ ipoib_st_init();\r
+ g_stat.drv.obj = p_drv_obj;\r
\r
NdisMInitializeWrapper(\r
&g_ipoib.h_ndis_wrapper, p_drv_obj, p_registry_path, NULL );\r
return NDIS_STATUS_FAILURE;\r
}\r
\r
+ p_adapter->p_stat = ipoib_st_dev_add();\r
+ if ( p_adapter->p_stat ) \r
+ p_adapter->p_stat->p_adapter = p_adapter;\r
+ \r
ipoib_ref_ibat();\r
\r
IPOIB_PRINT_EXIT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT, \r
IN NDIS_HANDLE adapter_context )\r
{\r
ipoib_adapter_t *p_adapter;\r
+ PIPOIB_ST_DEVICE p_stat;\r
\r
IPOIB_ENTER( IPOIB_DBG_INIT );\r
\r
\r
CL_ASSERT( adapter_context );\r
p_adapter = (ipoib_adapter_t*)adapter_context;\r
+ p_stat = p_adapter->p_stat;\r
\r
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
("Port %016I64x (CA %016I64x port %d) halting\n",\r
p_adapter->guids.port_num) );\r
\r
ipoib_destroy_adapter( p_adapter );\r
+ ipoib_st_dev_rmv( p_stat );\r
\r
IPOIB_PRINT_EXIT(TRACE_LEVEL_WARNING, IPOIB_DBG_INIT, \r
("=====> ipoib_halt exited\n"));\r
cl_obj_unlock( &p_adapter->obj );\r
\r
ipoib_resume_oids( p_adapter );\r
+ p_adapter->p_stat->n_pnp_irps++;\r
}\r
+ else \r
+ p_adapter->p_stat->n_power_irps++;\r
\r
IPOIB_PRINT_EXIT(TRACE_LEVEL_WARNING, IPOIB_DBG_PNP, \r
("=====> ipoib_pnp_notify exited, PnP event %d\n", pnp_event));\r
--- /dev/null
+#include "ipoib_adapter.h"
+#include "ipoib_debug.h"
+
+#if defined (EVENT_TRACING)
+#ifdef offsetof
+#undef offsetof
+#endif
+#include "ipoib_stat.tmh"
+#endif
+
+IPOIB_ST_STAT g_stat;
+
+void ipoib_st_dev_rmv( PIPOIB_ST_DEVICE p_stat )
+{
+ if ( p_stat )
+ p_stat->valid = FALSE;
+}
+
+PIPOIB_ST_DEVICE ipoib_st_dev_add()
+{
+ int i;
+
+ for ( i = 0; i < IPOIB_ST_MAX_DEVICES; ++i ) {
+ if ( g_stat.dev[i].valid == FALSE ) {
+ g_stat.dev[i].valid = TRUE;
+ return &g_stat.dev[i];
+ }
+ }
+
+ return NULL;
+}
+
+void ipoib_st_init()
+{
+ memset( &g_stat, 0, sizeof(g_stat) );
+}
+
--- /dev/null
+/*++\r
+\r
+Copyright (c) 2005-2009 Mellanox Technologies. All rights reserved.\r
+\r
+Module Name:\r
+ ipoib_stat.h\r
+\r
+Abstract:\r
+ Statistics Collector header file\r
+\r
+Revision History:\r
+\r
+Notes:\r
+\r
+--*/\r
+\r
+#pragma once\r
+\r
+#include <ntddk.h>\r
+\r
+//\r
+// restrictions\r
+//\r
+\r
+#define IPOIB_ST_MAX_DEVICES 8\r
+\r
+//\r
+// enums\r
+// \r
+\r
+//\r
+// structures\r
+//\r
+\r
+// device\r
+typedef struct _ipoib_adapter ipoib_adapter_t;\r
+\r
+typedef struct _IPOIB_ST_DEVICE\r
+{\r
+ boolean_t valid;\r
+ ipoib_adapter_t *p_adapter;\r
+ int n_power_irps; // NdisDevicePnPEventPowerProfileChanged \r
+ int n_pnp_irps; // NdisDevicePnPEventSurpriseRemoved \r
+ \r
+} IPOIB_ST_DEVICE, *PIPOIB_ST_DEVICE;\r
+\r
+// driver\r
+typedef struct _IPOIB_ST_DRIVER\r
+{\r
+ PDRIVER_OBJECT obj;\r
+ \r
+} IPOIB_ST_DRIVER, *PIPOIB_ST_DRIVER;\r
+\r
+// driver stack\r
+\r
+typedef struct _IPOIB_ST_STAT\r
+{\r
+ IPOIB_ST_DRIVER drv;\r
+ IPOIB_ST_DEVICE dev[IPOIB_ST_MAX_DEVICES];\r
+ \r
+} IPOIB_ST_STAT, *PIPOIB_ST_STAT;\r
+\r
+extern IPOIB_ST_STAT g_stat;\r
+\r
+//\r
+// functions \r
+//\r
+\r
+void ipoib_st_dev_rmv( PIPOIB_ST_DEVICE p_stat );\r
+\r
+PIPOIB_ST_DEVICE ipoib_st_dev_add();\r
+\r
+void ipoib_st_init();\r
+\r
+\r
+\r