[ltt-dev] [PATCH 06/11] Avoid alloc small memory pieces

Lai Jiangshan laijs at cn.fujitsu.com
Fri Oct 14 11:04:36 EDT 2011


Add MIN_ALLOC_ORDER/MIN_ALLOC_SIZE for allocation.

!!Note: current MIN_ALLOC_ORDER is still 0 for debugging.

Signed-off-by: Lai Jiangshan <laijs at cn.fujitsu.com>
---
 rculfhash.c |   29 ++++++++++++++++++++---------
 1 files changed, 20 insertions(+), 9 deletions(-)

diff --git a/rculfhash.c b/rculfhash.c
index 3aba9bc..4ec59f9 100644
--- a/rculfhash.c
+++ b/rculfhash.c
@@ -165,10 +165,13 @@
 #define CHAIN_LEN_TARGET		1
 #define CHAIN_LEN_RESIZE_THRESHOLD	3
 
+#define MIN_ALLOC_ORDER			0
+#define MIN_ALLOC_SIZE			(1UL << MIN_ALLOC_ORDER)
+
 /*
  * Define the minimum table size.
  */
-#define MIN_TABLE_SIZE			1
+#define MIN_TABLE_SIZE			MIN_ALLOC_SIZE
 
 #if (CAA_BITS_PER_LONG == 32)
 #define MAX_TABLE_ORDER			32
@@ -1051,7 +1054,7 @@ void init_table_populate_partition(struct cds_lfht *ht, unsigned long i,
 {
 	unsigned long j;
 
-	assert(i);
+	assert(i > MIN_ALLOC_ORDER);
 	ht->cds_lfht_rcu_read_lock();
 	for (j = start; j < start + len; j++) {
 		struct cds_lfht_node *new_node =
@@ -1090,7 +1093,7 @@ void init_table(struct cds_lfht *ht,
 	dbg_printf("init table: first_order %lu end_order %lu\n",
 		   first_order, first_order + len_order);
 	end_order = first_order + len_order;
-	assert(first_order > 0);
+	assert(first_order > MIN_ALLOC_ORDER);
 	for (i = first_order; i < end_order; i++) {
 		unsigned long len;
 
@@ -1153,7 +1156,7 @@ void remove_table_partition(struct cds_lfht *ht, unsigned long i,
 {
 	unsigned long j;
 
-	assert(i);
+	assert(i > MIN_ALLOC_ORDER);
 	ht->cds_lfht_rcu_read_lock();
 	for (j = start; j < start + len; j++) {
 		struct cds_lfht_node *fini_node =
@@ -1192,7 +1195,7 @@ void fini_table(struct cds_lfht *ht,
 	dbg_printf("fini table: first_order %lu end_order %lu\n",
 		   first_order, first_order + len_order);
 	end_order = first_order + len_order;
-	assert(first_order > 0);
+	assert(first_order > MIN_ALLOC_ORDER);
 	for (i = end_order - 1; i >= first_order; i--) {
 		unsigned long len;
 
@@ -1243,7 +1246,7 @@ void cds_lfht_create_dummy(struct cds_lfht *ht, unsigned long size)
 	struct _cds_lfht_node *prev, *node;
 	unsigned long order, len, i, j;
 
-	ht->t.tbl[0] = calloc(1, sizeof(struct _cds_lfht_node));
+	ht->t.tbl[0] = calloc(1, MIN_ALLOC_SIZE * sizeof(struct _cds_lfht_node));
 	assert(ht->t.tbl[0]);
 
 	dbg_printf("create dummy: order %lu index %lu hash %lu\n", 0, 0, 0);
@@ -1252,8 +1255,12 @@ void cds_lfht_create_dummy(struct cds_lfht *ht, unsigned long size)
 
 	for (order = 1; order < get_count_order_ulong(size) + 1; order++) {
 		len = 1UL << (order - 1);
-		ht->t.tbl[order] = calloc(1, len * sizeof(struct _cds_lfht_node));
-		assert(ht->t.tbl[order]);
+		if (order <= MIN_ALLOC_ORDER) {
+			ht->t.tbl[order] = (void *)(ht->t.tbl[0]->nodes + len);
+		} else {
+			ht->t.tbl[order] = calloc(1, len * sizeof(struct _cds_lfht_node));
+			assert(ht->t.tbl[order]);
+		}
 
 		i = 0;
 		prev = ht->t.tbl[i]->nodes;
@@ -1538,7 +1545,11 @@ int cds_lfht_delete_dummy(struct cds_lfht *ht)
 				bit_reverse_ulong(ht->t.tbl[order]->nodes[i].reverse_hash));
 			assert(is_dummy(ht->t.tbl[order]->nodes[i].next));
 		}
-		poison_free(ht->t.tbl[order]);
+
+		if (order == MIN_ALLOC_ORDER)
+			poison_free(ht->t.tbl[0]);
+		else if (order > MIN_ALLOC_ORDER)
+			poison_free(ht->t.tbl[order]);
 	}
 	return 0;
 }
-- 
1.7.4.4





More information about the lttng-dev mailing list