Commit fcc57020 authored by Thomas Graf's avatar Thomas Graf Committed by David S. Miller

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: default avatarThomas Graf <tgraf@suug.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c2c8a901
...@@ -49,6 +49,8 @@ struct test_obj { ...@@ -49,6 +49,8 @@ struct test_obj {
struct rhash_head node; struct rhash_head node;
}; };
static struct test_obj array[MAX_ENTRIES];
static struct rhashtable_params test_rht_params = { static struct rhashtable_params test_rht_params = {
.head_offset = offsetof(struct test_obj, node), .head_offset = offsetof(struct test_obj, node),
.key_offset = offsetof(struct test_obj, value), .key_offset = offsetof(struct test_obj, value),
...@@ -129,9 +131,7 @@ static void test_bucket_stats(struct rhashtable *ht, bool quiet) ...@@ -129,9 +131,7 @@ static void test_bucket_stats(struct rhashtable *ht, bool quiet)
static s64 __init test_rhashtable(struct rhashtable *ht) static s64 __init test_rhashtable(struct rhashtable *ht)
{ {
struct bucket_table *tbl;
struct test_obj *obj; struct test_obj *obj;
struct rhash_head *pos, *next;
int err; int err;
unsigned int i; unsigned int i;
s64 start, end; s64 start, end;
...@@ -143,21 +143,13 @@ static s64 __init test_rhashtable(struct rhashtable *ht) ...@@ -143,21 +143,13 @@ static s64 __init test_rhashtable(struct rhashtable *ht)
pr_info(" Adding %d keys\n", entries); pr_info(" Adding %d keys\n", entries);
start = ktime_get_ns(); start = ktime_get_ns();
for (i = 0; i < entries; i++) { for (i = 0; i < entries; i++) {
struct test_obj *obj; struct test_obj *obj = &array[i];
obj = kzalloc(sizeof(*obj), GFP_KERNEL);
if (!obj) {
err = -ENOMEM;
goto error;
}
obj->value = i * 2; obj->value = i * 2;
err = rhashtable_insert_fast(ht, &obj->node, test_rht_params); err = rhashtable_insert_fast(ht, &obj->node, test_rht_params);
if (err) { if (err)
kfree(obj); return err;
goto error;
}
} }
rcu_read_lock(); rcu_read_lock();
...@@ -177,21 +169,12 @@ static s64 __init test_rhashtable(struct rhashtable *ht) ...@@ -177,21 +169,12 @@ static s64 __init test_rhashtable(struct rhashtable *ht)
BUG_ON(!obj); BUG_ON(!obj);
rhashtable_remove_fast(ht, &obj->node, test_rht_params); rhashtable_remove_fast(ht, &obj->node, test_rht_params);
kfree(obj);
} }
end = ktime_get_ns(); end = ktime_get_ns();
pr_info(" Duration of test: %lld ns\n", end - start); pr_info(" Duration of test: %lld ns\n", end - start);
return 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; static struct rhashtable ht;
...@@ -214,6 +197,7 @@ static int __init test_rht_init(void) ...@@ -214,6 +197,7 @@ static int __init test_rht_init(void)
s64 time; s64 time;
pr_info("Test %02d:\n", i); pr_info("Test %02d:\n", i);
memset(&array, 0, sizeof(array));
err = rhashtable_init(&ht, &test_rht_params); err = rhashtable_init(&ht, &test_rht_params);
if (err < 0) { if (err < 0) {
pr_warn("Test failed: Unable to initialize hashtable: %d\n", pr_warn("Test failed: Unable to initialize hashtable: %d\n",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment