Skip to contentSkip to conversation

osm_vendor_ibumad.c: Better match table eviction strategy

PATCH New Hal Rosenstock 1 participant 1 message Jun 10, 2014 InfiniBand

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 osm_vendor_ibumad.c: Better match table eviction strategy

Rather than just evict LRU transaction when the match table is full, evict the LRU non SMP transaction and if none exist then evict the LRU SMP transaction.

---
 libvendor/osm_vendor_ibumad.c |   56 +++++++++++++++++++++++++++++++---------
 1 files changed, 43 insertions(+), 13 deletions(-)
libvendor/osm_vendor_ibumad.c +43 -13
index d9ed13a..94a2783 100644
@@ -187,15 +187,21 @@ static osm_madw_t *get_madw(osm_vendor_t * p_vend, ib_net64_t * tid,
 	return 0;
 }
 
+/*
+ * If match table full, evict LRU (least recently used) transaction.
+ * Maintain 2 LRUs: one for SMPs, and one for others (GS).
+ * Evict LRU GS transaction if one is available and only evict LRU SMP
+ * transaction if no other choice.
+ */
 static void
 put_madw(osm_vendor_t * p_vend, osm_madw_t * p_madw, ib_net64_t tid,
 	 uint8_t mgmt_class)
 {
-	umad_match_t *m, *e, *old_lru, *lru = 0;
+	umad_match_t *m, *e, *old_lru, *lru = 0, *lru_smp = 0;
 	osm_madw_t *p_req_madw;
 	osm_umad_bind_info_t *p_bind;
 	ib_net64_t old_tid;
-	uint32_t oldest = ~0;
+	uint32_t oldest = ~0, oldest_smp = ~0;
 	uint8_t old_mgmt_class;
 
 	pthread_mutex_lock(&p_vend->match_tbl_mutex);
@@ -210,15 +216,30 @@ put_madw(osm_vendor_t * p_vend, osm_madw_t * p_madw, ib_net64_t tid,
 			pthread_mutex_unlock(&p_vend->match_tbl_mutex);
 			return;
 		}
-		if (oldest >= m->version) {
-			oldest = m->version;
-			lru = m;
+		if (m->mgmt_class == IB_MCLASS_SUBN_DIR ||
+		    m->mgmt_class == IB_MCLASS_SUBN_LID) {
+			if (oldest_smp >= m->version) {
+				oldest_smp = m->version;
+				lru_smp = m;
+			}
+		} else {
+			if (oldest >= m->version) {
+				oldest = m->version;
+				lru = m;
+			}
 		}
 	}
 
-	old_lru = lru;
-	old_tid = lru->tid;
-	old_mgmt_class = lru->mgmt_class;
+	if (oldest != ~0) {
+		old_lru = lru;
+		old_tid = lru->tid;
+		old_mgmt_class = lru->mgmt_class;
+	} else {
+		CL_ASSERT(oldest_smp != ~0);
+		old_lru = lru_smp;
+		old_tid = lru_smp->tid;
+		old_mgmt_class = lru_smp->mgmt_class;
+	}
 	p_req_madw = old_lru->v;
 	p_bind = p_req_madw->h_bind;
 	p_req_madw->status = IB_CANCELED;
@@ -226,11 +247,20 @@ put_madw(osm_vendor_t * p_vend, osm_madw_t * p_madw, ib_net64_t tid,
 	pthread_mutex_lock(&p_vend->cb_mutex);
 	(*p_bind->send_err_callback) (p_bind->client_context, p_req_madw);
 	pthread_mutex_unlock(&p_vend->cb_mutex);
-	lru->tid = tid;
-	lru->mgmt_class = mgmt_class;
-	lru->v = p_madw;
-	lru->version =
-	    cl_atomic_inc((atomic32_t *) & p_vend->mtbl.last_version);
+	if (mgmt_class == IB_MCLASS_SUBN_DIR ||
+	    mgmt_class == IB_MCLASS_SUBN_LID) {
+		lru_smp->tid = tid;
+		lru_smp->mgmt_class = mgmt_class;
+		lru_smp->v = p_madw;
+		lru_smp->version =
+		    cl_atomic_inc((atomic32_t *) & p_vend->mtbl.last_version);
+	} else {
+		lru->tid = tid;
+		lru->mgmt_class = mgmt_class;
+		lru->v = p_madw;
+		lru->version =
+		    cl_atomic_inc((atomic32_t *) & p_vend->mtbl.last_version);
+	}
 	pthread_mutex_unlock(&p_vend->match_tbl_mutex);
 	OSM_LOG(p_vend->p_log, OSM_LOG_ERROR, "ERR 5402: "
 		"evicting entry %p (tid was 0x%" PRIx64
Signature · 6 lines
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