On Thu, Feb 26, 2009 at 2:10 AM, Sasha Khapyorsky <[email protected]> wrote: > 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) > > It looks that ibutils (ibis) requires same fix (attr_array > initialization) too.
Yes, I'm aware but didn't want to send those until these were accepted. -- Hal > > Sasha > >> >> Signed-off-by: Hal Rosenstock <[email protected]> >> --- >> 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) { >> + 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); >> + 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; >> + } >> + >> /* 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 >> > _______________________________________________ > general mailing list > [email protected] > http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general > > To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general > _______________________________________________ general mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
