XArray: Test marked multiorder iterations
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 15 Jun 2020 01:52:04 +0000 (21:52 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Thu, 8 Oct 2020 14:07:15 +0000 (10:07 -0400)
Demonstrate that starting a marked iteration partway through a marked
multi-order entry works.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
lib/test_xarray.c

index 9fc3da430aba16842cefae29499dc3f74b438d4b..1122c4453c87dc1bf1c08d75dfe85347b7dce200 100644 (file)
@@ -289,6 +289,27 @@ static noinline void check_xa_mark_2(struct xarray *xa)
        xa_destroy(xa);
 }
 
+static noinline void check_xa_mark_3(struct xarray *xa)
+{
+#ifdef CONFIG_XARRAY_MULTI
+       XA_STATE(xas, xa, 0x41);
+       void *entry;
+       int count = 0;
+
+       xa_store_order(xa, 0x40, 2, xa_mk_index(0x40), GFP_KERNEL);
+       xa_set_mark(xa, 0x41, XA_MARK_0);
+
+       rcu_read_lock();
+       xas_for_each_marked(&xas, entry, ULONG_MAX, XA_MARK_0) {
+               count++;
+               XA_BUG_ON(xa, entry != xa_mk_index(0x40));
+       }
+       XA_BUG_ON(xa, count != 1);
+       rcu_read_unlock();
+       xa_destroy(xa);
+#endif
+}
+
 static noinline void check_xa_mark(struct xarray *xa)
 {
        unsigned long index;
@@ -297,6 +318,7 @@ static noinline void check_xa_mark(struct xarray *xa)
                check_xa_mark_1(xa, index);
 
        check_xa_mark_2(xa);
+       check_xa_mark_3(xa);
 }
 
 static noinline void check_xa_shrink(struct xarray *xa)