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;