XArray: Test marked multiorder iterations

Demonstrate that starting a marked iteration partway through a marked
multi-order entry works.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
This commit is contained in:
Matthew Wilcox (Oracle) 2020-06-14 21:52:04 -04:00
parent 062b735912
commit 04e9e9bb84
1 changed files with 22 additions and 0 deletions

View File

@ -289,6 +289,27 @@ static noinline void check_xa_mark_2(struct xarray *xa)
xa_destroy(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) static noinline void check_xa_mark(struct xarray *xa)
{ {
unsigned long index; 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_1(xa, index);
check_xa_mark_2(xa); check_xa_mark_2(xa);
check_xa_mark_3(xa);
} }
static noinline void check_xa_shrink(struct xarray *xa) static noinline void check_xa_shrink(struct xarray *xa)