diff options
author | Matthew Wilcox <willy@infradead.org> | 2018-11-19 09:36:29 -0500 |
---|---|---|
committer | Matthew Wilcox <willy@infradead.org> | 2018-11-19 09:41:11 -0500 |
commit | fffc9a260e38acec3187515738122a3ecb24ac90 (patch) | |
tree | c8d19d24150f0aa3cb6afdde8f925dd2215125bb /lib/test_xarray.c | |
parent | 25bbe21bf427a81b8e3ccd480ea0e1d940256156 (diff) |
XArray tests: Add missing locking
Lockdep caught me being sloppy in the test suite and failing to lock
the XArray appropriately.
Reported-by: kernel test robot <rong.a.chen@intel.com>
Signed-off-by: Matthew Wilcox <willy@infradead.org>
Diffstat (limited to 'lib/test_xarray.c')
-rw-r--r-- | lib/test_xarray.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/lib/test_xarray.c b/lib/test_xarray.c index 5f9c14e975a4..0598e86af8fc 100644 --- a/lib/test_xarray.c +++ b/lib/test_xarray.c | |||
@@ -208,15 +208,19 @@ static noinline void check_xa_mark_1(struct xarray *xa, unsigned long index) | |||
208 | XA_BUG_ON(xa, xa_get_mark(xa, i, XA_MARK_2)); | 208 | XA_BUG_ON(xa, xa_get_mark(xa, i, XA_MARK_2)); |
209 | 209 | ||
210 | /* We should see two elements in the array */ | 210 | /* We should see two elements in the array */ |
211 | rcu_read_lock(); | ||
211 | xas_for_each(&xas, entry, ULONG_MAX) | 212 | xas_for_each(&xas, entry, ULONG_MAX) |
212 | seen++; | 213 | seen++; |
214 | rcu_read_unlock(); | ||
213 | XA_BUG_ON(xa, seen != 2); | 215 | XA_BUG_ON(xa, seen != 2); |
214 | 216 | ||
215 | /* One of which is marked */ | 217 | /* One of which is marked */ |
216 | xas_set(&xas, 0); | 218 | xas_set(&xas, 0); |
217 | seen = 0; | 219 | seen = 0; |
220 | rcu_read_lock(); | ||
218 | xas_for_each_marked(&xas, entry, ULONG_MAX, XA_MARK_0) | 221 | xas_for_each_marked(&xas, entry, ULONG_MAX, XA_MARK_0) |
219 | seen++; | 222 | seen++; |
223 | rcu_read_unlock(); | ||
220 | XA_BUG_ON(xa, seen != 1); | 224 | XA_BUG_ON(xa, seen != 1); |
221 | } | 225 | } |
222 | XA_BUG_ON(xa, xa_get_mark(xa, next, XA_MARK_0)); | 226 | XA_BUG_ON(xa, xa_get_mark(xa, next, XA_MARK_0)); |
@@ -442,7 +446,9 @@ static noinline void check_multi_store_1(struct xarray *xa, unsigned long index, | |||
442 | XA_BUG_ON(xa, xa_load(xa, max) != NULL); | 446 | XA_BUG_ON(xa, xa_load(xa, max) != NULL); |
443 | XA_BUG_ON(xa, xa_load(xa, min - 1) != NULL); | 447 | XA_BUG_ON(xa, xa_load(xa, min - 1) != NULL); |
444 | 448 | ||
449 | xas_lock(&xas); | ||
445 | XA_BUG_ON(xa, xas_store(&xas, xa_mk_value(min)) != xa_mk_value(index)); | 450 | XA_BUG_ON(xa, xas_store(&xas, xa_mk_value(min)) != xa_mk_value(index)); |
451 | xas_unlock(&xas); | ||
446 | XA_BUG_ON(xa, xa_load(xa, min) != xa_mk_value(min)); | 452 | XA_BUG_ON(xa, xa_load(xa, min) != xa_mk_value(min)); |
447 | XA_BUG_ON(xa, xa_load(xa, max - 1) != xa_mk_value(min)); | 453 | XA_BUG_ON(xa, xa_load(xa, max - 1) != xa_mk_value(min)); |
448 | XA_BUG_ON(xa, xa_load(xa, max) != NULL); | 454 | XA_BUG_ON(xa, xa_load(xa, max) != NULL); |
@@ -458,9 +464,11 @@ static noinline void check_multi_store_2(struct xarray *xa, unsigned long index, | |||
458 | XA_STATE(xas, xa, index); | 464 | XA_STATE(xas, xa, index); |
459 | xa_store_order(xa, index, order, xa_mk_value(0), GFP_KERNEL); | 465 | xa_store_order(xa, index, order, xa_mk_value(0), GFP_KERNEL); |
460 | 466 | ||
467 | xas_lock(&xas); | ||
461 | XA_BUG_ON(xa, xas_store(&xas, xa_mk_value(1)) != xa_mk_value(0)); | 468 | XA_BUG_ON(xa, xas_store(&xas, xa_mk_value(1)) != xa_mk_value(0)); |
462 | XA_BUG_ON(xa, xas.xa_index != index); | 469 | XA_BUG_ON(xa, xas.xa_index != index); |
463 | XA_BUG_ON(xa, xas_store(&xas, NULL) != xa_mk_value(1)); | 470 | XA_BUG_ON(xa, xas_store(&xas, NULL) != xa_mk_value(1)); |
471 | xas_unlock(&xas); | ||
464 | XA_BUG_ON(xa, !xa_empty(xa)); | 472 | XA_BUG_ON(xa, !xa_empty(xa)); |
465 | } | 473 | } |
466 | #endif | 474 | #endif |
@@ -1180,10 +1188,12 @@ static noinline void check_account(struct xarray *xa) | |||
1180 | XA_STATE(xas, xa, 1 << order); | 1188 | XA_STATE(xas, xa, 1 << order); |
1181 | 1189 | ||
1182 | xa_store_order(xa, 0, order, xa, GFP_KERNEL); | 1190 | xa_store_order(xa, 0, order, xa, GFP_KERNEL); |
1191 | rcu_read_lock(); | ||
1183 | xas_load(&xas); | 1192 | xas_load(&xas); |
1184 | XA_BUG_ON(xa, xas.xa_node->count == 0); | 1193 | XA_BUG_ON(xa, xas.xa_node->count == 0); |
1185 | XA_BUG_ON(xa, xas.xa_node->count > (1 << order)); | 1194 | XA_BUG_ON(xa, xas.xa_node->count > (1 << order)); |
1186 | XA_BUG_ON(xa, xas.xa_node->nr_values != 0); | 1195 | XA_BUG_ON(xa, xas.xa_node->nr_values != 0); |
1196 | rcu_read_unlock(); | ||
1187 | 1197 | ||
1188 | xa_store_order(xa, 1 << order, order, xa_mk_value(1 << order), | 1198 | xa_store_order(xa, 1 << order, order, xa_mk_value(1 << order), |
1189 | GFP_KERNEL); | 1199 | GFP_KERNEL); |