Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4f145cd6 authored by Matthew Wilcox's avatar Matthew Wilcox
Browse files

XArray tests: Check iterating over multiorder entries



There was no bug here, but there was no test coverage for this scenario.

Signed-off-by: default avatarMatthew Wilcox <willy@infradead.org>
parent b7677a13
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -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
}