[ofa-general] [PATCHv2] osmtest: Add SA get PathRecord stress test
Hal Rosenstock
hnrose at comcast.net
Mon Sep 21 06:18:25 PDT 2009
Signed-off-by: Hal Rosenstock <hal.rosenstock at gmail.com>
---
Changes since v1:
Removed unneeded mode parameter
diff --git a/opensm/man/osmtest.8 b/opensm/man/osmtest.8
index fa0cd52..f0d6323 100644
--- a/opensm/man/osmtest.8
+++ b/opensm/man/osmtest.8
@@ -1,4 +1,4 @@
-.TH OSMTEST 8 "August 11, 2008" "OpenIB" "OpenIB Management"
+.TH OSMTEST 8 "August 31, 2009" "OpenIB" "OpenIB Management"
.SH NAME
osmtest \- InfiniBand subnet manager and administration (SM/SA) test program
@@ -108,9 +108,10 @@ Stress test options are as follows:
OPT Description
--- -----------------
- -s1 - Single-MAD response SA queries
+ -s1 - Single-MAD (RMPP) response SA queries
-s2 - Multi-MAD (RMPP) response SA queries
-s3 - Multi-MAD (RMPP) Path Record SA queries
+ -s4 - Single-MAD (non RMPP) get Path Record SA queries
Without -s, stress testing is not performed
.TP
diff --git a/opensm/osmtest/include/osmtest_base.h b/opensm/osmtest/include/osmtest_base.h
index 7c33da3..cda3a31 100644
--- a/opensm/osmtest/include/osmtest_base.h
+++ b/opensm/osmtest/include/osmtest_base.h
@@ -56,11 +56,12 @@
#define STRESS_SMALL_RMPP_THR 100000
/*
- Take long times when quering big clusters (over 40 nodes) , an average of : 0.25 sec for query
+ Take long times when querying big clusters (over 40 nodes), an average of : 0.25 sec for query
each query receives 1000 records
*/
#define STRESS_LARGE_RMPP_THR 4000
#define STRESS_LARGE_PR_RMPP_THR 20000
+#define STRESS_GET_PR 100000
extern const char *const p_file;
diff --git a/opensm/osmtest/main.c b/opensm/osmtest/main.c
index bb2d6bc..4bb9f82 100644
--- a/opensm/osmtest/main.c
+++ b/opensm/osmtest/main.c
@@ -143,9 +143,10 @@ void show_usage()
" Stress test options are as follows:\n"
" OPT Description\n"
" --- -----------------\n"
- " -s1 - Single-MAD response SA queries\n"
+ " -s1 - Single-MAD (RMPP) response SA queries\n"
" -s2 - Multi-MAD (RMPP) response SA queries\n"
" -s3 - Multi-MAD (RMPP) Path Record SA queries\n"
+ " -s4 - Single-MAD (non RMPP) get Path Record SA queries\n"
" Without -s, stress testing is not performed\n\n");
printf("-M\n"
"--Multicast_Mode\n"
@@ -499,6 +500,9 @@ int main(int argc, char *argv[])
case 3:
printf("Large Path Record SA queries\n");
break;
+ case 4:
+ printf("SA Get Path Record queries\n");
+ break;
default:
printf("Unknown value %u (ignored)\n",
opt.stress);
diff --git a/opensm/osmtest/osmtest.c b/opensm/osmtest/osmtest.c
index 986a8d2..c6ec955 100644
--- a/opensm/osmtest/osmtest.c
+++ b/opensm/osmtest/osmtest.c
@@ -2882,6 +2882,146 @@ Exit:
/**********************************************************************
**********************************************************************/
+ib_api_status_t
+osmtest_stress_path_recs_by_lid(IN osmtest_t * const p_osmt,
+ OUT uint32_t * const p_num_recs,
+ OUT uint32_t * const p_num_queries)
+{
+ osmtest_req_context_t context;
+ ib_path_rec_t *p_rec;
+ cl_status_t status;
+ ib_net16_t dlid, slid;
+ int num_recs, i;
+
+ OSM_LOG_ENTER(&p_osmt->log);
+
+ memset(&context, 0, sizeof(context));
+
+ slid = cl_ntoh16(p_osmt->local_port.lid);
+ dlid = cl_ntoh16(p_osmt->local_port.sm_lid);
+
+ /*
+ * Do a blocking query for the PathRecord.
+ */
+ status = osmtest_get_path_rec_by_lid_pair(p_osmt, slid, dlid, &context);
+ if (status != IB_SUCCESS) {
+ OSM_LOG(&p_osmt->log, OSM_LOG_ERROR, "ERR 000A: "
+ "osmtest_get_path_rec_by_lid_pair failed (%s)\n",
+ ib_get_err_str(status));
+ goto Exit;
+ }
+
+ /*
+ * Populate the database with the received records.
+ */
+ num_recs = context.result.result_cnt;
+ *p_num_recs += num_recs;
+ ++*p_num_queries;
+
+ if (osm_log_is_active(&p_osmt->log, OSM_LOG_VERBOSE)) {
+ OSM_LOG(&p_osmt->log, OSM_LOG_VERBOSE,
+ "Received %u records\n", num_recs);
+
+ for (i = 0; i < num_recs; i++) {
+ p_rec = osmv_get_query_path_rec(context.result.p_result_madw, 0);
+ osm_dump_path_record(&p_osmt->log, p_rec, OSM_LOG_VERBOSE);
+ }
+ }
+
+Exit:
+ /*
+ * Return the IB query MAD to the pool as necessary.
+ */
+ if (context.result.p_result_madw != NULL) {
+ osm_mad_pool_put(&p_osmt->mad_pool,
+ context.result.p_result_madw);
+ context.result.p_result_madw = NULL;
+ }
+
+ OSM_LOG_EXIT(&p_osmt->log);
+ return (status);
+}
+
+/**********************************************************************
+ **********************************************************************/
+static ib_api_status_t osmtest_stress_get_pr(IN osmtest_t * const p_osmt)
+{
+ ib_api_status_t status = IB_SUCCESS;
+ uint64_t num_recs = 0;
+ uint64_t num_queries = 0;
+ uint32_t delta_recs;
+ uint32_t delta_queries;
+ uint32_t print_freq = 0;
+ int num_timeouts = 0;
+ struct timeval start_tv, end_tv;
+ long sec_diff, usec_diff;
+
+ OSM_LOG_ENTER(&p_osmt->log);
+ gettimeofday(&start_tv, NULL);
+ printf("-I- Start time is : %09ld:%06ld [sec:usec]\n",
+ start_tv.tv_sec, (long)start_tv.tv_usec);
+
+ while ((num_queries < STRESS_GET_PR) && (num_timeouts < 100)) {
+ delta_recs = 0;
+ delta_queries = 0;
+
+ status = osmtest_stress_path_recs_by_lid(p_osmt,
+ &delta_recs,
+ &delta_queries);
+ if (status != IB_SUCCESS)
+ goto Exit;
+
+ num_recs += delta_recs;
+ num_queries += delta_queries;
+
+ print_freq += delta_recs;
+ if (print_freq > 5000) {
+ gettimeofday(&end_tv, NULL);
+ printf("%" PRIu64 " records, %" PRIu64 " queries\n",
+ num_recs, num_queries);
+ if (end_tv.tv_usec > start_tv.tv_usec) {
+ sec_diff = end_tv.tv_sec - start_tv.tv_sec;
+ usec_diff = end_tv.tv_usec - start_tv.tv_usec;
+ } else {
+ sec_diff = end_tv.tv_sec - start_tv.tv_sec - 1;
+ usec_diff =
+ 1000000 - (start_tv.tv_usec -
+ end_tv.tv_usec);
+ }
+ printf("-I- End time is : %09ld:%06ld [sec:usec]\n",
+ end_tv.tv_sec, (long)end_tv.tv_usec);
+ printf("-I- Querying %" PRId64
+ " path_rec queries took %04ld:%06ld [sec:usec]\n",
+ num_queries, sec_diff, usec_diff);
+ print_freq = 0;
+ }
+ }
+
+Exit:
+ gettimeofday(&end_tv, NULL);
+ printf("-I- End time is : %09ld:%06ld [sec:usec]\n",
+ end_tv.tv_sec, (long)end_tv.tv_usec);
+ if (end_tv.tv_usec > start_tv.tv_usec) {
+ sec_diff = end_tv.tv_sec - start_tv.tv_sec;
+ usec_diff = end_tv.tv_usec - start_tv.tv_usec;
+ } else {
+ sec_diff = end_tv.tv_sec - start_tv.tv_sec - 1;
+ usec_diff = 1000000 - (start_tv.tv_usec - end_tv.tv_usec);
+ }
+
+ printf("-I- Querying %" PRId64
+ " path_rec queries took %04ld:%06ld [sec:usec]\n",
+ num_queries, sec_diff, usec_diff);
+ if (num_timeouts > 50) {
+ status = IB_TIMEOUT;
+ }
+ /* Exit: */
+ OSM_LOG_EXIT(&p_osmt->log);
+ return (status);
+}
+
+/**********************************************************************
+ **********************************************************************/
static void
osmtest_prepare_db_generic(IN osmtest_t * const p_osmt,
IN cl_qmap_t * const p_tbl)
@@ -7247,6 +7387,16 @@ ib_api_status_t osmtest_run(IN osmtest_t * const p_osmt)
goto Exit;
}
break;
+ case 4: /* SA Get PR to SA LID */
+ status = osmtest_stress_get_pr(p_osmt);
+ if (status != IB_SUCCESS) {
+ OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
+ "ERR 014B: "
+ "SA Get PR stress test failed (%s)\n",
+ ib_get_err_str(status));
+ goto Exit;
+ }
+ break;
default:
OSM_LOG(&p_osmt->log, OSM_LOG_ERROR,
"ERR 0144: "
More information about the general
mailing list