[ltt-dev] [PATCH 3/9] rculfhash: make struct rcu_level allied

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Fri Oct 14 10:07:49 EDT 2011


* Lai Jiangshan (laijs at cn.fujitsu.com) wrote:
> reduce memory fragment
> add a slowpath overhead
> 
> Signed-off-by: Lai Jiangshan <laijs at cn.fujitsu.com>

Hrm, I see what you want to do here: given we already have
synchronize_rcu calls in the fini code, you use them to guarantee
quiescence of the previous iteration instead of using call_rcu. I would
argue that at this point in the development process, I would rather
prefer to keep allocation/delayed free as decoupled as possible from the
algorithm. So I'll keep this optimisation in mind, but for now I think I
will keep the call_rcu scheme to deal with all memory free.  This makes
it more easy to modify the code when the allocation/delayed free
concerns are all encapsulated through use of call_rcu.

Moreover, this patch really is an optimisation, so it should be backed
by benchmarks that shows if there are measurable performance
improvements.

Thanks!

Mathieu

> ---
>  rculfhash.c |   22 ++++++++++------------
>  1 files changed, 10 insertions(+), 12 deletions(-)
> 
> diff --git a/rculfhash.c b/rculfhash.c
> index e379c71..49f3637 100644
> --- a/rculfhash.c
> +++ b/rculfhash.c
> @@ -209,7 +209,6 @@ struct ht_items_count {
>  } __attribute__((aligned(CAA_CACHE_LINE_SIZE)));
>  
>  struct rcu_level {
> -	struct rcu_head head;
>  	struct _cds_lfht_node nodes[0];
>  };
>  
> @@ -712,14 +711,6 @@ unsigned long _uatomic_max(unsigned long *ptr, unsigned long v)
>  	return v;
>  }
>  
> -static
> -void cds_lfht_free_level(struct rcu_head *head)
> -{
> -	struct rcu_level *l =
> -		caa_container_of(head, struct rcu_level, head);
> -	poison_free(l);
> -}
> -
>  /*
>   * Remove all logically deleted nodes from a bucket up to a certain node key.
>   */
> @@ -1131,8 +1122,7 @@ void init_table(struct cds_lfht *ht,
>  		if (CMM_LOAD_SHARED(ht->t.resize_target) < (!i ? 1 : (1UL << i)))
>  			break;
>  
> -		ht->t.tbl[i] = calloc(1, sizeof(struct rcu_level)
> -				+ (len * sizeof(struct _cds_lfht_node)));
> +		ht->t.tbl[i] = calloc(1, len * sizeof(struct _cds_lfht_node));
>  		assert(ht->t.tbl[i]);
>  
>  		/*
> @@ -1218,6 +1208,7 @@ void fini_table(struct cds_lfht *ht,
>  		unsigned long first_order, unsigned long len_order)
>  {
>  	long i, end_order;
> +	void *free_by_rcu = NULL;
>  
>  	dbg_printf("fini table: first_order %lu end_order %lu\n",
>  		   first_order, first_order + len_order);
> @@ -1243,6 +1234,8 @@ void fini_table(struct cds_lfht *ht,
>  		 * return a logically removed node as insert position.
>  		 */
>  		ht->cds_lfht_synchronize_rcu();
> +		if (free_by_rcu)
> +			free(free_by_rcu);
>  
>  		/*
>  		 * Set "removed" flag in dummy nodes about to be removed.
> @@ -1252,12 +1245,17 @@ void fini_table(struct cds_lfht *ht,
>  		 */
>  		remove_table(ht, i, len);
>  
> -		ht->cds_lfht_call_rcu(&ht->t.tbl[i]->head, cds_lfht_free_level);
> +		free_by_rcu = ht->t.tbl[i];
>  
>  		dbg_printf("fini new size: %lu\n", 1UL << i);
>  		if (CMM_LOAD_SHARED(ht->in_progress_destroy))
>  			break;
>  	}
> +
> +	if (free_by_rcu) {
> +		ht->cds_lfht_synchronize_rcu();
> +		free(free_by_rcu);
> +	}
>  }
>  
>  struct cds_lfht *_cds_lfht_new(cds_lfht_hash_fct hash_fct,
> -- 
> 1.7.4.4
> 

-- 
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com




More information about the lttng-dev mailing list