Skip to content

Commit

Permalink
rhashtable-test: Do not allocate individual test objects
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Thomas Graf authored and David S. Miller committed May 4, 2015
1 parent c2c8a90 commit fcc5702
Showing 1 changed file with 6 additions and 22 deletions.
28 changes: 6 additions & 22 deletions lib/test_rhashtable.c
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down Expand Up @@ -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;
Expand All @@ -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();
Expand All @@ -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;
Expand All @@ -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",
Expand Down

0 comments on commit fcc5702

Please sign in to comment.