[openib-general] [PATCH] osm: pkey manager and ucast manager fail to report back correct signal
Eitan Zahavi
eitan at mellanox.co.il
Tue Dec 19 05:59:45 PST 2006
Seems like it is line wrapped this time too.
I need a new mailer.
So I will attach the file and send it.
Sorry about that.
Eitan
Eitan Zahavi wrote:
> Hi Hal
>
> Hope this will work
>
> EZ
>
>
> From 557b0504ab317c470d376f15d7c6d5ed1c9d11f5 Mon Sep 17 00:00:00 2001
> From: Eitan Zahavi <eitan at sw053.yok.mtl.com>
> Date: Mon, 18 Dec 2006 21:48:45 +0200
> Subject: [PATCH] Fix cases where the pkey manager returned
> OSM_SIGNAL_DONE and not
> OSM_SIGNAL_DONE_PENDING by missing some sent packets
> ---
> osm/opensm/osm_pkey_mgr.c | 112
> +++++++++++++++++++++++++++++++++------------
> 1 files changed, 82 insertions(+), 30 deletions(-)
>
> diff --git a/osm/opensm/osm_pkey_mgr.c b/osm/opensm/osm_pkey_mgr.c
> index 48837bc..a33aec7 100644
> --- a/osm/opensm/osm_pkey_mgr.c
> +++ b/osm/opensm/osm_pkey_mgr.c
> @@ -212,8 +212,9 @@ pkey_mgr_update_pkey_entry(
>
> /**********************************************************************
> **********************************************************************/
> -static ib_api_status_t
> +static boolean_t
> pkey_mgr_enforce_partition(
> + IN osm_log_t *p_log,
> IN const osm_req_t *p_req,
> IN const osm_physp_t *p_physp,
> IN const boolean_t enforce)
> @@ -221,12 +222,33 @@ pkey_mgr_enforce_partition(
> osm_madw_context_t context;
> uint8_t payload[IB_SMP_DATA_SIZE];
> ib_port_info_t *p_pi;
> + ib_api_status_t status;
>
> if (!(p_pi = osm_physp_get_port_info_ptr( p_physp )))
> - return IB_ERROR;
> + {
> + osm_log( p_log, OSM_LOG_ERROR,
> + "pkey_mgr_enforce_partition: ERR 0507: "
> + "No port info for "
> + "node 0x%016" PRIx64 " port %u\n",
> + cl_ntoh64(
> + osm_node_get_node_guid(
> + osm_physp_get_node_ptr( p_physp ))),
> + osm_physp_get_port_num( p_physp ) );
> + return FALSE;
> + }
>
> - if ((p_pi->vl_enforce & 0xc) == (0xc)*(enforce == TRUE))
> - return IB_SUCCESS;
> + if ((p_pi->vl_enforce & 0xc) == (0xc)*(enforce == TRUE))
> + {
> + osm_log( p_log, OSM_LOG_DEBUG,
> + "pkey_mgr_enforce_partition: "
> + "No need to update PortInfo for "
> + "node 0x%016" PRIx64 " port %u\n",
> + cl_ntoh64(
> + osm_node_get_node_guid(
> + osm_physp_get_node_ptr( p_physp ))),
> + osm_physp_get_port_num( p_physp ) );
> + return FALSE;
> + }
>
> memset( payload, 0, IB_SMP_DATA_SIZE );
> memcpy( payload, p_pi, sizeof(ib_port_info_t) );
> @@ -248,11 +270,35 @@ pkey_mgr_enforce_partition(
> context.pi_context.light_sweep = FALSE;
> context.pi_context.active_transition = FALSE;
>
> - return osm_req_set( p_req, osm_physp_get_dr_path_ptr( p_physp ),
> - payload, sizeof(payload),
> - IB_MAD_ATTR_PORT_INFO,
> - cl_hton32( osm_physp_get_port_num( p_physp ) ),
> - CL_DISP_MSGID_NONE, &context );
> + status = osm_req_set( p_req, osm_physp_get_dr_path_ptr( p_physp ),
> + payload, sizeof(payload),
> + IB_MAD_ATTR_PORT_INFO,
> + cl_hton32( osm_physp_get_port_num(
> p_physp ) ),
> + CL_DISP_MSGID_NONE, &context );
> + if (status != IB_SUCCESS)
> + {
> + osm_log( p_log, OSM_LOG_ERROR,
> + "pkey_mgr_enforce_partition: ERR 0520: "
> + "Failed to set PortInfo for "
> + "node 0x%016" PRIx64 " port %u\n",
> + cl_ntoh64(
> + osm_node_get_node_guid(
> + osm_physp_get_node_ptr( p_physp ))),
> + osm_physp_get_port_num( p_physp ) );
> + return FALSE;
> + }
> + else
> + {
> + osm_log( p_log, OSM_LOG_DEBUG,
> + "pkey_mgr_enforce_partition: "
> + "Set PortInfo for "
> + "node 0x%016" PRIx64 " port %u\n",
> + cl_ntoh64(
> + osm_node_get_node_guid(
> + osm_physp_get_node_ptr( p_physp ))),
> + osm_physp_get_port_num( p_physp ) );
> + return TRUE;
> + }
> }
>
> /**********************************************************************
> @@ -369,15 +415,26 @@ static boolean_t pkey_mgr_update_port(
>
> status = pkey_mgr_update_pkey_entry( p_req, p_physp, new_block,
> block_index );
> if (status == IB_SUCCESS)
> - ret_val = TRUE;
> + {
> + osm_log( p_log, OSM_LOG_DEBUG,
> + "pkey_mgr_update_port: "
> + "Updated "
> + "pkey table block %d for node 0x%016" PRIx64 "
> port %u\n",
> + block_index,
> + cl_ntoh64( osm_node_get_node_guid( p_node ) ),
> + osm_physp_get_port_num( p_physp ) );
> + ret_val = TRUE;
> + }
> else
> - osm_log( p_log, OSM_LOG_ERROR,
> - "pkey_mgr_update_port: ERR 0506: "
> - "pkey_mgr_update_pkey_entry() failed to update "
> - "pkey table block %d for node 0x%016" PRIx64 " port %u\n",
> - block_index,
> - cl_ntoh64( osm_node_get_node_guid( p_node ) ),
> - osm_physp_get_port_num( p_physp ) );
> + {
> + osm_log( p_log, OSM_LOG_ERROR,
> + "pkey_mgr_update_port: ERR 0506: "
> + "pkey_mgr_update_pkey_entry() failed to update "
> + "pkey table block %d for node 0x%016" PRIx64 "
> port %u\n",
> + block_index,
> + cl_ntoh64( osm_node_get_node_guid( p_node ) ),
> + osm_physp_get_port_num( p_physp ) );
> + }
> }
>
> return ret_val;
> @@ -405,8 +462,9 @@ pkey_mgr_update_peer_port(
> uint16_t peer_max_blocks;
> ib_api_status_t status = IB_SUCCESS;
> boolean_t ret_val = FALSE;
> + boolean_t port_info_set = FALSE;
> ib_pkey_table_t empty_block;
> -
> +
> memset(&empty_block, 0, sizeof(ib_pkey_table_t));
>
> p_physp = osm_port_get_default_phys_ptr( p_port );
> @@ -439,18 +497,11 @@ pkey_mgr_update_peer_port(
> enforce = FALSE;
> }
>
> - if (pkey_mgr_enforce_partition( p_req, peer, enforce ) != IB_SUCCESS)
> - {
> - osm_log( p_log, OSM_LOG_ERROR,
> - "pkey_mgr_update_peer_port: ERR 0507: "
> - "pkey_mgr_enforce_partition() failed to update "
> - "node 0x%016" PRIx64 " port %u\n",
> - cl_ntoh64( osm_node_get_node_guid( p_node ) ),
> - osm_physp_get_port_num( peer ) );
> - }
> + if (pkey_mgr_enforce_partition( p_log, p_req, peer, enforce))
> + port_info_set = TRUE;
>
> if (enforce == FALSE)
> - return FALSE;
> + return port_info_set;
>
> p_peer_pkey_tbl->used_blocks = p_pkey_tbl->used_blocks;
> for (block_index = 0; block_index < p_pkey_tbl->used_blocks;
> block_index++)
> @@ -487,6 +538,7 @@ pkey_mgr_update_peer_port(
> osm_physp_get_port_num( peer ) );
> }
>
> + if (port_info_set) return TRUE;
> return ret_val;
> }
>
> @@ -541,10 +593,10 @@ osm_pkey_mgr_process(
> signal = OSM_SIGNAL_DONE_PENDING;
> p_node = osm_port_get_parent_node( p_port );
> if ( ( osm_node_get_type( p_node ) != IB_NODE_TYPE_SWITCH ) &&
> - pkey_mgr_update_peer_port( &p_osm->log, &p_osm->sm.req,
> + pkey_mgr_update_peer_port( &p_osm->log, &p_osm->sm.req,
> &p_osm->subn, p_port,
> !p_osm->subn.opt.no_partition_enforcement ) )
> - signal = OSM_SIGNAL_DONE_PENDING;
> + signal = OSM_SIGNAL_DONE_PENDING;
> }
>
> _err:
>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: 0003-Fix-cases-where-the-pkey-manager-returned-OSM_SIGNAL_DONE-and-not.txt
URL: <http://lists.openfabrics.org/pipermail/general/attachments/20061219/57a2163b/attachment.txt>
More information about the general
mailing list