Fixing search common pkey algorithm, due to changes in pkeys table when using allow_both_pkeys = TRUE
Signed-off-by: Daniel Klein <[email protected]> Reviewed-by: Hal Rosenstock <[email protected]> Signed-off-by: Alex Netes <[email protected]> --- include/opensm/osm_pkey.h | 17 +++++++++++-- opensm/osm_inform.c | 3 +- opensm/osm_pkey.c | 49 ++++++++++++++++++++++++++++++++++---- opensm/osm_sa_guidinfo_record.c | 7 +++-- opensm/osm_sa_informinfo.c | 9 ++++-- opensm/osm_sa_lft_record.c | 3 +- opensm/osm_sa_link_record.c | 9 ++++-- opensm/osm_sa_mcmember_record.c | 3 +- opensm/osm_sa_mft_record.c | 3 +- opensm/osm_sa_multipath_record.c | 15 +++++++---- opensm/osm_sa_node_record.c | 3 +- opensm/osm_sa_path_record.c | 15 +++++++---- opensm/osm_sa_pkey_record.c | 4 +- opensm/osm_sa_portinfo_record.c | 8 +++--- opensm/osm_sa_slvl_record.c | 7 +++-- opensm/osm_sa_sminfo_record.c | 3 +- opensm/osm_sa_sw_info_record.c | 3 +- opensm/osm_sa_vlarb_record.c | 8 +++--- 18 files changed, 122 insertions(+), 47 deletions(-) diff --git a/include/opensm/osm_pkey.h b/include/opensm/osm_pkey.h index 57c23cd..54888e6 100644 --- a/include/opensm/osm_pkey.h +++ b/include/opensm/osm_pkey.h @@ -541,7 +541,8 @@ boolean_t osm_physp_share_this_pkey(IN const struct osm_physp * p_physp1, * SYNOPSIS */ ib_net16_t osm_physp_find_common_pkey(IN const struct osm_physp *p_physp1, - IN const struct osm_physp *p_physp2); + IN const struct osm_physp *p_physp2, + IN boolean_t allow_both_pkeys); /* * PARAMETERS * @@ -551,6 +552,10 @@ ib_net16_t osm_physp_find_common_pkey(IN const struct osm_physp *p_physp1, * p_physp2 * [in] Pointer to an osm_physp_t object. * +* allow_both_pkeys +* [in] Whether both full and limited membership on same partition +* are allowed +* * RETURN VALUES * Returns value of first shared P_Key or INVALID P_Key (0x0) if not * found. @@ -585,7 +590,8 @@ ib_net16_t osm_physp_find_common_pkey(IN const struct osm_physp *p_physp1, */ boolean_t osm_physp_share_pkey(IN osm_log_t * p_log, IN const struct osm_physp * p_physp_1, - IN const struct osm_physp * p_physp_2); + IN const struct osm_physp * p_physp_2, + IN boolean_t allow_both_pkeys); /* * PARAMETERS @@ -598,6 +604,10 @@ boolean_t osm_physp_share_pkey(IN osm_log_t * p_log, * p_physp_2 * [in] Pointer to an osm_physp_t object. * +* allow_both_pkeys +* [in] Whether both full and limited membership on same partition +* are allowed +* * RETURN VALUES * Returns TRUE if the 2 physical ports are matching. * FALSE otherwise. @@ -632,7 +642,8 @@ boolean_t osm_physp_share_pkey(IN osm_log_t * p_log, */ boolean_t osm_port_share_pkey(IN osm_log_t * p_log, IN const struct osm_port * p_port_1, - IN const struct osm_port * p_port_2); + IN const struct osm_port * p_port_2, + IN boolean_t allow_both_pkeys); /* * PARAMETERS diff --git a/opensm/osm_inform.c b/opensm/osm_inform.c index fd7caa2..6a2cb7e 100644 --- a/opensm/osm_inform.c +++ b/opensm/osm_inform.c @@ -415,7 +415,8 @@ static int is_access_permitted(osm_infr_t *p_infr_rec, } - if (osm_port_share_pkey(p_log, p_src_port, p_dest_port) == FALSE) { + if (osm_port_share_pkey(p_log, p_src_port, p_dest_port, + p_subn->opt.allow_both_pkeys) == FALSE) { OSM_LOG(p_log, OSM_LOG_DEBUG, "Mismatch by Pkey\n"); /* According to o13-17.1.2 - If this informInfo does not have lid_range_begin of 0xFFFF, diff --git a/opensm/osm_pkey.c b/opensm/osm_pkey.c index e95adb2..69657dc 100644 --- a/opensm/osm_pkey.c +++ b/opensm/osm_pkey.c @@ -360,16 +360,23 @@ boolean_t osm_physp_share_this_pkey(IN const osm_physp_t * p_physp1, } ib_net16_t osm_physp_find_common_pkey(IN const osm_physp_t * p_physp1, - IN const osm_physp_t * p_physp2) + IN const osm_physp_t * p_physp2, + IN boolean_t allow_both_pkeys) { ib_net16_t *pkey1, *pkey2; uint64_t pkey1_base, pkey2_base; const osm_pkey_tbl_t *pkey_tbl1, *pkey_tbl2; cl_map_iterator_t map_iter1, map_iter2; + ib_net16_t key; + const osm_pkey_tbl_t *pkey_tbl; + cl_map_iterator_t map_iter, map_end; pkey_tbl1 = osm_physp_get_pkey_tbl(p_physp1); pkey_tbl2 = osm_physp_get_pkey_tbl(p_physp2); + if (allow_both_pkeys) + goto SearchByKeys; + map_iter1 = cl_map_head(&pkey_tbl1->keys); map_iter2 = cl_map_head(&pkey_tbl2->keys); @@ -395,11 +402,42 @@ ib_net16_t osm_physp_find_common_pkey(IN const osm_physp_t * p_physp1, } return 0; + +SearchByKeys: + + /* Select to iterate over the table with the least elements */ + if (cl_map_count(&pkey_tbl1->keys) < cl_map_count(&pkey_tbl2->keys)) { + map_iter = cl_map_head(&pkey_tbl1->keys); + map_end = cl_map_end(&pkey_tbl1->keys); + pkey_tbl = pkey_tbl2; + } else { + map_iter = cl_map_head(&pkey_tbl2->keys); + map_end = cl_map_end(&pkey_tbl2->keys); + pkey_tbl = pkey_tbl1; + } + + while (map_iter != map_end) { + pkey1 = (ib_net16_t *) cl_map_obj(map_iter); + key = cl_map_key(map_iter); + + pkey2 = cl_map_get(&pkey_tbl->keys, key | IB_PKEY_TYPE_MASK); + if (!pkey2) + pkey2 = cl_map_get(&pkey_tbl->keys, + key & ~IB_PKEY_TYPE_MASK); + + if (pkey2 && match_pkey(pkey1, pkey2)) + return (pkey_tbl == pkey_tbl2 ? *pkey1 : *pkey2); + + map_iter = cl_map_next(map_iter); + } + + return 0; } boolean_t osm_physp_share_pkey(IN osm_log_t * p_log, IN const osm_physp_t * p_physp_1, - IN const osm_physp_t * p_physp_2) + IN const osm_physp_t * p_physp_2, + IN boolean_t allow_both_pkeys) { const osm_pkey_tbl_t *pkey_tbl1, *pkey_tbl2; @@ -421,12 +459,13 @@ boolean_t osm_physp_share_pkey(IN osm_log_t * p_log, return !ib_pkey_is_invalid(osm_physp_find_common_pkey - (p_physp_1, p_physp_2)); + (p_physp_1, p_physp_2, allow_both_pkeys)); } boolean_t osm_port_share_pkey(IN osm_log_t * p_log, IN const osm_port_t * p_port_1, - IN const osm_port_t * p_port_2) + IN const osm_port_t * p_port_2, + IN boolean_t allow_both_pkeys) { osm_physp_t *p_physp1, *p_physp2; @@ -447,7 +486,7 @@ boolean_t osm_port_share_pkey(IN osm_log_t * p_log, goto Exit; } - ret = osm_physp_share_pkey(p_log, p_physp1, p_physp2); + ret = osm_physp_share_pkey(p_log, p_physp1, p_physp2, allow_both_pkeys); Exit: OSM_LOG_EXIT(p_log); diff --git a/opensm/osm_sa_guidinfo_record.c b/opensm/osm_sa_guidinfo_record.c index 37451b3..0140a70 100644 --- a/opensm/osm_sa_guidinfo_record.c +++ b/opensm/osm_sa_guidinfo_record.c @@ -155,7 +155,8 @@ static void sa_gir_create_gir(IN osm_sa_t * sa, IN osm_node_t * p_node, /* Check to see if the found p_physp and the requester physp share a pkey. If not, continue */ - if (!osm_physp_share_pkey(sa->p_log, p_physp, p_req_physp)) + if (!osm_physp_share_pkey(sa->p_log, p_physp, p_req_physp, + sa->p_subn->opt.allow_both_pkeys)) continue; port_guid = osm_physp_get_port_guid(p_physp); @@ -777,8 +778,8 @@ void osm_gir_rcv_process(IN void *ctx, IN void *data) osm_sa_send_error(sa, p_madw, IB_SA_MAD_STATUS_NO_RECORDS); goto Exit; } - if (!osm_physp_share_pkey(sa->p_log, p_req_physp, - p_port->p_physp)) + if (!osm_physp_share_pkey(sa->p_log, p_req_physp, p_port->p_physp, + sa->p_subn->opt.allow_both_pkeys)) goto Exit; CL_PLOCK_EXCL_ACQUIRE(sa->p_lock); if (p_rcvd_mad->method == IB_MAD_METHOD_SET) diff --git a/opensm/osm_sa_informinfo.c b/opensm/osm_sa_informinfo.c index f775d36..e3f6ffa 100644 --- a/opensm/osm_sa_informinfo.c +++ b/opensm/osm_sa_informinfo.c @@ -116,7 +116,8 @@ static boolean_t validate_ports_access_rights(IN osm_sa_t * sa, /* make sure that the requester and destination port can access each other according to the current partitioning. */ if (!osm_physp_share_pkey - (sa->p_log, p_port->p_physp, p_requester_physp)) { + (sa->p_log, p_port->p_physp, p_requester_physp, + sa->p_subn->opt.allow_both_pkeys)) { OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "port and requester don't share pkey\n"); valid = FALSE; @@ -165,7 +166,8 @@ static boolean_t validate_ports_access_rights(IN osm_sa_t * sa, /* make sure that the requester and destination port can access each other according to the current partitioning. */ if (!osm_physp_share_pkey - (sa->p_log, p_port->p_physp, p_requester_physp)) { + (sa->p_log, p_port->p_physp, p_requester_physp, + sa->p_subn->opt.allow_both_pkeys)) { OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "port and requester don't share pkey\n"); valid = FALSE; @@ -273,7 +275,8 @@ static void sa_inform_info_rec_by_comp_mask(IN osm_sa_t * sa, p_subscriber_physp = p_subscriber_port->p_physp; /* make sure that the requester and subscriber port can access each other according to the current partitioning. */ - if (!osm_physp_share_pkey(sa->p_log, p_req_physp, p_subscriber_physp)) { + if (!osm_physp_share_pkey(sa->p_log, p_req_physp, p_subscriber_physp, + sa->p_subn->opt.allow_both_pkeys)) { OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "requester and subscriber ports don't share pkey\n"); goto Exit; diff --git a/opensm/osm_sa_lft_record.c b/opensm/osm_sa_lft_record.c index 2069235..7da3a55 100644 --- a/opensm/osm_sa_lft_record.c +++ b/opensm/osm_sa_lft_record.c @@ -139,7 +139,8 @@ static void lftr_rcv_by_comp_mask(IN cl_map_item_t * p_map_item, IN void *cxt) cl_ntoh64(p_sw->p_node->node_info.node_guid)); return; } - if (!osm_physp_share_pkey(sa->p_log, p_req_physp, p_physp)) + if (!osm_physp_share_pkey(sa->p_log, p_req_physp, + p_physp, sa->p_subn->opt.allow_both_pkeys)) return; /* get the port 0 of the switch */ diff --git a/opensm/osm_sa_link_record.c b/opensm/osm_sa_link_record.c index 8ac4962..85f4074 100644 --- a/opensm/osm_sa_link_record.c +++ b/opensm/osm_sa_link_record.c @@ -137,17 +137,20 @@ static void lr_rcv_get_physp_link(IN osm_sa_t * sa, /* Check that the p_src_physp, p_dest_physp and p_req_physp all share a pkey (doesn't have to be the same p_key). */ - if (!osm_physp_share_pkey(sa->p_log, p_src_physp, p_dest_physp)) { + if (!osm_physp_share_pkey(sa->p_log, p_src_physp, p_dest_physp, + sa->p_subn->opt.allow_both_pkeys)) { OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Source and Dest PhysPorts do not share PKey\n"); goto Exit; } - if (!osm_physp_share_pkey(sa->p_log, p_src_physp, p_req_physp)) { + if (!osm_physp_share_pkey(sa->p_log, p_src_physp, p_req_physp, + sa->p_subn->opt.allow_both_pkeys)) { OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Source and Requester PhysPorts do not share PKey\n"); goto Exit; } - if (!osm_physp_share_pkey(sa->p_log, p_req_physp, p_dest_physp)) { + if (!osm_physp_share_pkey(sa->p_log, p_req_physp, p_dest_physp, + sa->p_subn->opt.allow_both_pkeys)) { OSM_LOG(sa->p_log, OSM_LOG_DEBUG, "Requester and Dest PhysPorts do not share PKey\n"); goto Exit; diff --git a/opensm/osm_sa_mcmember_record.c b/opensm/osm_sa_mcmember_record.c index b97f77f..2757258 100644 --- a/opensm/osm_sa_mcmember_record.c +++ b/opensm/osm_sa_mcmember_record.c @@ -1016,7 +1016,8 @@ static void mcmr_rcv_join_mgrp(IN osm_sa_t * sa, IN osm_madw_t * p_madw) proxy = (p_physp != p_request_physp); - if (proxy && !osm_physp_share_pkey(sa->p_log, p_physp, p_request_physp)) { + if (proxy && !osm_physp_share_pkey(sa->p_log, p_physp, p_request_physp, + sa->p_subn->opt.allow_both_pkeys)) { CL_PLOCK_RELEASE(sa->p_lock); OSM_LOG(sa->p_log, OSM_LOG_VERBOSE, "Port and requester don't share pkey\n"); diff --git a/opensm/osm_sa_mft_record.c b/opensm/osm_sa_mft_record.c index 7450faa..80f403f 100644 --- a/opensm/osm_sa_mft_record.c +++ b/opensm/osm_sa_mft_record.c @@ -146,7 +146,8 @@ static void mftr_rcv_by_comp_mask(IN cl_map_item_t * p_map_item, IN void *cxt) cl_ntoh64(p_sw->p_node->node_info.node_guid)); return; } - if (!osm_physp_share_pkey(sa->p_log, p_req_physp, p_physp)) + if (!osm_physp_share_pkey(sa->p_log, p_req_physp, p_physp, + sa->p_subn->opt.allow_both_pkeys)) return; /* get the port 0 of the switch */ diff --git a/opensm/osm_sa_multipath_record.c b/opensm/osm_sa_multipath_record.c index 12f8eb2..3c74b15 100644 --- a/opensm/osm_sa_multipath_record.c +++ b/opensm/osm_sa_multipath_record.c @@ -618,7 +618,8 @@ static ib_api_status_t mpr_rcv_get_path_parms(IN osm_sa_t * sa, if (comp_mask & IB_MPR_COMPMASK_RAWTRAFFIC && cl_ntoh32(p_mpr->hop_flow_raw) & (1 << 31)) required_pkey = - osm_physp_find_common_pkey(p_src_physp, p_dest_physp); + osm_physp_find_common_pkey(p_src_physp, p_dest_physp, + sa->p_subn->opt.allow_both_pkeys); else if (comp_mask & IB_MPR_COMPMASK_PKEY) { /* @@ -700,7 +701,8 @@ static ib_api_status_t mpr_rcv_get_path_parms(IN osm_sa_t * sa, * Just get any shared pkey. */ required_pkey = - osm_physp_find_common_pkey(p_src_physp, p_dest_physp); + osm_physp_find_common_pkey(p_src_physp, p_dest_physp, + sa->p_subn->opt.allow_both_pkeys); if (!required_pkey) { OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4519: " "Ports src 0x%016"PRIx64" (%s port %d) " @@ -991,11 +993,14 @@ static uint32_t mpr_rcv_get_port_pair_paths(IN osm_sa_t * sa, /* Check that the req_port, src_port and dest_port all share a pkey. The check is done on the default physical port of the ports. */ if (osm_port_share_pkey(sa->p_log, p_req_port, - p_src_alias_guid->p_base_port) == FALSE + p_src_alias_guid->p_base_port, + sa->p_subn->opt.allow_both_pkeys) == FALSE || osm_port_share_pkey(sa->p_log, p_req_port, - p_dest_alias_guid->p_base_port) == FALSE + p_dest_alias_guid->p_base_port, + sa->p_subn->opt.allow_both_pkeys) == FALSE || osm_port_share_pkey(sa->p_log, p_src_alias_guid->p_base_port, - p_dest_alias_guid->p_base_port) == FALSE) + p_dest_alias_guid->p_base_port, + sa->p_subn->opt.allow_both_pkeys) == FALSE) /* One of the pairs doesn't share a pkey so the path is disqualified. */ goto Exit; diff --git a/opensm/osm_sa_node_record.c b/opensm/osm_sa_node_record.c index f135607..5255ae9 100644 --- a/opensm/osm_sa_node_record.c +++ b/opensm/osm_sa_node_record.c @@ -150,7 +150,8 @@ static void nr_rcv_create_nr(IN osm_sa_t * sa, IN osm_node_t * p_node, /* Check to see if the found p_physp and the requester physp share a pkey. If not - continue */ - if (!osm_physp_share_pkey(sa->p_log, p_physp, p_req_physp)) + if (!osm_physp_share_pkey(sa->p_log, p_physp, p_req_physp, + sa->p_subn->opt.allow_both_pkeys)) continue; port_guid = osm_physp_get_port_guid(p_physp); diff --git a/opensm/osm_sa_path_record.c b/opensm/osm_sa_path_record.c index 0e2dae2..e61aaa0 100644 --- a/opensm/osm_sa_path_record.c +++ b/opensm/osm_sa_path_record.c @@ -631,7 +631,8 @@ static ib_api_status_t pr_rcv_get_path_parms(IN osm_sa_t * sa, if ((comp_mask & IB_PR_COMPMASK_RAWTRAFFIC) && (cl_ntoh32(p_pr->hop_flow_raw) & (1 << 31))) - pkey = osm_physp_find_common_pkey(p_src_physp, p_dest_physp); + pkey = osm_physp_find_common_pkey(p_src_physp, p_dest_physp, + sa->p_subn->opt.allow_both_pkeys); else if (comp_mask & IB_PR_COMPMASK_PKEY) { /* @@ -705,7 +706,8 @@ static ib_api_status_t pr_rcv_get_path_parms(IN osm_sa_t * sa, * Neither PR request nor QoS level have pkey. * Just get any shared pkey. */ - pkey = osm_physp_find_common_pkey(p_src_physp, p_dest_physp); + pkey = osm_physp_find_common_pkey(p_src_physp, p_dest_physp, + sa->p_subn->opt.allow_both_pkeys); if (!pkey) { OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 1F1B: " "Ports src 0x%016"PRIx64" (%s port %d) and " @@ -1020,11 +1022,14 @@ static void pr_rcv_get_port_pair_paths(IN osm_sa_t * sa, /* Check that the req_port, src_port and dest_port all share a pkey. The check is done on the default physical port of the ports. */ if (osm_port_share_pkey(sa->p_log, p_req_port, - p_src_alias_guid->p_base_port) == FALSE + p_src_alias_guid->p_base_port, + sa->p_subn->opt.allow_both_pkeys) == FALSE || osm_port_share_pkey(sa->p_log, p_req_port, - p_dest_alias_guid->p_base_port) == FALSE + p_dest_alias_guid->p_base_port, + sa->p_subn->opt.allow_both_pkeys) == FALSE || osm_port_share_pkey(sa->p_log, p_src_alias_guid->p_base_port, - p_dest_alias_guid->p_base_port) == FALSE) + p_dest_alias_guid->p_base_port, + sa->p_subn->opt.allow_both_pkeys) == FALSE) /* One of the pairs doesn't share a pkey so the path is disqualified. */ goto Exit; diff --git a/opensm/osm_sa_pkey_record.c b/opensm/osm_sa_pkey_record.c index 6bd2056..122c44f 100644 --- a/opensm/osm_sa_pkey_record.c +++ b/opensm/osm_sa_pkey_record.c @@ -171,7 +171,7 @@ static void sa_pkey_by_comp_mask(IN osm_sa_t * sa, IN const osm_port_t * p_port, with the p_req_physp. */ if (p_physp && osm_physp_share_pkey(sa->p_log, p_req_physp, - p_physp)) + p_physp, sa->p_subn->opt.allow_both_pkeys)) sa_pkey_check_physp(sa, p_physp, p_ctxt); } else { OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 4603: " @@ -191,7 +191,7 @@ static void sa_pkey_by_comp_mask(IN osm_sa_t * sa, IN const osm_port_t * p_port, /* if the requester and the p_physp don't share a pkey - continue */ if (!osm_physp_share_pkey - (sa->p_log, p_req_physp, p_physp)) + (sa->p_log, p_req_physp, p_physp, sa->p_subn->opt.allow_both_pkeys)) continue; sa_pkey_check_physp(sa, p_physp, p_ctxt); diff --git a/opensm/osm_sa_portinfo_record.c b/opensm/osm_sa_portinfo_record.c index 5aa599a..4e662d1 100644 --- a/opensm/osm_sa_portinfo_record.c +++ b/opensm/osm_sa_portinfo_record.c @@ -472,8 +472,8 @@ static void sa_pir_by_comp_mask(IN osm_sa_t * sa, IN osm_node_t * p_node, /* Check that the p_physp is valid, and that the p_physp and the p_req_physp share a pkey. */ if (p_physp && - osm_physp_share_pkey(sa->p_log, p_req_physp, - p_physp)) + osm_physp_share_pkey(sa->p_log, p_req_physp, p_physp, + sa->p_subn->opt.allow_both_pkeys)) sa_pir_check_physp(sa, p_physp, p_ctxt); } } else { @@ -484,8 +484,8 @@ static void sa_pir_by_comp_mask(IN osm_sa_t * sa, IN osm_node_t * p_node, /* if the requester and the p_physp don't share a pkey - continue */ - if (!osm_physp_share_pkey - (sa->p_log, p_req_physp, p_physp)) + if (!osm_physp_share_pkey(sa->p_log, p_req_physp, p_physp, + sa->p_subn->opt.allow_both_pkeys)) continue; sa_pir_check_physp(sa, p_physp, p_ctxt); diff --git a/opensm/osm_sa_slvl_record.c b/opensm/osm_sa_slvl_record.c index 6d9f00a..3ef7dd2 100644 --- a/opensm/osm_sa_slvl_record.c +++ b/opensm/osm_sa_slvl_record.c @@ -141,7 +141,8 @@ static void sa_slvl_by_comp_mask(IN osm_sa_t * sa, IN const osm_port_t * p_port, p_port->p_physp->port_num); p_out_physp = p_port->p_physp; /* check that the p_out_physp and the p_req_physp share a pkey */ - if (osm_physp_share_pkey(sa->p_log, p_req_physp, p_out_physp)) + if (osm_physp_share_pkey(sa->p_log, p_req_physp, p_out_physp, + sa->p_subn->opt.allow_both_pkeys)) sa_slvl_create(sa, p_out_physp, p_ctxt, 0); } else { if (comp_mask & IB_SLVL_COMPMASK_OUT_PORT) @@ -173,8 +174,8 @@ static void sa_slvl_by_comp_mask(IN osm_sa_t * sa, IN const osm_port_t * p_port, /* if the requester and the p_out_physp don't share a pkey - continue */ - if (!osm_physp_share_pkey - (sa->p_log, p_req_physp, p_out_physp)) + if (!osm_physp_share_pkey(sa->p_log, p_req_physp, p_out_physp, + sa->p_subn->opt.allow_both_pkeys)) continue; sa_slvl_create(sa, p_out_physp, p_ctxt, diff --git a/opensm/osm_sa_sminfo_record.c b/opensm/osm_sa_sminfo_record.c index 97bc01e..02fb3c7 100644 --- a/opensm/osm_sa_sminfo_record.c +++ b/opensm/osm_sa_sminfo_record.c @@ -254,7 +254,8 @@ void osm_smir_rcv_process(IN void *ctx, IN void *data) if (!p_port || local_port == p_port) { if (FALSE == osm_physp_share_pkey(sa->p_log, p_req_physp, - local_port->p_physp)) { + local_port->p_physp, + sa->p_subn->opt.allow_both_pkeys)) { cl_plock_release(sa->p_lock); OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2805: " "Cannot get SMInfo record due to pkey violation\n"); diff --git a/opensm/osm_sa_sw_info_record.c b/opensm/osm_sa_sw_info_record.c index 63e51d9..4cb5fa8 100644 --- a/opensm/osm_sa_sw_info_record.c +++ b/opensm/osm_sa_sw_info_record.c @@ -136,7 +136,8 @@ static void sir_rcv_create_sir(IN osm_sa_t * sa, IN const osm_switch_t * p_sw, cl_ntoh64(p_sw->p_node->node_info.node_guid)); goto Exit; } - if (!osm_physp_share_pkey(sa->p_log, p_req_physp, p_physp)) + if (!osm_physp_share_pkey(sa->p_log, p_req_physp, p_physp, + sa->p_subn->opt.allow_both_pkeys)) goto Exit; /* get the port 0 of the switch */ diff --git a/opensm/osm_sa_vlarb_record.c b/opensm/osm_sa_vlarb_record.c index f56bfe6..18297a4 100644 --- a/opensm/osm_sa_vlarb_record.c +++ b/opensm/osm_sa_vlarb_record.c @@ -164,8 +164,8 @@ static void sa_vl_arb_by_comp_mask(osm_sa_t * sa, IN const osm_port_t * p_port, /* check that the p_physp is valid, and that the requester and the p_physp share a pkey. */ if (p_physp && - osm_physp_share_pkey(sa->p_log, p_req_physp, - p_physp)) + osm_physp_share_pkey(sa->p_log, p_req_physp, p_physp, + sa->p_subn->opt.allow_both_pkeys)) sa_vl_arb_check_physp(sa, p_physp, p_ctxt); } else { OSM_LOG(sa->p_log, OSM_LOG_ERROR, "ERR 2A03: " @@ -184,8 +184,8 @@ static void sa_vl_arb_by_comp_mask(osm_sa_t * sa, IN const osm_port_t * p_port, /* if the requester and the p_physp don't share a pkey - continue */ - if (!osm_physp_share_pkey - (sa->p_log, p_req_physp, p_physp)) + if (!osm_physp_share_pkey(sa->p_log, p_req_physp, p_physp, + sa->p_subn->opt.allow_both_pkeys)) continue; sa_vl_arb_check_physp(sa, p_physp, p_ctxt); -- 1.7.7.6 -- -- Alex -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
