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.
Signed-off-by: Hal Rosenstock <[email protected]> --- libvendor/osm_vendor_ibumad.c | 56 +++++++++++++++++++++++++++++++--------- 1 files changed, 43 insertions(+), 13 deletions(-) diff --git a/libvendor/osm_vendor_ibumad.c b/libvendor/osm_vendor_ibumad.c index d9ed13a..94a2783 100644 --- a/libvendor/osm_vendor_ibumad.c +++ b/libvendor/osm_vendor_ibumad.c @@ -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 -- 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
