From 96bbfa7b45ec2ae6f3f9ab9fde1cf0d92fd5e4ab Mon Sep 17 00:00:00 2001 From: ftillier Date: Fri, 9 Dec 2005 19:59:19 +0000 Subject: [PATCH] [IPoIB] Enable IBAT on a device only if its packet filter is non-zero. git-svn-id: svn://openib.tc.cornell.edu/gen1@202 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- trunk/ulp/ipoib/kernel/ipoib_adapter.c | 22 +++++++------ trunk/ulp/ipoib/kernel/ipoib_adapter.h | 7 +++++ trunk/ulp/ipoib/kernel/ipoib_driver.c | 43 +++++++++++++++++++------- trunk/ulp/ipoib/kernel/ipoib_ibat.c | 13 -------- 4 files changed, 51 insertions(+), 34 deletions(-) diff --git a/trunk/ulp/ipoib/kernel/ipoib_adapter.c b/trunk/ulp/ipoib/kernel/ipoib_adapter.c index 0fe04183..e2f4bc4b 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_adapter.c +++ b/trunk/ulp/ipoib/kernel/ipoib_adapter.c @@ -126,7 +126,6 @@ ipoib_create_adapter( ib_api_status_t status; cl_status_t cl_status; uint8_t port_num; - KLOCK_QUEUE_HANDLE hdl; IPOIB_ENTER( IPOIB_DBG_INIT ); @@ -189,10 +188,6 @@ ipoib_create_adapter( return IB_ERROR; } - KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl ); - cl_qlist_insert_tail( &g_ipoib.adapter_list, &p_adapter->entry ); - KeReleaseInStackQueuedSpinLock( &hdl ); - status = adapter_init( p_adapter ); if( status != IB_SUCCESS ) { @@ -429,10 +424,19 @@ __adapter_destroying( p_adapter->h_pnp = NULL; } - KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl ); - ASSERT( cl_qlist_count( &g_ipoib.adapter_list ) ); - cl_qlist_remove_item( &g_ipoib.adapter_list, &p_adapter->entry ); - KeReleaseInStackQueuedSpinLock( &hdl ); + if( p_adapter->packet_filter ) + { + KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl ); + cl_obj_lock( &p_adapter->obj ); + + ASSERT( cl_qlist_count( &g_ipoib.adapter_list ) ); + cl_qlist_remove_item( &g_ipoib.adapter_list, &p_adapter->entry ); + + p_adapter->packet_filter = 0; + + cl_obj_unlock( &p_adapter->obj ); + KeReleaseInStackQueuedSpinLock( &hdl ); + } IPOIB_EXIT( IPOIB_DBG_INIT ); } diff --git a/trunk/ulp/ipoib/kernel/ipoib_adapter.h b/trunk/ulp/ipoib/kernel/ipoib_adapter.h index b2e73889..a9135857 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_adapter.h +++ b/trunk/ulp/ipoib/kernel/ipoib_adapter.h @@ -183,6 +183,13 @@ typedef struct _ipoib_adapter * guids * CA and port GUIDs returned by the bus driver. * +* entry +* List item for storing all adapters in a list for address translation. +* We add adapters when their packet filter is set to a non-zero value, +* and remove them when their packet filter is cleared. This is needed +* since user-mode removal events are generated after the packet filter +* is cleared, but before the adapter is destroyed. +* * h_al * AL handle for all IB resources. * diff --git a/trunk/ulp/ipoib/kernel/ipoib_driver.c b/trunk/ulp/ipoib/kernel/ipoib_driver.c index 8247b275..7283bbc9 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_driver.c +++ b/trunk/ulp/ipoib/kernel/ipoib_driver.c @@ -1393,6 +1393,8 @@ ipoib_set_info( ULONG buf_len; uint8_t port_num; + + KLOCK_QUEUE_HANDLE hdl; IPOIB_ENTER( IPOIB_DBG_OID ); @@ -1425,6 +1427,7 @@ ipoib_set_info( } else { + KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl ); cl_obj_lock( &p_adapter->obj ); switch( p_adapter->state ) { @@ -1445,6 +1448,9 @@ ipoib_set_info( default: if( !p_adapter->packet_filter && (*(uint32_t*)info_buf) ) { + cl_qlist_insert_tail( + &g_ipoib.adapter_list, &p_adapter->entry ); + /* * Filter was zero, now non-zero. Register IP addresses * with SA. @@ -1457,11 +1463,16 @@ ipoib_set_info( * Filter was non-zero, now zero. Deregister IP addresses. */ ipoib_dereg_addrs( p_adapter ); + + ASSERT( cl_qlist_count( &g_ipoib.adapter_list ) ); + cl_qlist_remove_item( + &g_ipoib.adapter_list, &p_adapter->entry ); } p_adapter->packet_filter = *(uint32_t*)info_buf; } cl_obj_unlock( &p_adapter->obj ); + KeReleaseInStackQueuedSpinLock( &hdl ); } break; @@ -1700,11 +1711,12 @@ void ipoib_resume_oids( IN ipoib_adapter_t* const p_adapter ) { - ULONG info; - NDIS_STATUS status; - boolean_t pending_query, pending_set; - pending_oid_t query_oid = {0}; - pending_oid_t set_oid = {0}; + ULONG info; + NDIS_STATUS status; + boolean_t pending_query, pending_set; + pending_oid_t query_oid = {0}; + pending_oid_t set_oid = {0}; + KLOCK_QUEUE_HANDLE hdl; IPOIB_ENTER( IPOIB_DBG_INIT ); @@ -1775,25 +1787,32 @@ ipoib_resume_oids( case OID_GEN_CURRENT_PACKET_FILTER: /* Validation already performed in the SetInformation path. */ + KeAcquireInStackQueuedSpinLock( &g_ipoib.lock, &hdl ); cl_obj_lock( &p_adapter->obj ); if( !p_adapter->packet_filter && (*(PULONG)set_oid.p_buf) ) { + cl_qlist_insert_tail( + &g_ipoib.adapter_list, &p_adapter->entry ); /* - * Filter was zero, now non-zero. Register IP addresses - * with SA. - */ + * Filter was zero, now non-zero. Register IP addresses + * with SA. + */ ipoib_reg_addrs( p_adapter ); } else if( p_adapter->packet_filter && !(*(PULONG)set_oid.p_buf) ) { - /* - * Filter was non-zero, now zero. Deregister IP addresses. - */ + /* Filter was non-zero, now zero. Deregister IP addresses. */ ipoib_dereg_addrs( p_adapter ); + + ASSERT( cl_qlist_count( &g_ipoib.adapter_list ) ); + cl_qlist_remove_item( + &g_ipoib.adapter_list, &p_adapter->entry ); } + p_adapter->packet_filter = *(PULONG)set_oid.p_buf; + cl_obj_unlock( &p_adapter->obj ); + KeReleaseInStackQueuedSpinLock( &hdl ); - p_adapter->packet_filter = *(PULONG)set_oid.p_buf; NdisMSetInformationComplete( p_adapter->h_adapter, status ); break; diff --git a/trunk/ulp/ipoib/kernel/ipoib_ibat.c b/trunk/ulp/ipoib/kernel/ipoib_ibat.c index f6a8b75c..a49e0c51 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_ibat.c +++ b/trunk/ulp/ipoib/kernel/ipoib_ibat.c @@ -200,19 +200,6 @@ __ibat_get_ips( continue; cl_obj_lock( &pAdapter->obj ); - - /* - * Only report IP addresses for adapters that have a non-zero - * packet filter since user-mode removal events are generated - * after the packet filter is cleared, but before the adapter - * is destroyed. - */ - if( !pAdapter->packet_filter ) - { - cl_obj_unlock( &pAdapter->obj ); - continue; - } - nIps += (LONG)cl_vector_get_size( &pAdapter->ip_vector ); for( idx = 0; -- 2.41.0