aboutsummaryrefslogtreecommitdiffstats
path: root/lib/test_xarray.c
diff options
context:
space:
mode:
authorMatthew Wilcox <willy@infradead.org>2017-11-10 15:34:55 -0500
committerMatthew Wilcox <willy@infradead.org>2018-10-21 10:45:58 -0400
commit41aec91f55985e7f14ee75fe2f6e7bcfff0d0fae (patch)
tree4efdedeabd066e15a542b28f21a47731c5323b5b /lib/test_xarray.c
parent58d6ea3085f2e53714810a513c61629f6d2be0a6 (diff)
xarray: Add XArray conditional store operations
Like cmpxchg(), xa_cmpxchg will only store to the index if the current entry matches the old entry. It returns the current entry, which is usually more useful than the errno returned by radix_tree_insert(). For the users who really only want the errno, the xa_insert() wrapper provides a more convenient calling convention. Signed-off-by: Matthew Wilcox <willy@infradead.org>
Diffstat (limited to 'lib/test_xarray.c')
-rw-r--r--lib/test_xarray.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/lib/test_xarray.c b/lib/test_xarray.c
index b711030fbc32..fb472258b639 100644
--- a/lib/test_xarray.c
+++ b/lib/test_xarray.c
@@ -198,6 +198,25 @@ static noinline void check_xa_shrink(struct xarray *xa)
198 XA_BUG_ON(xa, !xa_empty(xa)); 198 XA_BUG_ON(xa, !xa_empty(xa));
199} 199}
200 200
201static noinline void check_cmpxchg(struct xarray *xa)
202{
203 void *FIVE = xa_mk_value(5);
204 void *SIX = xa_mk_value(6);
205 void *LOTS = xa_mk_value(12345678);
206
207 XA_BUG_ON(xa, !xa_empty(xa));
208 XA_BUG_ON(xa, xa_store_index(xa, 12345678, GFP_KERNEL) != NULL);
209 XA_BUG_ON(xa, xa_insert(xa, 12345678, xa, GFP_KERNEL) != -EEXIST);
210 XA_BUG_ON(xa, xa_cmpxchg(xa, 12345678, SIX, FIVE, GFP_KERNEL) != LOTS);
211 XA_BUG_ON(xa, xa_cmpxchg(xa, 12345678, LOTS, FIVE, GFP_KERNEL) != LOTS);
212 XA_BUG_ON(xa, xa_cmpxchg(xa, 12345678, FIVE, LOTS, GFP_KERNEL) != FIVE);
213 XA_BUG_ON(xa, xa_cmpxchg(xa, 5, FIVE, NULL, GFP_KERNEL) != NULL);
214 XA_BUG_ON(xa, xa_cmpxchg(xa, 5, NULL, FIVE, GFP_KERNEL) != NULL);
215 xa_erase_index(xa, 12345678);
216 xa_erase_index(xa, 5);
217 XA_BUG_ON(xa, !xa_empty(xa));
218}
219
201static noinline void check_multi_store(struct xarray *xa) 220static noinline void check_multi_store(struct xarray *xa)
202{ 221{
203#ifdef CONFIG_XARRAY_MULTI 222#ifdef CONFIG_XARRAY_MULTI
@@ -274,6 +293,7 @@ static int xarray_checks(void)
274 check_xa_load(&array); 293 check_xa_load(&array);
275 check_xa_mark(&array); 294 check_xa_mark(&array);
276 check_xa_shrink(&array); 295 check_xa_shrink(&array);
296 check_cmpxchg(&array);
277 check_multi_store(&array); 297 check_multi_store(&array);
278 298
279 printk("XArray: %u of %u tests passed\n", tests_passed, tests_run); 299 printk("XArray: %u of %u tests passed\n", tests_passed, tests_run);