From: sleybo Date: Tue, 28 Nov 2006 07:27:28 +0000 (+0000) Subject: [IBAL\IOU\INC] support 2 HCAs that connect to the same IOC/IOU. X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=649e05653c384c50fdc6c460f06fe99bd599a5ea;p=~shefty%2Frdma-win.git [IBAL\IOU\INC] support 2 HCAs that connect to the same IOC/IOU. - rcontext_map changed from qmap to fmap IOC/IOU key is 128 bits (IOC guid and ca guid) CA\PORT key is 64 bits (guid) - start new sweep only if the query_cnt is 0. - IOC uniqe_id is 128 bits and construct from IOC guid and ca guid. - fix prints git-svn-id: svn://openib.tc.cornell.edu/gen1@550 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- diff --git a/trunk/core/al/al_pnp.h b/trunk/core/al/al_pnp.h index 5b788ab3..4c56edb4 100644 --- a/trunk/core/al/al_pnp.h +++ b/trunk/core/al/al_pnp.h @@ -38,7 +38,7 @@ #include "al_ca.h" #include #include -#include +#include extern char* ib_pnp_event_str[]; @@ -54,7 +54,7 @@ typedef struct _al_pnp cl_list_item_t list_item; cl_async_proc_item_t dereg_item; ib_pnp_class_t pnp_class; - cl_qmap_t context_map; + cl_fmap_t context_map; IRP *p_rearm_irp; IRP *p_dereg_irp; #else /* defined( CL_KERNEL ) */ @@ -99,8 +99,9 @@ typedef struct _al_pnp typedef struct _al_pnp_context { /* List item must be first. */ - cl_map_item_t map_item; + cl_fmap_item_t map_item; ib_net64_t guid; + ib_net64_t ca_guid; const void *context; } al_pnp_context_t; @@ -195,13 +196,13 @@ pnp_poll( al_pnp_context_t* pnp_create_context( IN al_pnp_t* const p_reg, - IN const net64_t guid ); + IN const void* const p_key ); /******/ al_pnp_context_t* pnp_get_context( IN const al_pnp_t* const p_reg, - IN const ib_net64_t guid ); + IN const void* const p_key ); void pnp_reg_complete( diff --git a/trunk/core/al/kernel/al_ioc_pnp.c b/trunk/core/al/kernel/al_ioc_pnp.c index 3cfee0b3..20e14b8f 100644 --- a/trunk/core/al/kernel/al_ioc_pnp.c +++ b/trunk/core/al/kernel/al_ioc_pnp.c @@ -1223,7 +1223,7 @@ __ioc_pnp_cb( case IB_PNP_SM_CHANGE: case IB_PNP_PORT_ACTIVE: /* Initiate a sweep - delay a bit to allow the ports to come up. */ - if( g_ioc_poll_interval ) + if( g_ioc_poll_interval && !gp_ioc_pnp->query_cnt) { cl_status = cl_timer_start( &gp_ioc_pnp->sweep_timer, 250 ); CL_ASSERT( cl_status == CL_SUCCESS ); @@ -2926,23 +2926,28 @@ __notify_users( { case IB_PNP_IOU_ADD: CL_ASSERT( pnp_get_class( p_reg->pnp_class ) == IB_PNP_IOU ); - p_context = pnp_create_context( p_reg, p_event->p_rec->guid ); + p_context = pnp_create_context( p_reg, &p_event->p_rec->guid); break; case IB_PNP_IOU_REMOVE: CL_ASSERT( pnp_get_class( p_reg->pnp_class ) == IB_PNP_IOU ); /* Lookup the context for this IOU. */ - p_context = pnp_get_context( p_reg, p_event->p_rec->guid ); + p_context = pnp_get_context( p_reg, &p_event->p_rec->guid ); break; case IB_PNP_IOC_ADD: CL_ASSERT( pnp_get_class( p_reg->pnp_class ) == IB_PNP_IOC ); - p_context = pnp_create_context( p_reg, p_event->p_rec->guid ); + p_context = pnp_create_context( p_reg, &p_event->p_rec->guid); break; - - default: + case IB_PNP_IOC_PATH_ADD: + case IB_PNP_IOC_PATH_REMOVE: CL_ASSERT( pnp_get_class( p_reg->pnp_class ) == IB_PNP_IOC ); - p_context = pnp_get_context( p_reg, p_event->p_rec->guid ); + p_context = pnp_get_context( p_reg, &p_event->p_rec->guid ); + break; + default: + AL_PRINT_EXIT(TRACE_LEVEL_WARNING, AL_DBG_PNP,("Invalid PnP event %#x\n", + p_event->p_rec->pnp_event)); + return CL_NOT_DONE; break; } if( !p_context ) @@ -2958,7 +2963,7 @@ __notify_users( p_event->p_rec->pnp_event == IB_PNP_IOU_REMOVE || p_event->p_rec->pnp_event == IB_PNP_IOC_REMOVE ) { - cl_qmap_remove_item( &p_reg->context_map, &p_context->map_item ); + cl_fmap_remove_item( &p_reg->context_map, &p_context->map_item ); cl_free( p_context ); } else @@ -2993,7 +2998,10 @@ __report_iou_add( } p_rec->pnp_rec.pnp_event = IB_PNP_IOU_ADD; p_rec->pnp_rec.guid = p_iou->guid; + p_rec->pnp_rec.ca_guid = p_iou->ca_guid; + p_rec->ca_guid = p_iou->ca_guid; + p_rec->guid = p_iou->guid; p_rec->vend_id = p_iou->vend_id; p_rec->dev_id = p_iou->dev_id; p_rec->revision = p_iou->revision; @@ -3086,6 +3094,8 @@ __report_ioc_add( p_rec->pnp_rec.pnp_event = IB_PNP_IOC_ADD; p_rec->pnp_rec.guid = p_ioc->profile.ioc_guid; + p_rec->pnp_rec.ca_guid = p_ioc->p_iou->ca_guid; + p_rec->ca_guid = p_ioc->p_iou->ca_guid; cl_memcpy( p_rec->svc_entry_array, p_ioc->p_svc_entries, p_ioc->profile.num_svc_entries * sizeof(ib_svc_entry_t) ); @@ -3178,14 +3188,14 @@ __report_path( p_rec = (ib_pnp_ioc_path_rec_t*)cl_zalloc( event.rec_size * 2 ); if( !p_rec ) return; - + p_rec->pnp_rec.pnp_event = pnp_event; + p_rec->pnp_rec.guid = p_ioc->profile.ioc_guid; + p_rec->pnp_rec.ca_guid = p_path->ca_guid; + p_rec->ca_guid = p_path->ca_guid; p_rec->port_guid = p_path->port_guid; p_rec->path = p_path->rec; - p_rec->pnp_rec.pnp_event = pnp_event; - p_rec->pnp_rec.guid = p_ioc->profile.ioc_guid; - event.p_rec = (ib_pnp_rec_t*)p_rec; event.p_user_rec = (ib_pnp_rec_t*)(((uint8_t*)p_rec) + event.rec_size); diff --git a/trunk/core/al/kernel/al_pnp.c b/trunk/core/al/kernel/al_pnp.c index bd0910dc..5dd72c7b 100644 --- a/trunk/core/al/kernel/al_pnp.c +++ b/trunk/core/al/kernel/al_pnp.c @@ -83,6 +83,33 @@ __pnp_free( IN al_obj_t *p_obj ); +/* + * Compares two context for inserts/lookups in a flexi map. Keys are the + * address of the reg guid1, which is adjacent to the context guid2 (if exist). + * This allows for a single call to cl_memcmp. + */ +static intn_t +__context_cmp128( + IN const void* const p_key1, + IN const void* const p_key2 ) +{ + return cl_memcmp( p_key1, p_key2, sizeof(uint64_t) * 2 ); +} + +/* + * Compares two context for inserts/lookups in a flexi map. Keys are the + * address of the reg guid1, which is adjacent to the context guid2 (if exist). + * This allows for a single call to cl_memcmp. + */ +static intn_t +__context_cmp64( + IN const void* const p_key1, + IN const void* const p_key2 ) +{ + return cl_memcmp( p_key1, p_key2, sizeof(uint64_t) ); +} + + /* * Event structures for queuing to the async proc manager. */ @@ -291,7 +318,7 @@ __pnp_reg_cleanup( IN al_obj_t *p_obj ) { al_pnp_t *p_reg; - cl_map_item_t *p_item; + cl_fmap_item_t *p_item; IRP *p_irp; AL_ENTER( AL_DBG_PNP ); @@ -299,10 +326,10 @@ __pnp_reg_cleanup( p_reg = PARENT_STRUCT( p_obj, al_pnp_t, obj ); /* Cleanup the context list. */ - while( cl_qmap_count( &p_reg->context_map ) ) + while( cl_fmap_count( &p_reg->context_map ) ) { - p_item = cl_qmap_tail( &p_reg->context_map ); - cl_qmap_remove_item( &p_reg->context_map, p_item ); + p_item = cl_fmap_tail( &p_reg->context_map ); + cl_fmap_remove_item( &p_reg->context_map, p_item ); cl_free( p_item ); } @@ -338,17 +365,17 @@ __pnp_reg_free( IN al_obj_t *p_obj ) { al_pnp_t *p_reg; - cl_map_item_t *p_item; + cl_fmap_item_t *p_item; AL_ENTER( AL_DBG_PNP ); p_reg = PARENT_STRUCT( p_obj, al_pnp_t, obj ); /* Cleanup the context list. */ - while( cl_qmap_count( &p_reg->context_map ) ) + while( cl_fmap_count( &p_reg->context_map ) ) { - p_item = cl_qmap_tail( &p_reg->context_map ); - cl_qmap_remove_item( &p_reg->context_map, p_item ); + p_item = cl_fmap_tail( &p_reg->context_map ); + cl_fmap_remove_item( &p_reg->context_map, p_item ); cl_free( p_item ); } @@ -373,15 +400,15 @@ __pnp_reg_free( al_pnp_context_t* pnp_get_context( IN const al_pnp_t* const p_reg, - IN const ib_net64_t guid ) + IN const void* const p_key ) { - cl_map_item_t *p_context_item; + cl_fmap_item_t *p_context_item; AL_ENTER( AL_DBG_PNP ); /* Search the context list for this CA. */ - p_context_item = cl_qmap_get( &p_reg->context_map, guid ); - if( p_context_item != cl_qmap_end( &p_reg->context_map ) ) + p_context_item = cl_fmap_get( &p_reg->context_map, p_key ); + if( p_context_item != cl_fmap_end( &p_reg->context_map ) ) { AL_EXIT( AL_DBG_PNP ); return PARENT_STRUCT( p_context_item, al_pnp_context_t, map_item ); @@ -529,7 +556,7 @@ __pnp_notify_user( } else { - cl_qmap_remove_item( &p_reg->context_map, &p_context->map_item ); + cl_fmap_remove_item( &p_reg->context_map, &p_context->map_item ); cl_free( p_context ); } @@ -545,10 +572,10 @@ __pnp_notify_user( al_pnp_context_t* pnp_create_context( IN al_pnp_t* const p_reg, - IN const net64_t guid ) + IN const void* const p_key ) { al_pnp_context_t *p_context; - cl_map_item_t *p_item; + cl_fmap_item_t *p_item; AL_ENTER( AL_DBG_PNP ); @@ -563,14 +590,20 @@ pnp_create_context( sizeof(al_pnp_context_t)) ); return NULL; } - /* Store the GUID in the context record. */ - p_context->guid = guid; + cl_memcpy(&p_context->guid, p_key, sizeof(ib_net64_t) * 2); /* Add the context to the context list. */ - p_item = cl_qmap_insert( &p_reg->context_map, p_context->guid, + p_item = cl_fmap_insert( &p_reg->context_map, &p_context->guid, &p_context->map_item ); - + if( p_item != &p_context->map_item ) + { + AL_PRINT( TRACE_LEVEL_INFORMATION, AL_DBG_PNP, + ("p_context is already in context map %I64x \n",p_context->guid)); + p_context = NULL; + } + + AL_EXIT( AL_DBG_PNP ); return p_context; } @@ -603,7 +636,7 @@ __pnp_port_notify( p_port_attr += event_rec.port_index; /* Create a new context for user port information. */ - p_context = pnp_create_context( p_reg, p_port_attr->port_guid ); + p_context = pnp_create_context( p_reg, &p_port_attr->port_guid); if( !p_context ) continue; @@ -674,7 +707,7 @@ __pnp_reg_notify( case IB_PNP_CA: event_rec.pnp_event = IB_PNP_CA_ADD; p_context = pnp_create_context( p_reg, - event_rec.p_ci_ca->p_pnp_attr->ca_guid ); + &event_rec.p_ci_ca->p_pnp_attr->ca_guid); if( !p_context ) break; @@ -803,7 +836,19 @@ al_reg_pnp( /* Initialize the registration info. */ construct_al_obj( &p_reg->obj, AL_OBJ_TYPE_H_PNP ); - cl_qmap_init( &p_reg->context_map ); + switch(pnp_get_class(p_pnp_req->pnp_class)){ + case IB_PNP_IOU: + case IB_PNP_IOC: + cl_fmap_init( &p_reg->context_map, __context_cmp128 ); + break; + case IB_PNP_PORT: + case IB_PNP_CA: + cl_fmap_init( &p_reg->context_map, __context_cmp64 ); + break; + default: + AL_PRINT( TRACE_LEVEL_ERROR, AL_DBG_ERROR, + ("unknown pnp_class 0x%x.\n", pnp_get_class(p_pnp_req->pnp_class))); + } status = init_al_obj( &p_reg->obj, p_pnp_req->pnp_context, TRUE, __pnp_reg_destroying, __pnp_reg_cleanup, __pnp_reg_free ); if( status != IB_SUCCESS ) @@ -924,7 +969,7 @@ __pnp_process_add_ca( * exercise to the open source community. */ p_context = pnp_create_context( p_reg, - p_event_rec->p_ci_ca->p_pnp_attr->ca_guid ); + &p_event_rec->p_ci_ca->p_pnp_attr->ca_guid); if( !p_context ) continue; @@ -990,7 +1035,7 @@ __pnp_process_remove_port( { p_port_attr = p_event_rec->p_ci_ca->p_pnp_attr->p_port_attr; p_port_attr += port_index; - p_context = pnp_get_context( p_reg, p_port_attr->port_guid ); + p_context = pnp_get_context( p_reg, &p_port_attr->port_guid ); if( !p_context ) continue; @@ -1014,7 +1059,7 @@ __pnp_process_remove_port( * Remove the port context from the registrant's * context list. */ - cl_qmap_remove_item( &p_reg->context_map, + cl_fmap_remove_item( &p_reg->context_map, &p_context->map_item ); /* Free the context. */ cl_free( p_context ); @@ -1054,7 +1099,7 @@ __pnp_process_remove_ca( /* Search the context list for this CA. */ p_context = - pnp_get_context( p_reg, p_event_rec->p_ci_ca->verbs.guid ); + pnp_get_context( p_reg, &p_event_rec->p_ci_ca->p_pnp_attr->ca_guid); /* Make sure we found a context. */ if( !p_context ) @@ -1064,7 +1109,7 @@ __pnp_process_remove_ca( if( __pnp_notify_user( p_reg, p_context, p_event_rec ) == IB_SUCCESS ) { /* Remove the context from the context list. */ - cl_qmap_remove_item( &p_reg->context_map, &p_context->map_item ); + cl_fmap_remove_item( &p_reg->context_map, &p_context->map_item ); /* Deallocate the context block. */ cl_free( p_context ); @@ -1221,7 +1266,7 @@ __pnp_process_port_forward( p_port_attr = p_event_rec->p_ci_ca->p_pnp_attr->p_port_attr; p_port_attr += p_event_rec->port_index; - p_context = pnp_get_context( p_reg, p_port_attr->port_guid ); + p_context = pnp_get_context( p_reg, &p_port_attr->port_guid ); if( !p_context ) continue; @@ -1260,7 +1305,7 @@ __pnp_process_port_backward( p_port_attr = p_event_rec->p_ci_ca->p_pnp_attr->p_port_attr; p_port_attr += p_event_rec->port_index; - p_context = pnp_get_context( p_reg, p_port_attr->port_guid ); + p_context = pnp_get_context( p_reg, &p_port_attr->port_guid ); if( !p_context ) continue; diff --git a/trunk/core/bus/kernel/bus_iou_mgr.c b/trunk/core/bus/kernel/bus_iou_mgr.c index 808c83e1..1f1bf4f1 100644 --- a/trunk/core/bus/kernel/bus_iou_mgr.c +++ b/trunk/core/bus/kernel/bus_iou_mgr.c @@ -325,7 +325,7 @@ create_iou_mgr( { cl_obj_destroy( &gp_iou_mgr->obj ); BUS_TRACE_EXIT( BUS_DBG_ERROR, - ("ib_reg_pnp returned %s.\n", ib_get_err_str(status)) ); + ("bus_reg_iou_pnp returned %s.\n", ib_get_err_str(status)) ); return status; } diff --git a/trunk/core/bus/kernel/bus_port_mgr.c b/trunk/core/bus/kernel/bus_port_mgr.c index 5f94d507..c3663cf3 100644 --- a/trunk/core/bus/kernel/bus_port_mgr.c +++ b/trunk/core/bus/kernel/bus_port_mgr.c @@ -319,7 +319,7 @@ create_port_mgr( { cl_obj_destroy( &gp_port_mgr->obj ); BUS_TRACE_EXIT( BUS_DBG_ERROR, - ("ib_reg_pnp returned %s.\n", ib_get_err_str(status)) ); + ("bus_reg_port_pnp returned %s.\n", ib_get_err_str(status)) ); return status; } diff --git a/trunk/core/iou/kernel/iou_driver.h b/trunk/core/iou/kernel/iou_driver.h index d8c028f5..381630ee 100644 --- a/trunk/core/iou/kernel/iou_driver.h +++ b/trunk/core/iou/kernel/iou_driver.h @@ -199,6 +199,14 @@ typedef struct _iou_pdo_ext cl_list_item_t list_item; + /* All reported PDOs are children of an HCA. */ + ib_ca_handle_t h_ca; + + /* + * CA GUID copy - in case we get IRPs after the CA + * handle has been released. + */ + net64_t ca_guid; POWER_STATE dev_po_state; /* diff --git a/trunk/core/iou/kernel/iou_ioc_mgr.c b/trunk/core/iou/kernel/iou_ioc_mgr.c index c59c19e4..8a78be96 100644 --- a/trunk/core/iou/kernel/iou_ioc_mgr.c +++ b/trunk/core/iou/kernel/iou_ioc_mgr.c @@ -310,7 +310,7 @@ ioc_mgr_init( { cl_obj_destroy( &p_ioc_mgr->obj ); IOU_PRINT_EXIT( TRACE_LEVEL_ERROR, IOU_DBG_ERROR, - ("ib_reg_pnp returned %s.\n", + ("open_al returned %s.\n", p_ioc_mgr->ifc.get_err_str(status)) ); return status; } @@ -538,7 +538,8 @@ ioc_mgr_ioc_add( p_ioc_ext->pdo.p_parent_ext = p_ext; p_ioc_ext->pdo.b_present = TRUE; p_ioc_ext->pdo.b_reported_missing = FALSE; - + p_ioc_ext->pdo.ca_guid = p_pnp_rec->ca_guid; + /* Copy the IOC profile and service entries. */ p_ioc_ext->info = p_pnp_rec->info; cl_memcpy( p_ioc_ext->svc_entries, p_pnp_rec->svc_entry_array, @@ -1031,7 +1032,7 @@ ioc_query_unique_id( } /* The instance ID is the port GUID. */ - p_string = ExAllocatePool( PagedPool, sizeof(WCHAR) * 17 ); + p_string = ExAllocatePool( PagedPool, sizeof(WCHAR) * 33 ); if( !p_string ) { IOU_PRINT_EXIT( TRACE_LEVEL_ERROR, IOU_DBG_ERROR, @@ -1040,8 +1041,8 @@ ioc_query_unique_id( return STATUS_NO_MEMORY; } - status = RtlStringCchPrintfW( - p_string, 17, L"%016I64x", p_ext->info.profile.ioc_guid ); + status = RtlStringCchPrintfW(p_string, 33, L"%016I64x%016I64x", + p_ext->info.profile.ioc_guid,p_ext->pdo.ca_guid); if( !NT_SUCCESS( status ) ) { CL_ASSERT( NT_SUCCESS( status ) );