[ofa-general] Re: [PATCH v2] opensm: free lft_buf if it matches switch's lft

Yevgeny Kliteynik kliteyn at dev.mellanox.co.il
Thu Nov 20 04:46:11 PST 2008


Sasha Khapyorsky wrote:
> On 23:51 Thu 30 Oct     , Yevgeny Kliteynik wrote:
>> Sure, why not. That way the memory would be freed faster.
> 
> Patch?
> 
> Sasha
> 

I can do something like the following patch, but I have
some strange feeling that I'm missing something...
Can there be some flow that would cause lft_buf to be
freed while not all the lft blocks were received yet,
and then remaining blocks might change switch->lft
(after the switch->lft_buf was already freed)?
I can't think of any particular example, just a general
concern...

-- Yevgeny

Free lft_buf when newly received lft block
makes switch's lft identical to lft_buf.

Signed-off-by: Yevgeny Kliteynik <kliteyn at dev.mellanox.co.il>
---
  opensm/include/opensm/osm_switch.h |    7 +++++++
  opensm/opensm/osm_ucast_mgr.c      |    7 -------
  2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/opensm/include/opensm/osm_switch.h b/opensm/include/opensm/osm_switch.h
index f06931c..af8a50e 100644
--- a/opensm/include/opensm/osm_switch.h
+++ b/opensm/include/opensm/osm_switch.h
@@ -729,6 +729,13 @@ osm_switch_set_lft_block(IN osm_switch_t * const p_sw,
  		return IB_INVALID_PARAMETER;

  	memcpy(&p_sw->lft[lid_start], p_block, IB_SMP_DATA_SIZE);
+
+	if (p_sw->lft_buf &&
+	    !memcmp(p_sw->lft, p_sw->lft_buf, IB_LID_UCAST_END_HO + 1)) {
+		free(p_sw->lft_buf);
+		p_sw->lft_buf = NULL;
+	}
+
  	return IB_SUCCESS;
  }
  /*
diff --git a/opensm/opensm/osm_ucast_mgr.c b/opensm/opensm/osm_ucast_mgr.c
index 175817c..7f1a816 100644
--- a/opensm/opensm/osm_ucast_mgr.c
+++ b/opensm/opensm/osm_ucast_mgr.c
@@ -399,13 +399,6 @@ int osm_ucast_mgr_set_fwd_table(IN osm_ucast_mgr_t * const p_mgr,
  		goto Exit;
  	}

-	if (!p_sw->need_update &&
-	    !memcmp(p_sw->lft, p_sw->lft_buf, IB_LID_UCAST_END_HO + 1)) {
-		free(p_sw->lft_buf);
-		p_sw->lft_buf = NULL;
-		goto Exit;
-	}
-
  	for (block_id_ho = 0;
  	     osm_switch_get_lft_block(p_sw, block_id_ho, block);
  	     block_id_ho++) {
-- 
1.5.1.4






More information about the general mailing list