[openib-general] [PATCH] opensm: observe PartitionEnforcementCap of zero

Rolf Manderscheid rvm at obsidianresearch.com
Wed Mar 29 15:54:53 PST 2006


Hi Hal,

opensm attempts to set pkey table entries on external switch ports
even if the switch declares a PartitionEnforcementCap of zero.  The
consequence is ERR 4108.

The decision to set the block is based on the size of the
pkeys->blocks vector, which is initialized to one.  There is a
comment that claims there must be a pre-allocated block in said vector
"for the sake of empty table test", but I can't see why it's
necessary.  Is this comment wrong or am I missing something?

The vector size grows, if necessary, when processing the response from
a SubnGet(PKeyTable).  The query happens during a sweep after
obtaining the portinfo, and the query code is careful to observe the
partition cap.  All this means that the vector size can still be used
to decide whether to do the set provided the vector size starts out at
zero.  So, the patch below just initializes the vector to size zero
and removes the code that inserts the pre-allocated block.

    Rolf

Index: osm_pkey.c
===================================================================
--- osm_pkey.c	(revision 5971)
+++ osm_pkey.c	(working copy)
@@ -91,21 +91,7 @@
 int osm_pkey_tbl_init( 
   IN osm_pkey_tbl_t *p_pkey_tbl)
 {
-  ib_pkey_table_t *p_pkey_block;
-  /* 
-     we always need one block to be pre-allocated for the sake of
-     empty table test
-  */
-  cl_ptr_vector_init( &p_pkey_tbl->blocks, 1, 1);
-  p_pkey_block = (ib_pkey_table_t *)cl_zalloc(sizeof(ib_pkey_table_t));
-  if (! p_pkey_block)
-  {
-    return(IB_ERROR);
-  }
-
-  cl_ptr_vector_set(&p_pkey_tbl->blocks, 0, p_pkey_block);
-
-  /* deal with the map */
+  cl_ptr_vector_init( &p_pkey_tbl->blocks, 0, 1);
   cl_map_init( &p_pkey_tbl->keys, 1 );
   return(IB_SUCCESS);
 }



More information about the general mailing list