From: laijs@cn.fujitsu.com (Lai Jiangshan)
Subject: [lttng-dev] [PATCH 03/12] it is not required that ht->t.size >= ht->min_table_size now
Date: Mon, 28 Nov 2011 16:07:59 +0800 [thread overview]
Message-ID: <1322467688-2930-4-git-send-email-laijs@cn.fujitsu.com> (raw)
In-Reply-To: <1322467688-2930-1-git-send-email-laijs@cn.fujitsu.com>
Original code always ensure ht->t.size >= ht->min_table_size.
It is not good, ht->min_table_size should be used for allocation,
not for the bucket size in used.
Why does original code need to always ensure:
Original code don't do special alloc/free when ht->t.size < ht->min_table_size
in init_table()/fini_table(), so we have to force ht->t.size >= ht->min_table_size.
Why does new code become flexible:
New code use the wrappers, they handle the special cases.
Signed-off-by: Lai Jiangshan <laijs at cn.fujitsu.com>
---
rculfhash.c | 19 ++++++++++---------
tests/test_urcu_hash.c | 2 +-
2 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/rculfhash.c b/rculfhash.c
index 46bfa7a..8071915 100644
--- a/rculfhash.c
+++ b/rculfhash.c
@@ -187,7 +187,8 @@
/*
* Define the minimum table size.
*/
-#define MIN_TABLE_SIZE 1
+#define MIN_TABLE_ORDER 0
+#define MIN_TABLE_SIZE (1UL << MIN_TABLE_ORDER)
#if (CAA_BITS_PER_LONG == 32)
#define MAX_TABLE_ORDER 32
@@ -1142,7 +1143,7 @@ void init_table_populate_partition(struct cds_lfht *ht, unsigned long i,
{
unsigned long j, size = 1UL << (i - 1);
- assert(i > ht->min_alloc_order);
+ assert(i > MIN_TABLE_ORDER);
ht->cds_lfht_rcu_read_lock();
for (j = size + start; j < size + start + len; j++) {
struct cds_lfht_node *new_node = bucket_at(ht, j);
@@ -1178,7 +1179,7 @@ void init_table(struct cds_lfht *ht,
dbg_printf("init table: first_order %lu last_order %lu\n",
first_order, last_order);
- assert(first_order > ht->min_alloc_order);
+ assert(first_order > MIN_TABLE_ORDER);
for (i = first_order; i <= last_order; i++) {
unsigned long len;
@@ -1240,7 +1241,7 @@ void remove_table_partition(struct cds_lfht *ht, unsigned long i,
{
unsigned long j, size = 1UL << (i - 1);
- assert(i > ht->min_alloc_order);
+ assert(i > MIN_TABLE_ORDER);
ht->cds_lfht_rcu_read_lock();
for (j = size + start; j < size + start + len; j++) {
struct cds_lfht_node *fini_node = bucket_at(ht, j);
@@ -1277,7 +1278,7 @@ void fini_table(struct cds_lfht *ht,
dbg_printf("fini table: first_order %lu last_order %lu\n",
first_order, last_order);
- assert(first_order > ht->min_alloc_order);
+ assert(first_order > MIN_TABLE_ORDER);
for (i = last_order; i >= first_order; i--) {
unsigned long len;
@@ -1390,7 +1391,7 @@ struct cds_lfht *_cds_lfht_new(unsigned long init_size,
if (!init_size || (init_size & (init_size - 1)))
return NULL;
min_alloc_size = max(min_alloc_size, MIN_TABLE_SIZE);
- init_size = max(init_size, min_alloc_size);
+ init_size = max(init_size, MIN_TABLE_SIZE);
ht = calloc(1, sizeof(struct cds_lfht));
assert(ht);
ht->flags = flags;
@@ -1720,7 +1721,7 @@ void _do_cds_lfht_shrink(struct cds_lfht *ht,
{
unsigned long old_order, new_order;
- new_size = max(new_size, ht->min_alloc_size);
+ new_size = max(new_size, MIN_TABLE_SIZE);
old_order = get_count_order_ulong(old_size);
new_order = get_count_order_ulong(new_size);
dbg_printf("resize from %lu (order %lu) to %lu (order %lu) buckets\n",
@@ -1768,7 +1769,7 @@ static
void resize_target_update_count(struct cds_lfht *ht,
unsigned long count)
{
- count = max(count, ht->min_alloc_size);
+ count = max(count, MIN_TABLE_SIZE);
uatomic_set(&ht->t.resize_target, count);
}
@@ -1843,7 +1844,7 @@ void cds_lfht_resize_lazy_count(struct cds_lfht *ht, unsigned long size,
{
if (!(ht->flags & CDS_LFHT_AUTO_RESIZE))
return;
- count = max(count, ht->min_alloc_size);
+ count = max(count, MIN_TABLE_SIZE);
if (count == size)
return; /* Already the right size, no resize needed */
if (count > size) { /* lazy grow */
diff --git a/tests/test_urcu_hash.c b/tests/test_urcu_hash.c
index fe650f3..01ae01a 100644
--- a/tests/test_urcu_hash.c
+++ b/tests/test_urcu_hash.c
@@ -896,7 +896,7 @@ int main(int argc, char **argv)
return -1;
}
- if (min_hash_alloc_size && min_hash_alloc_size * (min_hash_alloc_size - 1)) {
+ if (min_hash_alloc_size && min_hash_alloc_size & (min_hash_alloc_size - 1)) {
printf("Error: Min hash alloc size %lu is not a power of 2.\n",
min_hash_alloc_size);
return -1;
--
1.7.4.4
next prev parent reply other threads:[~2011-11-28 8:07 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-28 8:07 [lttng-dev] [PATCH 00/12] rculfhash memory managements Lai Jiangshan
2011-11-28 8:07 ` [lttng-dev] [PATCH 01/12] introduce bucket_at() and improve readability Lai Jiangshan
2011-11-28 13:01 ` Mathieu Desnoyers
2011-11-28 8:07 ` [lttng-dev] [PATCH 02/12] proper wrapper for bucket table alloc and free Lai Jiangshan
2011-11-28 13:02 ` Mathieu Desnoyers
2011-11-28 8:07 ` Lai Jiangshan [this message]
2011-11-28 13:07 ` [lttng-dev] [PATCH 03/12] it is not required that ht->t.size >= ht->min_table_size now Mathieu Desnoyers
2011-11-28 8:08 ` [lttng-dev] [PATCH 04/12] remove struct rcu_level Lai Jiangshan
2011-11-28 13:08 ` Mathieu Desnoyers
2011-11-28 8:08 ` [lttng-dev] [PATCH 05/12] rename min_alloc_size/min_alloc_order Lai Jiangshan
2011-11-28 13:14 ` Mathieu Desnoyers
2011-11-28 8:08 ` [lttng-dev] [PATCH 06/12] add max_nr_buckets argument Lai Jiangshan
2011-11-28 13:24 ` Mathieu Desnoyers
2011-11-28 8:08 ` [lttng-dev] [PATCH 07/12] Add rcu_flavor Lai Jiangshan
2011-11-28 13:23 ` Mathieu Desnoyers
2011-11-28 8:08 ` [lttng-dev] [PATCH 08/12] use rcu_flavor for rculfhash Lai Jiangshan
2011-11-28 13:24 ` Mathieu Desnoyers
2011-11-28 8:08 ` [lttng-dev] [PATCH 09/12] remove struct rcu_table Lai Jiangshan
2011-11-28 13:25 ` Mathieu Desnoyers
2011-11-28 8:08 ` [lttng-dev] [PATCH 10/12] move memory management code out as rculfhash-mm-order.c Lai Jiangshan
2011-11-28 13:27 ` Mathieu Desnoyers
2011-11-28 8:08 ` [lttng-dev] [PATCH 11/12] add rculfhash-mm-chunk.c memory management Lai Jiangshan
2011-11-28 13:33 ` Mathieu Desnoyers
2011-11-28 8:08 ` [lttng-dev] [PATCH 12/12] add rculfhash-mm-mmap.c " Lai Jiangshan
2011-11-28 13:43 ` Mathieu Desnoyers
2011-11-28 14:05 ` Lai Jiangshan
2011-11-28 14:15 ` Mathieu Desnoyers
2011-11-28 13:43 ` [lttng-dev] [PATCH 00/12] rculfhash memory managements Mathieu Desnoyers
2011-11-28 14:23 ` Lai Jiangshan
2011-11-28 14:39 ` Mathieu Desnoyers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1322467688-2930-4-git-send-email-laijs@cn.fujitsu.com \
--to=laijs@cn.fujitsu.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox