diff options
Diffstat (limited to 'lib/test_rhashtable.c')
| -rw-r--r-- | lib/test_rhashtable.c | 58 |
1 files changed, 19 insertions, 39 deletions
diff --git a/lib/test_rhashtable.c b/lib/test_rhashtable.c index 67c7593d1dd6..b2957540d3c7 100644 --- a/lib/test_rhashtable.c +++ b/lib/test_rhashtable.c | |||
| @@ -38,6 +38,15 @@ struct test_obj { | |||
| 38 | struct rhash_head node; | 38 | struct rhash_head node; |
| 39 | }; | 39 | }; |
| 40 | 40 | ||
| 41 | static const struct rhashtable_params test_rht_params = { | ||
| 42 | .nelem_hint = TEST_HT_SIZE, | ||
| 43 | .head_offset = offsetof(struct test_obj, node), | ||
| 44 | .key_offset = offsetof(struct test_obj, value), | ||
| 45 | .key_len = sizeof(int), | ||
| 46 | .hashfn = jhash, | ||
| 47 | .nulls_base = (3U << RHT_BASE_SHIFT), | ||
| 48 | }; | ||
| 49 | |||
| 41 | static int __init test_rht_lookup(struct rhashtable *ht) | 50 | static int __init test_rht_lookup(struct rhashtable *ht) |
| 42 | { | 51 | { |
| 43 | unsigned int i; | 52 | unsigned int i; |
| @@ -47,7 +56,7 @@ static int __init test_rht_lookup(struct rhashtable *ht) | |||
| 47 | bool expected = !(i % 2); | 56 | bool expected = !(i % 2); |
| 48 | u32 key = i; | 57 | u32 key = i; |
| 49 | 58 | ||
| 50 | obj = rhashtable_lookup(ht, &key); | 59 | obj = rhashtable_lookup_fast(ht, &key, test_rht_params); |
| 51 | 60 | ||
| 52 | if (expected && !obj) { | 61 | if (expected && !obj) { |
| 53 | pr_warn("Test failed: Could not find key %u\n", key); | 62 | pr_warn("Test failed: Could not find key %u\n", key); |
| @@ -80,7 +89,7 @@ static void test_bucket_stats(struct rhashtable *ht, bool quiet) | |||
| 80 | rcu_cnt = cnt = 0; | 89 | rcu_cnt = cnt = 0; |
| 81 | 90 | ||
| 82 | if (!quiet) | 91 | if (!quiet) |
| 83 | pr_info(" [%#4x/%zu]", i, tbl->size); | 92 | pr_info(" [%#4x/%u]", i, tbl->size); |
| 84 | 93 | ||
| 85 | rht_for_each_entry_rcu(obj, pos, tbl, i, node) { | 94 | rht_for_each_entry_rcu(obj, pos, tbl, i, node) { |
| 86 | cnt++; | 95 | cnt++; |
| @@ -133,7 +142,11 @@ static int __init test_rhashtable(struct rhashtable *ht) | |||
| 133 | obj->ptr = TEST_PTR; | 142 | obj->ptr = TEST_PTR; |
| 134 | obj->value = i * 2; | 143 | obj->value = i * 2; |
| 135 | 144 | ||
| 136 | rhashtable_insert(ht, &obj->node); | 145 | err = rhashtable_insert_fast(ht, &obj->node, test_rht_params); |
| 146 | if (err) { | ||
| 147 | kfree(obj); | ||
| 148 | goto error; | ||
| 149 | } | ||
| 137 | } | 150 | } |
| 138 | 151 | ||
| 139 | rcu_read_lock(); | 152 | rcu_read_lock(); |
| @@ -141,30 +154,6 @@ static int __init test_rhashtable(struct rhashtable *ht) | |||
| 141 | test_rht_lookup(ht); | 154 | test_rht_lookup(ht); |
| 142 | rcu_read_unlock(); | 155 | rcu_read_unlock(); |
| 143 | 156 | ||
| 144 | for (i = 0; i < TEST_NEXPANDS; i++) { | ||
| 145 | pr_info(" Table expansion iteration %u...\n", i); | ||
| 146 | mutex_lock(&ht->mutex); | ||
| 147 | rhashtable_expand(ht); | ||
| 148 | mutex_unlock(&ht->mutex); | ||
| 149 | |||
| 150 | rcu_read_lock(); | ||
| 151 | pr_info(" Verifying lookups...\n"); | ||
| 152 | test_rht_lookup(ht); | ||
| 153 | rcu_read_unlock(); | ||
| 154 | } | ||
| 155 | |||
| 156 | for (i = 0; i < TEST_NEXPANDS; i++) { | ||
| 157 | pr_info(" Table shrinkage iteration %u...\n", i); | ||
| 158 | mutex_lock(&ht->mutex); | ||
| 159 | rhashtable_shrink(ht); | ||
| 160 | mutex_unlock(&ht->mutex); | ||
| 161 | |||
| 162 | rcu_read_lock(); | ||
| 163 | pr_info(" Verifying lookups...\n"); | ||
| 164 | test_rht_lookup(ht); | ||
| 165 | rcu_read_unlock(); | ||
| 166 | } | ||
| 167 | |||
| 168 | rcu_read_lock(); | 157 | rcu_read_lock(); |
| 169 | test_bucket_stats(ht, true); | 158 | test_bucket_stats(ht, true); |
| 170 | rcu_read_unlock(); | 159 | rcu_read_unlock(); |
| @@ -173,10 +162,10 @@ static int __init test_rhashtable(struct rhashtable *ht) | |||
| 173 | for (i = 0; i < TEST_ENTRIES; i++) { | 162 | for (i = 0; i < TEST_ENTRIES; i++) { |
| 174 | u32 key = i * 2; | 163 | u32 key = i * 2; |
| 175 | 164 | ||
| 176 | obj = rhashtable_lookup(ht, &key); | 165 | obj = rhashtable_lookup_fast(ht, &key, test_rht_params); |
| 177 | BUG_ON(!obj); | 166 | BUG_ON(!obj); |
| 178 | 167 | ||
| 179 | rhashtable_remove(ht, &obj->node); | 168 | rhashtable_remove_fast(ht, &obj->node, test_rht_params); |
| 180 | kfree(obj); | 169 | kfree(obj); |
| 181 | } | 170 | } |
| 182 | 171 | ||
| @@ -195,20 +184,11 @@ static struct rhashtable ht; | |||
| 195 | 184 | ||
| 196 | static int __init test_rht_init(void) | 185 | static int __init test_rht_init(void) |
| 197 | { | 186 | { |
| 198 | struct rhashtable_params params = { | ||
| 199 | .nelem_hint = TEST_HT_SIZE, | ||
| 200 | .head_offset = offsetof(struct test_obj, node), | ||
| 201 | .key_offset = offsetof(struct test_obj, value), | ||
| 202 | .key_len = sizeof(int), | ||
| 203 | .hashfn = jhash, | ||
| 204 | .max_shift = 1, /* we expand/shrink manually here */ | ||
| 205 | .nulls_base = (3U << RHT_BASE_SHIFT), | ||
| 206 | }; | ||
| 207 | int err; | 187 | int err; |
| 208 | 188 | ||
| 209 | pr_info("Running resizable hashtable tests...\n"); | 189 | pr_info("Running resizable hashtable tests...\n"); |
| 210 | 190 | ||
| 211 | err = rhashtable_init(&ht, ¶ms); | 191 | err = rhashtable_init(&ht, &test_rht_params); |
| 212 | if (err < 0) { | 192 | if (err < 0) { |
| 213 | pr_warn("Test failed: Unable to initialize hashtable: %d\n", | 193 | pr_warn("Test failed: Unable to initialize hashtable: %d\n", |
| 214 | err); | 194 | err); |
