[openib-general] [PATCHv3] osm: partition manager force policy
Sasha Khapyorsky
sashak at voltaire.com
Mon Jun 19 06:56:53 PDT 2006
Hi Eitan,
On 14:46 Sun 18 Jun , Eitan Zahavi wrote:
>
> This is a third take after incorporating Sasha's comments to the
> partition manager patch I have previously provided.
Two small comments below.
> /**********************************************************************
> **********************************************************************/
> -/*
> - * Prepare a new entry for the pkey table for this port when this pkey
> - * does not exist. Update existed entry when membership was changed.
> - */
> -static void pkey_mgr_process_physical_port(
> - IN osm_log_t *p_log,
> - IN const osm_req_t *p_req,
> - IN const ib_net16_t pkey,
> - IN osm_physp_t *p_physp )
> +static boolean_t pkey_mgr_update_port(
> + osm_log_t *p_log,
> + osm_req_t *p_req,
> + const osm_port_t * const p_port )
> {
> - osm_node_t *p_node = osm_physp_get_node_ptr( p_physp );
> - ib_pkey_table_t *block;
> + osm_physp_t *p_physp;
> + osm_node_t *p_node;
p_node is uninitialized and used in osm_log() later,
> + ib_pkey_table_t *block, *new_block;
> + osm_pkey_tbl_t *p_pkey_tbl;
> uint16_t block_index;
> + uint8_t pkey_index;
> + uint16_t last_free_block_index = 0;
> + uint8_t last_free_pkey_index = 0;
> uint16_t num_of_blocks;
> - const osm_pkey_tbl_t *p_pkey_tbl;
> - ib_net16_t *p_orig_pkey;
> - char *stat = NULL;
> - uint32_t i;
> + uint16_t max_num_of_blocks;
>
> - p_pkey_tbl = osm_physp_get_pkey_tbl( p_physp );
> - num_of_blocks = osm_pkey_tbl_get_num_blocks( p_pkey_tbl );
> + ib_api_status_t status;
> + boolean_t ret_val = FALSE;
> + osm_pending_pkey_t *p_pending;
> + boolean_t found;
>
> - p_orig_pkey = cl_map_get( &p_pkey_tbl->keys, ib_pkey_get_base( pkey ) );
> + p_physp = osm_port_get_default_phys_ptr( p_port );
> + if ( !osm_physp_is_valid( p_physp ) )
> + return FALSE;
>
> - if ( !p_orig_pkey )
> - {
> - for ( block_index = 0; block_index < num_of_blocks; block_index++ )
> + p_pkey_tbl = osm_physp_get_mod_pkey_tbl( p_physp );
> + num_of_blocks = osm_pkey_tbl_get_num_blocks( p_pkey_tbl );
> + max_num_of_blocks = pkey_mgr_get_physp_max_blocks( p_req->p_subn, p_physp );
> + if ( p_pkey_tbl->max_blocks > max_num_of_blocks )
> {
> - block = osm_pkey_tbl_new_block_get( p_pkey_tbl, block_index );
> - for ( i = 0; i < IB_NUM_PKEY_ELEMENTS_IN_BLOCK; i++ )
> + osm_log( p_log, OSM_LOG_INFO,
> + "pkey_mgr_update_port: "
> + "Max number of blocks reduced from %u to %u "
> + "for node 0x%016" PRIx64 " port %u\n",
> + p_pkey_tbl->max_blocks, max_num_of_blocks,
> + cl_ntoh64( osm_node_get_node_guid( p_node ) ),
> + osm_physp_get_port_num( p_physp ) );
> + }
> @@ -255,13 +450,8 @@ pkey_mgr_update_peer_port(
> if (enforce == FALSE)
> return FALSE;
>
> - p_pkey_tbl = osm_physp_get_pkey_tbl( p );
> - p_peer_pkey_tbl = osm_physp_get_pkey_tbl( peer );
> - num_of_blocks = osm_pkey_tbl_get_num_blocks( p_pkey_tbl );
> - if ( num_of_blocks > osm_pkey_tbl_get_num_blocks( p_peer_pkey_tbl ) )
> - num_of_blocks = osm_pkey_tbl_get_num_blocks( p_peer_pkey_tbl );
> -
> - for ( block_index = 0; block_index < num_of_blocks; block_index++ )
> + p_peer_pkey_tbl->used_blocks = p_pkey_tbl->used_blocks;
Peer's pkey table blocks may be not initialized yet, and then
> + for ( block_index = 0; block_index < p_pkey_tbl->used_blocks; block_index++)
> {
> block = osm_pkey_tbl_new_block_get( p_pkey_tbl, block_index );
> peer_block = osm_pkey_tbl_block_get( p_peer_pkey_tbl, block_index );
peer_block can be NULL.
Later in the code (not in this patch) there is
'if (memcmp(peer_block, ...))', should be changed to
'if (!peer_block || memcmp(peer_block, ...))'.
Sasha
More information about the general
mailing list