summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wilcox <willy@infradead.org>2018-11-29 22:04:35 +0100
committerMatthew Wilcox <willy@infradead.org>2018-12-06 15:25:33 +0100
commit4f145cd66a1a76136ff5a03a99e37ba082715dc6 (patch)
tree19adeba827a582f6b875df59c10f0e56672d9f55
parentXArray tests: Handle larger indices more elegantly (diff)
downloadlinux-4f145cd66a1a76136ff5a03a99e37ba082715dc6.tar.xz
linux-4f145cd66a1a76136ff5a03a99e37ba082715dc6.zip
XArray tests: Check iterating over multiorder entries
There was no bug here, but there was no test coverage for this scenario. Signed-off-by: Matthew Wilcox <willy@infradead.org>
-rw-r--r--lib/test_xarray.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/test_xarray.c b/lib/test_xarray.c
index d30fd907a3dd..6f09c845187e 100644
--- a/lib/test_xarray.c
+++ b/lib/test_xarray.c
@@ -476,6 +476,32 @@ static noinline void check_multi_store_2(struct xarray *xa, unsigned long index,
xas_unlock(&xas);
XA_BUG_ON(xa, !xa_empty(xa));
}
+
+static noinline void check_multi_store_3(struct xarray *xa, unsigned long index,
+ unsigned int order)
+{
+ XA_STATE(xas, xa, 0);
+ void *entry;
+ int n = 0;
+
+ xa_store_order(xa, index, order, xa_mk_index(index), GFP_KERNEL);
+
+ xas_lock(&xas);
+ xas_for_each(&xas, entry, ULONG_MAX) {
+ XA_BUG_ON(xa, entry != xa_mk_index(index));
+ n++;
+ }
+ XA_BUG_ON(xa, n != 1);
+ xas_set(&xas, index + 1);
+ xas_for_each(&xas, entry, ULONG_MAX) {
+ XA_BUG_ON(xa, entry != xa_mk_index(index));
+ n++;
+ }
+ XA_BUG_ON(xa, n != 2);
+ xas_unlock(&xas);
+
+ xa_destroy(xa);
+}
#endif
static noinline void check_multi_store(struct xarray *xa)
@@ -550,6 +576,11 @@ static noinline void check_multi_store(struct xarray *xa)
check_multi_store_1(xa, (1UL << i) + 1, i);
}
check_multi_store_2(xa, 4095, 9);
+
+ for (i = 1; i < 20; i++) {
+ check_multi_store_3(xa, 0, i);
+ check_multi_store_3(xa, 1UL << i, i);
+ }
#endif
}