When osmtest needs to create path records for inventory file, it will do n half-world queries (instead of full world query) where n is the number of end ports which was previously determined.
Signed-off-by: Dan Ben Yosef <[email protected]> --- osmtest/osmtest.c | 130 ++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 104 insertions(+), 26 deletions(-) diff --git a/osmtest/osmtest.c b/osmtest/osmtest.c index 36b9dc8..5dbf0db 100644 --- a/osmtest/osmtest.c +++ b/osmtest/osmtest.c @@ -832,6 +832,69 @@ Exit: } static ib_api_status_t +osmtest_get_path_rec_by_half_world_query(IN osmtest_t * const p_osmt, + IN ib_net64_t sguid, + IN osmtest_req_context_t * p_context) +{ + cl_status_t status = IB_SUCCESS; + osmv_query_req_t req; + osmv_user_query_t user; + ib_path_rec_t record; + + OSM_LOG_ENTER(&p_osmt->log); + + memset(&req, 0, sizeof(req)); + memset(p_context, 0, sizeof(*p_context)); + memset(&record, 0, sizeof(record)); + memset(&user, 0, sizeof(user)); + + ib_gid_set_default(&(record.sgid), sguid); + record.num_path = 0x01; + + p_context->p_osmt = p_osmt; + user.comp_mask = (IB_PR_COMPMASK_SGID | IB_PR_COMPMASK_NUMBPATH); + user.attr_id = IB_MAD_ATTR_PATH_RECORD; + user.p_attr = &record; + + req.query_type = OSMV_QUERY_USER_DEFINED; + req.timeout_ms = p_osmt->opt.transaction_timeout; + req.retry_cnt = p_osmt->opt.retry_count; + req.flags = OSM_SA_FLAGS_SYNC; + req.query_context = p_context; + req.pfn_query_cb = osmtest_query_res_cb; + req.p_query_input = &user; + req.sm_key = 0; + + status = osmv_query_sa(p_osmt->h_bind, &req); + if (status != IB_SUCCESS) { + OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0063: " + "ib_query failed (%s)\n", ib_get_err_str(status)); + goto Exit; + } + + status = (*p_context).result.status; + + if (status != IB_SUCCESS) { + OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0066: " + "ib_query failed (%s)\n", ib_get_err_str(status)); + + if (status == IB_REMOTE_ERROR) { + OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, + "Remote error = %s\n", + ib_get_mad_status_str(osm_madw_get_mad_ptr + ((*p_context).result. + p_result_madw))); + } + goto Exit; + } + +Exit: + + OSM_LOG_EXIT(&p_osmt->log); + return (status); +} + +static ib_api_status_t osmtest_get_path_rec_by_guid_pair(IN osmtest_t * const p_osmt, IN ib_net64_t sguid, IN ib_net64_t dguid, @@ -2028,6 +2091,7 @@ osmtest_write_all_node_recs(IN osmtest_t * const p_osmt, IN FILE * fh) cl_status_t status; size_t num_recs; int result; + node_t *p_guid_node; OSM_LOG_ENTER(&p_osmt->log); @@ -2065,6 +2129,16 @@ osmtest_write_all_node_recs(IN osmtest_t * const p_osmt, IN FILE * fh) p_rec = osmv_get_query_node_rec(context.result.p_result_madw, i); osmtest_write_node_info(p_osmt, fh, p_rec); + + /* create a subnet object */ + p_guid_node = node_new(); + CL_ASSERT(p_node != NULL); + + /* copy the info to the subnet node object */ + p_guid_node->rec = *p_rec; + cl_qmap_insert(&p_osmt->exp_subn.node_guid_tbl, + p_guid_node->rec.node_info.port_guid, + &p_guid_node->map_item); } Exit: @@ -2156,33 +2230,16 @@ osmtest_write_all_path_recs(IN osmtest_t * const p_osmt, IN FILE * fh) osmtest_req_context_t context; const ib_path_rec_t *p_rec; uint32_t i; - cl_status_t status; + cl_status_t status = CL_SUCCESS; size_t num_recs; int result; + node_t *p_dst_node; + cl_qmap_t *p_tbl; OSM_LOG_ENTER(&p_osmt->log); - memset(&context, 0, sizeof(context)); - - /* - * Do a blocking query for all PathRecords in the subnet. - */ - status = osmtest_get_all_recs(p_osmt, IB_MAD_ATTR_PATH_RECORD, - sizeof(*p_rec), &context); - - if (status != IB_SUCCESS) { - OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0025: " - "osmtest_get_all_recs failed (%s)\n", - ib_get_err_str(status)); - goto Exit; - } - - /* - * Write the received records out to the file. - */ - num_recs = context.result.result_cnt; - - OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Received %zu records\n", num_recs); + p_tbl = &p_osmt->exp_subn.node_guid_tbl; + p_dst_node = (node_t *) cl_qmap_head(p_tbl); result = fprintf(fh, "#\n" "# Path Records\n" "#\n"); if (result < 0) { @@ -2192,10 +2249,31 @@ osmtest_write_all_path_recs(IN osmtest_t * const p_osmt, IN FILE * fh) goto Exit; } - for (i = 0; i < num_recs; i++) { - p_rec = - osmv_get_query_path_rec(context.result.p_result_madw, i); - osmtest_write_path_info(p_osmt, fh, p_rec); + while (p_dst_node != (node_t *) cl_qmap_end(p_tbl)) { + + OSM_LOG(&p_osmt->log, OSM_LOG_DEBUG,"Source : lid = 0x%d type = %d\n", + cl_ntoh16(p_dst_node->rec.lid), + p_dst_node->rec.node_info.node_type); + + status = osmtest_get_path_rec_by_half_world_query(p_osmt, p_dst_node->rec.node_info.port_guid, &context); + if (status != IB_SUCCESS) { + OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 0025: " + "osmtest_get_all_path_recs failed (%s)\n", + ib_get_err_str(status)); + goto Exit; + } + /* + * Write the received records out to the file. + */ + num_recs = context.result.result_cnt; + OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE, "Received %zu records\n", num_recs); + + for (i = 0; i < num_recs; i++) { + p_rec = + osmv_get_query_path_rec(context.result.p_result_madw, i); + osmtest_write_path_info(p_osmt, fh, p_rec); + } + p_dst_node = (node_t *) cl_qmap_next(&p_dst_node->map_item); } Exit: -- 1.7.8.2 -- 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
