diff mbox

opensm: Add a rate based mechanism for SMP transactions

Message ID 20100601153234.GR28549@me (mailing list archive)
State Not Applicable
Headers show

Commit Message

Sasha Khapyorsky June 1, 2010, 3:32 p.m. UTC
None
diff mbox

Patch

diff --git a/opensm/opensm/osm_vl15intf.c b/opensm/opensm/osm_vl15intf.c
index ff9e4db..a16d88e 100644
--- a/opensm/opensm/osm_vl15intf.c
+++ b/opensm/opensm/osm_vl15intf.c
@@ -113,6 +113,8 @@  static void vl15_poller(IN void *p_ptr)
 	osm_madw_t *p_madw;
 	osm_vl15_t *p_vl = p_ptr;
 	cl_qlist_t *p_fifo;
+	int32_t max_smps = p_vl->max_wire_smps;
+	int32_t max_wire_smps2 = 2 * max_smps; /* FIXME: make configurable */
 
 	OSM_LOG_ENTER(p_vl->p_log);
 
@@ -156,16 +158,21 @@  static void vl15_poller(IN void *p_ptr)
 						  EVENT_NO_TIMEOUT, TRUE);
 
 		while (p_vl->p_stats->qp0_mads_outstanding_on_wire >=
-		       (int32_t) p_vl->max_wire_smps &&
+		       max_smps &&
 		       p_vl->thread_state == OSM_THREAD_STATE_RUN) {
 			status = cl_event_wait_on(&p_vl->signal,
 						  EVENT_NO_TIMEOUT, TRUE);
-			if (status != CL_SUCCESS) {
+			if (status == CL_TIMEOUT &&
+			    max_smps < max_wire_smps2) {
+				max_smps++;
+				break;
+			} else if (status != CL_SUCCESS) {
 				OSM_LOG(p_vl->p_log, OSM_LOG_ERROR, "ERR 3E02: "
 					"Event wait failed (%s)\n",
 					CL_STATUS_MSG(status));
 				break;
 			}
+			max_smps = p_vl->max_wire_smps;
 		}
 	}