[ofa-general] Re: [PATCH] Add pkey table support to osm_get_all_port_attrs

Sasha Khapyorsky sashak at voltaire.com
Wed Feb 25 23:06:29 PST 2009


Hi Hal,

On 10:30 Wed 18 Feb     , Hal Rosenstock wrote:
> 
> Only supported in osm_vendor_ibumad.c (separate patch for other
> vendor layers)
> Also, update applications using this (osmtest, opensm)
> 
> Signed-off-by: Hal Rosenstock <hal.rosenstock at gmail.com>
> ---
>  opensm/libvendor/osm_vendor_ibumad.c |   24 +++++++++++++++++++-----
>  opensm/opensm/main.c                 |    6 ++++++
>  opensm/osmtest/main.c                |   11 +++++++++++
>  opensm/osmtest/osmtest.c             |    7 +++++++
>  4 files changed, 43 insertions(+), 5 deletions(-)
> 
> diff --git a/opensm/libvendor/osm_vendor_ibumad.c b/opensm/libvendor/osm_vendor_ibumad.c
> index 734a860..861bfbe 100644
> --- a/opensm/libvendor/osm_vendor_ibumad.c
> +++ b/opensm/libvendor/osm_vendor_ibumad.c
> @@ -2,6 +2,7 @@
>   * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
>   * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
>   * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
> + * Copyright (c) 2009 HNR Consulting. All rights reserved.
>   *
>   * This software is available to you under a choice of one of two
>   * licenses.  You may choose to be licensed under the terms of the GNU
> @@ -556,12 +557,13 @@ osm_vendor_get_all_port_attr(IN osm_vendor_t * const p_vend,
>  	umad_ca_t ca;
>  	ib_port_attr_t *attr = p_attr_array;
>  	unsigned done = 0;
> -	int r, i, j;
> +	int r, i, j, k;
>  
>  	OSM_LOG_ENTER(p_vend->p_log);
>  
>  	CL_ASSERT(p_vend && p_num_ports);
>  
> +	r = 0;
>  	if (!*p_num_ports) {
>  		r = IB_INVALID_PARAMETER;
>  		OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5418: "
> @@ -576,9 +578,7 @@ osm_vendor_get_all_port_attr(IN osm_vendor_t * const p_vend,
>  	}
>  
>  	for (i = 0; i < p_vend->ca_count && !done; i++) {
> -		/*
> -		 * For each CA, retrieve the port guids
> -		 */
> +		/* For each CA, retrieve the port attributes */
>  		if (umad_get_ca(p_vend->ca_names[i], &ca) == 0) {
>  			if (ca.node_type < 1 || ca.node_type > 3)
>  				continue;
> @@ -590,6 +590,21 @@ osm_vendor_get_all_port_attr(IN osm_vendor_t * const p_vend,
>  				attr->port_num = ca.ports[j]->portnum;
>  				attr->sm_lid = ca.ports[j]->sm_lid;
>  				attr->link_state = ca.ports[j]->state;
> +				attr->num_pkeys = ca.ports[j]->pkeys_size;
> +				if (attr->num_pkeys && attr->p_pkey_table) {
> +					if (attr->num_pkeys < ca.ports[j]->pkeys_size) {

You are doing:

	attr->num_pkeys = ca.ports[j]->pkeys_size;

, just two lines above, so this check will be always false.

> +						r = IB_INSUFFICIENT_MEMORY;
> +						OSM_LOG(p_vend->p_log,
> +							OSM_LOG_ERROR,
> +							"ERR 5419: Insufficient memory for pkeys for port %d; need space for %d pkeys\n",
> +							j,
> +							ca.ports[j]->pkeys_size);

Also should it be an error? May be it is just enough to fill requested
pkey entries?

> +						goto Exit;
> +					}
> +					for (k = 0; k < attr->num_pkeys; k++)
> +						attr->p_pkey_table[k] =
> +							cl_hton16(ca.ports[j]->pkeys[k]);
> +				}
>  				attr++;
>  				if (attr - p_attr_array > *p_num_ports) {
>  					done = 1;
> @@ -601,7 +616,6 @@ osm_vendor_get_all_port_attr(IN osm_vendor_t * const p_vend,
>  	}
>  
>  	*p_num_ports = attr - p_attr_array;
> -	r = 0;
>  
>  Exit:
>  	OSM_LOG_EXIT(p_vend->p_log);
> diff --git a/opensm/opensm/main.c b/opensm/opensm/main.c
> index 73a6274..503d7fa 100644
> --- a/opensm/opensm/main.c
> +++ b/opensm/opensm/main.c
> @@ -2,6 +2,7 @@
>   * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
>   * Copyright (c) 2002-2008 Mellanox Technologies LTD. All rights reserved.
>   * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
> + * Copyright (c) 2009 HNR Consulting. All rights reserved.
>   *
>   * This software is available to you under a choice of one of two
>   * licenses.  You may choose to be licensed under the terms of the GNU
> @@ -364,6 +365,11 @@ static ib_net64_t get_port_guid(IN osm_opensm_t * p_osm, uint64_t port_guid)
>  	uint32_t i, choice = 0;
>  	ib_api_status_t status;
>  
> +	for (i = 0; i < num_ports; i++) {
> +		attr_array[i].num_pkeys = 0;
> +		attr_array[i].p_pkey_table = NULL;
> +	}
> +

Here and below. Just

	memset(attr_array, 0, sizeof(attr_array));

would be enough.

Sasha

>  	/* Call the transport layer for a list of local port GUID values */
>  	status = osm_vendor_get_all_port_attr(p_osm->p_vendor, attr_array,
>  					      &num_ports);
> diff --git a/opensm/osmtest/main.c b/opensm/osmtest/main.c
> index b360af6..83c1e13 100644
> --- a/opensm/osmtest/main.c
> +++ b/opensm/osmtest/main.c
> @@ -1,6 +1,7 @@
>  /*
>   * Copyright (c) 2004-2006 Voltaire, Inc. All rights reserved.
>   * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
> + * Copyright (c) 2009 HNR Consulting. All rights reserved.
>   *
>   * This software is available to you under a choice of one of two
>   * licenses.  You may choose to be licensed under the terms of the GNU
> @@ -217,6 +218,11 @@ static void print_all_guids(IN osmtest_t * p_osmt)
>  	ib_port_attr_t attr_array[MAX_LOCAL_IBPORTS];
>  	int i;
>  
> +	for (i = 0; i < num_ports; i++) {
> +		attr_array[i].num_pkeys = 0;
> +		attr_array[i].p_pkey_table = NULL;
> +	}
> +
>  	/*
>  	   Call the transport layer for a list of local port
>  	   GUID values.
> @@ -245,6 +251,11 @@ ib_net64_t get_port_guid(IN osmtest_t * p_osmt, uint64_t port_guid)
>  	ib_port_attr_t attr_array[MAX_LOCAL_IBPORTS];
>  	int i;
>  
> +	for (i = 0; i < num_ports; i++) {
> +		attr_array[i].num_pkeys = 0;
> +		attr_array[i].p_pkey_table = NULL;
> +	}
> +
>  	/*
>  	   Call the transport layer for a list of local port
>  	   GUID values.
> diff --git a/opensm/osmtest/osmtest.c b/opensm/osmtest/osmtest.c
> index a7b343f..986a8d2 100644
> --- a/opensm/osmtest/osmtest.c
> +++ b/opensm/osmtest/osmtest.c
> @@ -2,6 +2,7 @@
>   * Copyright (c) 2006-2008 Voltaire, Inc. All rights reserved.
>   * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
>   * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
> + * Copyright (c) 2009 HNR Consulting. All rights reserved.
>   *
>   * This software is available to you under a choice of one of two
>   * licenses.  You may choose to be licensed under the terms of the GNU
> @@ -7096,9 +7097,15 @@ osmtest_bind(IN osmtest_t * p_osmt,
>  	ib_api_status_t status;
>  	uint32_t num_ports = MAX_LOCAL_IBPORTS;
>  	ib_port_attr_t attr_array[MAX_LOCAL_IBPORTS];
> +	int i;
>  
>  	OSM_LOG_ENTER(&p_osmt->log);
>  
> +	for (i = 0; i < num_ports; i++) {
> +		attr_array[i].num_pkeys = 0;
> +		attr_array[i].p_pkey_table = NULL;
> +	}
> +
>  	/*
>  	 * Call the transport layer for a list of local port
>  	 * GUID values.
> -- 
> 1.5.6.4
> 



More information about the general mailing list