Support setting reader and writer ranges via module params
diff --git a/rcuhashbash.c b/rcuhashbash.c
index 730423f..4a78431 100644
--- a/rcuhashbash.c
+++ b/rcuhashbash.c
@@ -27,6 +27,8 @@
static int writers = -1; /* Number of writer tasks; defaults to online CPUs */
static unsigned long buckets = 1024; /* Number of hash table buckets */
static unsigned long entries = 4096; /* Number of entries initially added */
+static unsigned long reader_range = 0; /* Upper bound of reader range */
+static unsigned long writer_range = 0; /* Upper bound of writer range */
module_param(reader_type, charp, 0444);
MODULE_PARM_DESC(reader_type, "Hash table reader implementation");
@@ -40,6 +42,10 @@
MODULE_PARM_DESC(buckets, "Number of hash buckets");
module_param(entries, ulong, 0444);
MODULE_PARM_DESC(entries, "Number of hash table entries");
+module_param(reader_range, ulong, 0444);
+MODULE_PARM_DESC(reader_range, "Upper bound of reader operating range (default 2*entries)");
+module_param(writer_range, ulong, 0444);
+MODULE_PARM_DESC(writer_range, "Upper bound of writer operating range (default 2*entries)");
struct rcuhashbash_bucket {
struct hlist_head head;
@@ -140,7 +146,7 @@
cond_resched();
- value = rcu_random(&rand) % (entries * 2);
+ value = rcu_random(&rand) % reader_range;
hlist_for_each_entry(entry, node, &hash_table[value % buckets].head, node)
if (entry->value == value)
@@ -171,7 +177,7 @@
cond_resched();
- value = rcu_random(&rand) % (entries * 2);
+ value = rcu_random(&rand) % reader_range;
hlist_for_each_entry_rcu(entry, node, &hash_table[value % buckets].head, node)
if (entry->value == value)
@@ -202,7 +208,7 @@
cond_resched();
- value = rcu_random(&rand) % (entries * 2);
+ value = rcu_random(&rand) % reader_range;
rcu_read_lock();
hlist_for_each_entry_rcu(entry, node, &hash_table[value % buckets].head, node)
@@ -235,7 +241,7 @@
cond_resched();
- value = rcu_random(&rand) % (entries * 2);
+ value = rcu_random(&rand) % reader_range;
bucket = value % buckets;
if (ops->read_lock_bucket)
@@ -273,7 +279,7 @@
cond_resched();
- value = rcu_random(&rand) % (entries * 2);
+ value = rcu_random(&rand) % reader_range;
do {
seq = read_seqcount_begin(&table_seqcount);
@@ -326,9 +332,9 @@
cond_resched();
- src_value = rcu_random(&rand) % (entries * 2);
+ src_value = rcu_random(&rand) % writer_range;
src_bucket = src_value % buckets;
- dst_value = rcu_random(&rand) % (entries * 2);
+ dst_value = rcu_random(&rand) % writer_range;
dst_bucket = dst_value % buckets;
same_bucket = src_bucket == dst_bucket;
@@ -435,9 +441,9 @@
cond_resched();
- src_value = rcu_random(&rand) % (entries * 2);
+ src_value = rcu_random(&rand) % writer_range;
src_bucket = src_value % buckets;
- dst_value = rcu_random(&rand) % (entries * 2);
+ dst_value = rcu_random(&rand) % writer_range;
dst_bucket = dst_value % buckets;
same_bucket = src_bucket == dst_bucket;
@@ -515,9 +521,9 @@
cond_resched();
- src_value = rcu_random(&rand) % (entries * 2);
+ src_value = rcu_random(&rand) % writer_range;
src_bucket = src_value % buckets;
- dst_value = rcu_random(&rand) % (entries * 2);
+ dst_value = rcu_random(&rand) % writer_range;
dst_bucket = dst_value % buckets;
same_bucket = src_bucket == dst_bucket;
@@ -978,11 +984,11 @@
}
printk(KERN_ALERT "rcuhashbash summary: readers=%d reader_type=%s writers=%d writer_type=%s\n"
- KERN_ALERT "rcuhashbash summary: buckets=%lu entries=%lu\n"
+ KERN_ALERT "rcuhashbash summary: buckets=%lu entries=%lu reader_range=%lu writer_range=%lu\n"
KERN_ALERT "rcuhashbash summary: writers: %llu moves, %llu dests in use, %llu misses\n"
KERN_ALERT "rcuhashbash summary: readers: %llu hits, %llu misses\n",
readers, reader_type, writers, writer_type,
- buckets, entries,
+ buckets, entries, reader_range, writer_range,
ws.moves, ws.dests_in_use, ws.misses,
rs.hits, rs.misses);
}
@@ -1074,6 +1080,11 @@
return -EINVAL;
}
+ if (reader_range == 0)
+ reader_range = 2*entries;
+ if (writer_range == 0)
+ writer_range = 2*entries;
+
entry_cache = KMEM_CACHE(rcuhashbash_entry, 0);
if (!entry_cache)
goto enomem;