summaryrefslogtreecommitdiff
path: root/lib/test_rhashtable.c
diff options
context:
space:
mode:
authorThomas Graf <tgraf@suug.ch>2015-05-01 01:37:43 +0300
committerDavid S. Miller <davem@davemloft.net>2015-05-04 06:08:54 +0300
commitfcc570207c1e7c485050adbab1e5d7808eab0fd4 (patch)
treeca4e496a02d7dc9bdb8b3fbe0e9908311020128f /lib/test_rhashtable.c
parentc2c8a901660dcc647ffe5f6dcb1e4c500a5442aa (diff)
downloadlinux-fcc570207c1e7c485050adbab1e5d7808eab0fd4.tar.xz
rhashtable-test: Do not allocate individual test objects
By far the most expensive part of the selftest was the allocation of entries. Using a static array allows to measure the rhashtable operations. Signed-off-by: Thomas Graf <tgraf@suug.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'lib/test_rhashtable.c')
-rw-r--r--lib/test_rhashtable.c28
1 files changed, 6 insertions, 22 deletions
diff --git a/lib/test_rhashtable.c b/lib/test_rhashtable.c
index d6d6719b61b7..935693ed7ae5 100644
--- a/lib/test_rhashtable.c
+++ b/lib/test_rhashtable.c
@@ -49,6 +49,8 @@ struct test_obj {
struct rhash_head node;
};
+static struct test_obj array[MAX_ENTRIES];
+
static struct rhashtable_params test_rht_params = {
.head_offset = offsetof(struct test_obj, node),
.key_offset = offsetof(struct test_obj, value),
@@ -129,9 +131,7 @@ static void test_bucket_stats(struct rhashtable *ht, bool quiet)
static s64 __init test_rhashtable(struct rhashtable *ht)
{
- struct bucket_table *tbl;
struct test_obj *obj;
- struct rhash_head *pos, *next;
int err;
unsigned int i;
s64 start, end;
@@ -143,21 +143,13 @@ static s64 __init test_rhashtable(struct rhashtable *ht)
pr_info(" Adding %d keys\n", entries);
start = ktime_get_ns();
for (i = 0; i < entries; i++) {
- struct test_obj *obj;
-
- obj = kzalloc(sizeof(*obj), GFP_KERNEL);
- if (!obj) {
- err = -ENOMEM;
- goto error;
- }
+ struct test_obj *obj = &array[i];
obj->value = i * 2;
err = rhashtable_insert_fast(ht, &obj->node, test_rht_params);
- if (err) {
- kfree(obj);
- goto error;
- }
+ if (err)
+ return err;
}
rcu_read_lock();
@@ -177,21 +169,12 @@ static s64 __init test_rhashtable(struct rhashtable *ht)
BUG_ON(!obj);
rhashtable_remove_fast(ht, &obj->node, test_rht_params);
- kfree(obj);
}
end = ktime_get_ns();
pr_info(" Duration of test: %lld ns\n", end - start);
return end - start;
-
-error:
- tbl = rht_dereference_rcu(ht->tbl, ht);
- for (i = 0; i < tbl->size; i++)
- rht_for_each_entry_safe(obj, pos, next, tbl, i, node)
- kfree(obj);
-
- return err;
}
static struct rhashtable ht;
@@ -214,6 +197,7 @@ static int __init test_rht_init(void)
s64 time;
pr_info("Test %02d:\n", i);
+ memset(&array, 0, sizeof(array));
err = rhashtable_init(&ht, &test_rht_params);
if (err < 0) {
pr_warn("Test failed: Unable to initialize hashtable: %d\n",