Linux Audio

Check our new training course

Loading...
v5.14.15
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * test_xarray.c: Test the XArray API
   4 * Copyright (c) 2017-2018 Microsoft Corporation
   5 * Copyright (c) 2019-2020 Oracle
   6 * Author: Matthew Wilcox <willy@infradead.org>
   7 */
   8
   9#include <linux/xarray.h>
  10#include <linux/module.h>
  11
  12static unsigned int tests_run;
  13static unsigned int tests_passed;
  14
  15static const unsigned int order_limit =
  16		IS_ENABLED(CONFIG_XARRAY_MULTI) ? BITS_PER_LONG : 1;
  17
  18#ifndef XA_DEBUG
  19# ifdef __KERNEL__
  20void xa_dump(const struct xarray *xa) { }
  21# endif
  22#undef XA_BUG_ON
  23#define XA_BUG_ON(xa, x) do {					\
  24	tests_run++;						\
  25	if (x) {						\
  26		printk("BUG at %s:%d\n", __func__, __LINE__);	\
  27		xa_dump(xa);					\
  28		dump_stack();					\
  29	} else {						\
  30		tests_passed++;					\
  31	}							\
  32} while (0)
  33#endif
  34
  35static void *xa_mk_index(unsigned long index)
  36{
  37	return xa_mk_value(index & LONG_MAX);
  38}
  39
  40static void *xa_store_index(struct xarray *xa, unsigned long index, gfp_t gfp)
  41{
  42	return xa_store(xa, index, xa_mk_index(index), gfp);
  43}
  44
  45static void xa_insert_index(struct xarray *xa, unsigned long index)
  46{
  47	XA_BUG_ON(xa, xa_insert(xa, index, xa_mk_index(index),
  48				GFP_KERNEL) != 0);
  49}
  50
  51static void xa_alloc_index(struct xarray *xa, unsigned long index, gfp_t gfp)
  52{
  53	u32 id;
  54
  55	XA_BUG_ON(xa, xa_alloc(xa, &id, xa_mk_index(index), xa_limit_32b,
  56				gfp) != 0);
  57	XA_BUG_ON(xa, id != index);
  58}
  59
  60static void xa_erase_index(struct xarray *xa, unsigned long index)
  61{
  62	XA_BUG_ON(xa, xa_erase(xa, index) != xa_mk_index(index));
  63	XA_BUG_ON(xa, xa_load(xa, index) != NULL);
  64}
  65
  66/*
  67 * If anyone needs this, please move it to xarray.c.  We have no current
  68 * users outside the test suite because all current multislot users want
  69 * to use the advanced API.
  70 */
  71static void *xa_store_order(struct xarray *xa, unsigned long index,
  72		unsigned order, void *entry, gfp_t gfp)
  73{
  74	XA_STATE_ORDER(xas, xa, index, order);
  75	void *curr;
  76
  77	do {
  78		xas_lock(&xas);
  79		curr = xas_store(&xas, entry);
  80		xas_unlock(&xas);
  81	} while (xas_nomem(&xas, gfp));
  82
  83	return curr;
  84}
  85
  86static noinline void check_xa_err(struct xarray *xa)
  87{
  88	XA_BUG_ON(xa, xa_err(xa_store_index(xa, 0, GFP_NOWAIT)) != 0);
  89	XA_BUG_ON(xa, xa_err(xa_erase(xa, 0)) != 0);
  90#ifndef __KERNEL__
  91	/* The kernel does not fail GFP_NOWAIT allocations */
  92	XA_BUG_ON(xa, xa_err(xa_store_index(xa, 1, GFP_NOWAIT)) != -ENOMEM);
  93	XA_BUG_ON(xa, xa_err(xa_store_index(xa, 1, GFP_NOWAIT)) != -ENOMEM);
  94#endif
  95	XA_BUG_ON(xa, xa_err(xa_store_index(xa, 1, GFP_KERNEL)) != 0);
  96	XA_BUG_ON(xa, xa_err(xa_store(xa, 1, xa_mk_value(0), GFP_KERNEL)) != 0);
  97	XA_BUG_ON(xa, xa_err(xa_erase(xa, 1)) != 0);
  98// kills the test-suite :-(
  99//	XA_BUG_ON(xa, xa_err(xa_store(xa, 0, xa_mk_internal(0), 0)) != -EINVAL);
 100}
 101
 102static noinline void check_xas_retry(struct xarray *xa)
 103{
 104	XA_STATE(xas, xa, 0);
 105	void *entry;
 106
 107	xa_store_index(xa, 0, GFP_KERNEL);
 108	xa_store_index(xa, 1, GFP_KERNEL);
 109
 110	rcu_read_lock();
 111	XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != xa_mk_value(0));
 112	xa_erase_index(xa, 1);
 113	XA_BUG_ON(xa, !xa_is_retry(xas_reload(&xas)));
 114	XA_BUG_ON(xa, xas_retry(&xas, NULL));
 115	XA_BUG_ON(xa, xas_retry(&xas, xa_mk_value(0)));
 116	xas_reset(&xas);
 117	XA_BUG_ON(xa, xas.xa_node != XAS_RESTART);
 118	XA_BUG_ON(xa, xas_next_entry(&xas, ULONG_MAX) != xa_mk_value(0));
 119	XA_BUG_ON(xa, xas.xa_node != NULL);
 120	rcu_read_unlock();
 121
 122	XA_BUG_ON(xa, xa_store_index(xa, 1, GFP_KERNEL) != NULL);
 123
 124	rcu_read_lock();
 125	XA_BUG_ON(xa, !xa_is_internal(xas_reload(&xas)));
 126	xas.xa_node = XAS_RESTART;
 127	XA_BUG_ON(xa, xas_next_entry(&xas, ULONG_MAX) != xa_mk_value(0));
 128	rcu_read_unlock();
 129
 130	/* Make sure we can iterate through retry entries */
 131	xas_lock(&xas);
 132	xas_set(&xas, 0);
 133	xas_store(&xas, XA_RETRY_ENTRY);
 134	xas_set(&xas, 1);
 135	xas_store(&xas, XA_RETRY_ENTRY);
 136
 137	xas_set(&xas, 0);
 138	xas_for_each(&xas, entry, ULONG_MAX) {
 139		xas_store(&xas, xa_mk_index(xas.xa_index));
 140	}
 141	xas_unlock(&xas);
 142
 143	xa_erase_index(xa, 0);
 144	xa_erase_index(xa, 1);
 145}
 146
 147static noinline void check_xa_load(struct xarray *xa)
 148{
 149	unsigned long i, j;
 150
 151	for (i = 0; i < 1024; i++) {
 152		for (j = 0; j < 1024; j++) {
 153			void *entry = xa_load(xa, j);
 154			if (j < i)
 155				XA_BUG_ON(xa, xa_to_value(entry) != j);
 156			else
 157				XA_BUG_ON(xa, entry);
 158		}
 159		XA_BUG_ON(xa, xa_store_index(xa, i, GFP_KERNEL) != NULL);
 160	}
 161
 162	for (i = 0; i < 1024; i++) {
 163		for (j = 0; j < 1024; j++) {
 164			void *entry = xa_load(xa, j);
 165			if (j >= i)
 166				XA_BUG_ON(xa, xa_to_value(entry) != j);
 167			else
 168				XA_BUG_ON(xa, entry);
 169		}
 170		xa_erase_index(xa, i);
 171	}
 172	XA_BUG_ON(xa, !xa_empty(xa));
 173}
 174
 175static noinline void check_xa_mark_1(struct xarray *xa, unsigned long index)
 176{
 177	unsigned int order;
 178	unsigned int max_order = IS_ENABLED(CONFIG_XARRAY_MULTI) ? 8 : 1;
 179
 180	/* NULL elements have no marks set */
 181	XA_BUG_ON(xa, xa_get_mark(xa, index, XA_MARK_0));
 182	xa_set_mark(xa, index, XA_MARK_0);
 183	XA_BUG_ON(xa, xa_get_mark(xa, index, XA_MARK_0));
 184
 185	/* Storing a pointer will not make a mark appear */
 186	XA_BUG_ON(xa, xa_store_index(xa, index, GFP_KERNEL) != NULL);
 187	XA_BUG_ON(xa, xa_get_mark(xa, index, XA_MARK_0));
 188	xa_set_mark(xa, index, XA_MARK_0);
 189	XA_BUG_ON(xa, !xa_get_mark(xa, index, XA_MARK_0));
 190
 191	/* Setting one mark will not set another mark */
 192	XA_BUG_ON(xa, xa_get_mark(xa, index + 1, XA_MARK_0));
 193	XA_BUG_ON(xa, xa_get_mark(xa, index, XA_MARK_1));
 194
 195	/* Storing NULL clears marks, and they can't be set again */
 196	xa_erase_index(xa, index);
 197	XA_BUG_ON(xa, !xa_empty(xa));
 198	XA_BUG_ON(xa, xa_get_mark(xa, index, XA_MARK_0));
 199	xa_set_mark(xa, index, XA_MARK_0);
 200	XA_BUG_ON(xa, xa_get_mark(xa, index, XA_MARK_0));
 201
 202	/*
 203	 * Storing a multi-index entry over entries with marks gives the
 204	 * entire entry the union of the marks
 205	 */
 206	BUG_ON((index % 4) != 0);
 207	for (order = 2; order < max_order; order++) {
 208		unsigned long base = round_down(index, 1UL << order);
 209		unsigned long next = base + (1UL << order);
 210		unsigned long i;
 211
 212		XA_BUG_ON(xa, xa_store_index(xa, index + 1, GFP_KERNEL));
 213		xa_set_mark(xa, index + 1, XA_MARK_0);
 214		XA_BUG_ON(xa, xa_store_index(xa, index + 2, GFP_KERNEL));
 215		xa_set_mark(xa, index + 2, XA_MARK_2);
 216		XA_BUG_ON(xa, xa_store_index(xa, next, GFP_KERNEL));
 217		xa_store_order(xa, index, order, xa_mk_index(index),
 218				GFP_KERNEL);
 219		for (i = base; i < next; i++) {
 220			XA_STATE(xas, xa, i);
 221			unsigned int seen = 0;
 222			void *entry;
 223
 224			XA_BUG_ON(xa, !xa_get_mark(xa, i, XA_MARK_0));
 225			XA_BUG_ON(xa, xa_get_mark(xa, i, XA_MARK_1));
 226			XA_BUG_ON(xa, !xa_get_mark(xa, i, XA_MARK_2));
 227
 228			/* We should see two elements in the array */
 229			rcu_read_lock();
 230			xas_for_each(&xas, entry, ULONG_MAX)
 231				seen++;
 232			rcu_read_unlock();
 233			XA_BUG_ON(xa, seen != 2);
 234
 235			/* One of which is marked */
 236			xas_set(&xas, 0);
 237			seen = 0;
 238			rcu_read_lock();
 239			xas_for_each_marked(&xas, entry, ULONG_MAX, XA_MARK_0)
 240				seen++;
 241			rcu_read_unlock();
 242			XA_BUG_ON(xa, seen != 1);
 243		}
 244		XA_BUG_ON(xa, xa_get_mark(xa, next, XA_MARK_0));
 245		XA_BUG_ON(xa, xa_get_mark(xa, next, XA_MARK_1));
 246		XA_BUG_ON(xa, xa_get_mark(xa, next, XA_MARK_2));
 247		xa_erase_index(xa, index);
 248		xa_erase_index(xa, next);
 249		XA_BUG_ON(xa, !xa_empty(xa));
 250	}
 251	XA_BUG_ON(xa, !xa_empty(xa));
 252}
 253
 254static noinline void check_xa_mark_2(struct xarray *xa)
 255{
 256	XA_STATE(xas, xa, 0);
 257	unsigned long index;
 258	unsigned int count = 0;
 259	void *entry;
 260
 261	xa_store_index(xa, 0, GFP_KERNEL);
 262	xa_set_mark(xa, 0, XA_MARK_0);
 263	xas_lock(&xas);
 264	xas_load(&xas);
 265	xas_init_marks(&xas);
 266	xas_unlock(&xas);
 267	XA_BUG_ON(xa, !xa_get_mark(xa, 0, XA_MARK_0) == 0);
 268
 269	for (index = 3500; index < 4500; index++) {
 270		xa_store_index(xa, index, GFP_KERNEL);
 271		xa_set_mark(xa, index, XA_MARK_0);
 272	}
 273
 274	xas_reset(&xas);
 275	rcu_read_lock();
 276	xas_for_each_marked(&xas, entry, ULONG_MAX, XA_MARK_0)
 277		count++;
 278	rcu_read_unlock();
 279	XA_BUG_ON(xa, count != 1000);
 280
 281	xas_lock(&xas);
 282	xas_for_each(&xas, entry, ULONG_MAX) {
 283		xas_init_marks(&xas);
 284		XA_BUG_ON(xa, !xa_get_mark(xa, xas.xa_index, XA_MARK_0));
 285		XA_BUG_ON(xa, !xas_get_mark(&xas, XA_MARK_0));
 286	}
 287	xas_unlock(&xas);
 288
 289	xa_destroy(xa);
 290}
 291
 292static noinline void check_xa_mark_3(struct xarray *xa)
 293{
 294#ifdef CONFIG_XARRAY_MULTI
 295	XA_STATE(xas, xa, 0x41);
 296	void *entry;
 297	int count = 0;
 298
 299	xa_store_order(xa, 0x40, 2, xa_mk_index(0x40), GFP_KERNEL);
 300	xa_set_mark(xa, 0x41, XA_MARK_0);
 301
 302	rcu_read_lock();
 303	xas_for_each_marked(&xas, entry, ULONG_MAX, XA_MARK_0) {
 304		count++;
 305		XA_BUG_ON(xa, entry != xa_mk_index(0x40));
 306	}
 307	XA_BUG_ON(xa, count != 1);
 308	rcu_read_unlock();
 309	xa_destroy(xa);
 310#endif
 311}
 312
 313static noinline void check_xa_mark(struct xarray *xa)
 314{
 315	unsigned long index;
 316
 317	for (index = 0; index < 16384; index += 4)
 318		check_xa_mark_1(xa, index);
 319
 320	check_xa_mark_2(xa);
 321	check_xa_mark_3(xa);
 322}
 323
 324static noinline void check_xa_shrink(struct xarray *xa)
 325{
 326	XA_STATE(xas, xa, 1);
 327	struct xa_node *node;
 328	unsigned int order;
 329	unsigned int max_order = IS_ENABLED(CONFIG_XARRAY_MULTI) ? 15 : 1;
 330
 331	XA_BUG_ON(xa, !xa_empty(xa));
 332	XA_BUG_ON(xa, xa_store_index(xa, 0, GFP_KERNEL) != NULL);
 333	XA_BUG_ON(xa, xa_store_index(xa, 1, GFP_KERNEL) != NULL);
 334
 335	/*
 336	 * Check that erasing the entry at 1 shrinks the tree and properly
 337	 * marks the node as being deleted.
 338	 */
 339	xas_lock(&xas);
 340	XA_BUG_ON(xa, xas_load(&xas) != xa_mk_value(1));
 341	node = xas.xa_node;
 342	XA_BUG_ON(xa, xa_entry_locked(xa, node, 0) != xa_mk_value(0));
 343	XA_BUG_ON(xa, xas_store(&xas, NULL) != xa_mk_value(1));
 344	XA_BUG_ON(xa, xa_load(xa, 1) != NULL);
 345	XA_BUG_ON(xa, xas.xa_node != XAS_BOUNDS);
 346	XA_BUG_ON(xa, xa_entry_locked(xa, node, 0) != XA_RETRY_ENTRY);
 347	XA_BUG_ON(xa, xas_load(&xas) != NULL);
 348	xas_unlock(&xas);
 349	XA_BUG_ON(xa, xa_load(xa, 0) != xa_mk_value(0));
 350	xa_erase_index(xa, 0);
 351	XA_BUG_ON(xa, !xa_empty(xa));
 352
 353	for (order = 0; order < max_order; order++) {
 354		unsigned long max = (1UL << order) - 1;
 355		xa_store_order(xa, 0, order, xa_mk_value(0), GFP_KERNEL);
 356		XA_BUG_ON(xa, xa_load(xa, max) != xa_mk_value(0));
 357		XA_BUG_ON(xa, xa_load(xa, max + 1) != NULL);
 358		rcu_read_lock();
 359		node = xa_head(xa);
 360		rcu_read_unlock();
 361		XA_BUG_ON(xa, xa_store_index(xa, ULONG_MAX, GFP_KERNEL) !=
 362				NULL);
 363		rcu_read_lock();
 364		XA_BUG_ON(xa, xa_head(xa) == node);
 365		rcu_read_unlock();
 366		XA_BUG_ON(xa, xa_load(xa, max + 1) != NULL);
 367		xa_erase_index(xa, ULONG_MAX);
 368		XA_BUG_ON(xa, xa->xa_head != node);
 369		xa_erase_index(xa, 0);
 370	}
 371}
 372
 373static noinline void check_insert(struct xarray *xa)
 374{
 375	unsigned long i;
 376
 377	for (i = 0; i < 1024; i++) {
 378		xa_insert_index(xa, i);
 379		XA_BUG_ON(xa, xa_load(xa, i - 1) != NULL);
 380		XA_BUG_ON(xa, xa_load(xa, i + 1) != NULL);
 381		xa_erase_index(xa, i);
 382	}
 383
 384	for (i = 10; i < BITS_PER_LONG; i++) {
 385		xa_insert_index(xa, 1UL << i);
 386		XA_BUG_ON(xa, xa_load(xa, (1UL << i) - 1) != NULL);
 387		XA_BUG_ON(xa, xa_load(xa, (1UL << i) + 1) != NULL);
 388		xa_erase_index(xa, 1UL << i);
 389
 390		xa_insert_index(xa, (1UL << i) - 1);
 391		XA_BUG_ON(xa, xa_load(xa, (1UL << i) - 2) != NULL);
 392		XA_BUG_ON(xa, xa_load(xa, 1UL << i) != NULL);
 393		xa_erase_index(xa, (1UL << i) - 1);
 394	}
 395
 396	xa_insert_index(xa, ~0UL);
 397	XA_BUG_ON(xa, xa_load(xa, 0UL) != NULL);
 398	XA_BUG_ON(xa, xa_load(xa, ~1UL) != NULL);
 399	xa_erase_index(xa, ~0UL);
 400
 401	XA_BUG_ON(xa, !xa_empty(xa));
 402}
 403
 404static noinline void check_cmpxchg(struct xarray *xa)
 405{
 406	void *FIVE = xa_mk_value(5);
 407	void *SIX = xa_mk_value(6);
 408	void *LOTS = xa_mk_value(12345678);
 409
 410	XA_BUG_ON(xa, !xa_empty(xa));
 411	XA_BUG_ON(xa, xa_store_index(xa, 12345678, GFP_KERNEL) != NULL);
 412	XA_BUG_ON(xa, xa_insert(xa, 12345678, xa, GFP_KERNEL) != -EBUSY);
 413	XA_BUG_ON(xa, xa_cmpxchg(xa, 12345678, SIX, FIVE, GFP_KERNEL) != LOTS);
 414	XA_BUG_ON(xa, xa_cmpxchg(xa, 12345678, LOTS, FIVE, GFP_KERNEL) != LOTS);
 415	XA_BUG_ON(xa, xa_cmpxchg(xa, 12345678, FIVE, LOTS, GFP_KERNEL) != FIVE);
 416	XA_BUG_ON(xa, xa_cmpxchg(xa, 5, FIVE, NULL, GFP_KERNEL) != NULL);
 417	XA_BUG_ON(xa, xa_cmpxchg(xa, 5, NULL, FIVE, GFP_KERNEL) != NULL);
 418	XA_BUG_ON(xa, xa_insert(xa, 5, FIVE, GFP_KERNEL) != -EBUSY);
 419	XA_BUG_ON(xa, xa_cmpxchg(xa, 5, FIVE, NULL, GFP_KERNEL) != FIVE);
 420	XA_BUG_ON(xa, xa_insert(xa, 5, FIVE, GFP_KERNEL) == -EBUSY);
 421	xa_erase_index(xa, 12345678);
 422	xa_erase_index(xa, 5);
 423	XA_BUG_ON(xa, !xa_empty(xa));
 424}
 425
 426static noinline void check_reserve(struct xarray *xa)
 427{
 428	void *entry;
 429	unsigned long index;
 430	int count;
 431
 432	/* An array with a reserved entry is not empty */
 433	XA_BUG_ON(xa, !xa_empty(xa));
 434	XA_BUG_ON(xa, xa_reserve(xa, 12345678, GFP_KERNEL) != 0);
 435	XA_BUG_ON(xa, xa_empty(xa));
 436	XA_BUG_ON(xa, xa_load(xa, 12345678));
 437	xa_release(xa, 12345678);
 438	XA_BUG_ON(xa, !xa_empty(xa));
 439
 440	/* Releasing a used entry does nothing */
 441	XA_BUG_ON(xa, xa_reserve(xa, 12345678, GFP_KERNEL) != 0);
 442	XA_BUG_ON(xa, xa_store_index(xa, 12345678, GFP_NOWAIT) != NULL);
 443	xa_release(xa, 12345678);
 444	xa_erase_index(xa, 12345678);
 445	XA_BUG_ON(xa, !xa_empty(xa));
 446
 447	/* cmpxchg sees a reserved entry as ZERO */
 448	XA_BUG_ON(xa, xa_reserve(xa, 12345678, GFP_KERNEL) != 0);
 449	XA_BUG_ON(xa, xa_cmpxchg(xa, 12345678, XA_ZERO_ENTRY,
 450				xa_mk_value(12345678), GFP_NOWAIT) != NULL);
 451	xa_release(xa, 12345678);
 452	xa_erase_index(xa, 12345678);
 453	XA_BUG_ON(xa, !xa_empty(xa));
 454
 455	/* xa_insert treats it as busy */
 456	XA_BUG_ON(xa, xa_reserve(xa, 12345678, GFP_KERNEL) != 0);
 457	XA_BUG_ON(xa, xa_insert(xa, 12345678, xa_mk_value(12345678), 0) !=
 458			-EBUSY);
 459	XA_BUG_ON(xa, xa_empty(xa));
 460	XA_BUG_ON(xa, xa_erase(xa, 12345678) != NULL);
 461	XA_BUG_ON(xa, !xa_empty(xa));
 462
 463	/* Can iterate through a reserved entry */
 464	xa_store_index(xa, 5, GFP_KERNEL);
 465	XA_BUG_ON(xa, xa_reserve(xa, 6, GFP_KERNEL) != 0);
 466	xa_store_index(xa, 7, GFP_KERNEL);
 467
 468	count = 0;
 469	xa_for_each(xa, index, entry) {
 470		XA_BUG_ON(xa, index != 5 && index != 7);
 471		count++;
 472	}
 473	XA_BUG_ON(xa, count != 2);
 474
 475	/* If we free a reserved entry, we should be able to allocate it */
 476	if (xa->xa_flags & XA_FLAGS_ALLOC) {
 477		u32 id;
 478
 479		XA_BUG_ON(xa, xa_alloc(xa, &id, xa_mk_value(8),
 480					XA_LIMIT(5, 10), GFP_KERNEL) != 0);
 481		XA_BUG_ON(xa, id != 8);
 482
 483		xa_release(xa, 6);
 484		XA_BUG_ON(xa, xa_alloc(xa, &id, xa_mk_value(6),
 485					XA_LIMIT(5, 10), GFP_KERNEL) != 0);
 486		XA_BUG_ON(xa, id != 6);
 487	}
 488
 489	xa_destroy(xa);
 490}
 491
 492static noinline void check_xas_erase(struct xarray *xa)
 493{
 494	XA_STATE(xas, xa, 0);
 495	void *entry;
 496	unsigned long i, j;
 497
 498	for (i = 0; i < 200; i++) {
 499		for (j = i; j < 2 * i + 17; j++) {
 500			xas_set(&xas, j);
 501			do {
 502				xas_lock(&xas);
 503				xas_store(&xas, xa_mk_index(j));
 504				xas_unlock(&xas);
 505			} while (xas_nomem(&xas, GFP_KERNEL));
 506		}
 507
 508		xas_set(&xas, ULONG_MAX);
 509		do {
 510			xas_lock(&xas);
 511			xas_store(&xas, xa_mk_value(0));
 512			xas_unlock(&xas);
 513		} while (xas_nomem(&xas, GFP_KERNEL));
 514
 515		xas_lock(&xas);
 516		xas_store(&xas, NULL);
 517
 518		xas_set(&xas, 0);
 519		j = i;
 520		xas_for_each(&xas, entry, ULONG_MAX) {
 521			XA_BUG_ON(xa, entry != xa_mk_index(j));
 522			xas_store(&xas, NULL);
 523			j++;
 524		}
 525		xas_unlock(&xas);
 526		XA_BUG_ON(xa, !xa_empty(xa));
 527	}
 528}
 529
 530#ifdef CONFIG_XARRAY_MULTI
 531static noinline void check_multi_store_1(struct xarray *xa, unsigned long index,
 532		unsigned int order)
 533{
 534	XA_STATE(xas, xa, index);
 535	unsigned long min = index & ~((1UL << order) - 1);
 536	unsigned long max = min + (1UL << order);
 537
 538	xa_store_order(xa, index, order, xa_mk_index(index), GFP_KERNEL);
 539	XA_BUG_ON(xa, xa_load(xa, min) != xa_mk_index(index));
 540	XA_BUG_ON(xa, xa_load(xa, max - 1) != xa_mk_index(index));
 541	XA_BUG_ON(xa, xa_load(xa, max) != NULL);
 542	XA_BUG_ON(xa, xa_load(xa, min - 1) != NULL);
 543
 544	xas_lock(&xas);
 545	XA_BUG_ON(xa, xas_store(&xas, xa_mk_index(min)) != xa_mk_index(index));
 546	xas_unlock(&xas);
 547	XA_BUG_ON(xa, xa_load(xa, min) != xa_mk_index(min));
 548	XA_BUG_ON(xa, xa_load(xa, max - 1) != xa_mk_index(min));
 549	XA_BUG_ON(xa, xa_load(xa, max) != NULL);
 550	XA_BUG_ON(xa, xa_load(xa, min - 1) != NULL);
 551
 552	xa_erase_index(xa, min);
 553	XA_BUG_ON(xa, !xa_empty(xa));
 554}
 555
 556static noinline void check_multi_store_2(struct xarray *xa, unsigned long index,
 557		unsigned int order)
 558{
 559	XA_STATE(xas, xa, index);
 560	xa_store_order(xa, index, order, xa_mk_value(0), GFP_KERNEL);
 561
 562	xas_lock(&xas);
 563	XA_BUG_ON(xa, xas_store(&xas, xa_mk_value(1)) != xa_mk_value(0));
 564	XA_BUG_ON(xa, xas.xa_index != index);
 565	XA_BUG_ON(xa, xas_store(&xas, NULL) != xa_mk_value(1));
 566	xas_unlock(&xas);
 567	XA_BUG_ON(xa, !xa_empty(xa));
 568}
 569
 570static noinline void check_multi_store_3(struct xarray *xa, unsigned long index,
 571		unsigned int order)
 572{
 573	XA_STATE(xas, xa, 0);
 574	void *entry;
 575	int n = 0;
 576
 577	xa_store_order(xa, index, order, xa_mk_index(index), GFP_KERNEL);
 578
 579	xas_lock(&xas);
 580	xas_for_each(&xas, entry, ULONG_MAX) {
 581		XA_BUG_ON(xa, entry != xa_mk_index(index));
 582		n++;
 583	}
 584	XA_BUG_ON(xa, n != 1);
 585	xas_set(&xas, index + 1);
 586	xas_for_each(&xas, entry, ULONG_MAX) {
 587		XA_BUG_ON(xa, entry != xa_mk_index(index));
 588		n++;
 589	}
 590	XA_BUG_ON(xa, n != 2);
 591	xas_unlock(&xas);
 592
 593	xa_destroy(xa);
 594}
 595#endif
 596
 597static noinline void check_multi_store(struct xarray *xa)
 598{
 599#ifdef CONFIG_XARRAY_MULTI
 600	unsigned long i, j, k;
 601	unsigned int max_order = (sizeof(long) == 4) ? 30 : 60;
 602
 603	/* Loading from any position returns the same value */
 604	xa_store_order(xa, 0, 1, xa_mk_value(0), GFP_KERNEL);
 605	XA_BUG_ON(xa, xa_load(xa, 0) != xa_mk_value(0));
 606	XA_BUG_ON(xa, xa_load(xa, 1) != xa_mk_value(0));
 607	XA_BUG_ON(xa, xa_load(xa, 2) != NULL);
 608	rcu_read_lock();
 609	XA_BUG_ON(xa, xa_to_node(xa_head(xa))->count != 2);
 610	XA_BUG_ON(xa, xa_to_node(xa_head(xa))->nr_values != 2);
 611	rcu_read_unlock();
 612
 613	/* Storing adjacent to the value does not alter the value */
 614	xa_store(xa, 3, xa, GFP_KERNEL);
 615	XA_BUG_ON(xa, xa_load(xa, 0) != xa_mk_value(0));
 616	XA_BUG_ON(xa, xa_load(xa, 1) != xa_mk_value(0));
 617	XA_BUG_ON(xa, xa_load(xa, 2) != NULL);
 618	rcu_read_lock();
 619	XA_BUG_ON(xa, xa_to_node(xa_head(xa))->count != 3);
 620	XA_BUG_ON(xa, xa_to_node(xa_head(xa))->nr_values != 2);
 621	rcu_read_unlock();
 622
 623	/* Overwriting multiple indexes works */
 624	xa_store_order(xa, 0, 2, xa_mk_value(1), GFP_KERNEL);
 625	XA_BUG_ON(xa, xa_load(xa, 0) != xa_mk_value(1));
 626	XA_BUG_ON(xa, xa_load(xa, 1) != xa_mk_value(1));
 627	XA_BUG_ON(xa, xa_load(xa, 2) != xa_mk_value(1));
 628	XA_BUG_ON(xa, xa_load(xa, 3) != xa_mk_value(1));
 629	XA_BUG_ON(xa, xa_load(xa, 4) != NULL);
 630	rcu_read_lock();
 631	XA_BUG_ON(xa, xa_to_node(xa_head(xa))->count != 4);
 632	XA_BUG_ON(xa, xa_to_node(xa_head(xa))->nr_values != 4);
 633	rcu_read_unlock();
 634
 635	/* We can erase multiple values with a single store */
 636	xa_store_order(xa, 0, BITS_PER_LONG - 1, NULL, GFP_KERNEL);
 637	XA_BUG_ON(xa, !xa_empty(xa));
 638
 639	/* Even when the first slot is empty but the others aren't */
 640	xa_store_index(xa, 1, GFP_KERNEL);
 641	xa_store_index(xa, 2, GFP_KERNEL);
 642	xa_store_order(xa, 0, 2, NULL, GFP_KERNEL);
 643	XA_BUG_ON(xa, !xa_empty(xa));
 644
 645	for (i = 0; i < max_order; i++) {
 646		for (j = 0; j < max_order; j++) {
 647			xa_store_order(xa, 0, i, xa_mk_index(i), GFP_KERNEL);
 648			xa_store_order(xa, 0, j, xa_mk_index(j), GFP_KERNEL);
 649
 650			for (k = 0; k < max_order; k++) {
 651				void *entry = xa_load(xa, (1UL << k) - 1);
 652				if ((i < k) && (j < k))
 653					XA_BUG_ON(xa, entry != NULL);
 654				else
 655					XA_BUG_ON(xa, entry != xa_mk_index(j));
 656			}
 657
 658			xa_erase(xa, 0);
 659			XA_BUG_ON(xa, !xa_empty(xa));
 660		}
 661	}
 662
 663	for (i = 0; i < 20; i++) {
 664		check_multi_store_1(xa, 200, i);
 665		check_multi_store_1(xa, 0, i);
 666		check_multi_store_1(xa, (1UL << i) + 1, i);
 667	}
 668	check_multi_store_2(xa, 4095, 9);
 669
 670	for (i = 1; i < 20; i++) {
 671		check_multi_store_3(xa, 0, i);
 672		check_multi_store_3(xa, 1UL << i, i);
 673	}
 674#endif
 675}
 676
 677static noinline void check_xa_alloc_1(struct xarray *xa, unsigned int base)
 678{
 679	int i;
 680	u32 id;
 681
 682	XA_BUG_ON(xa, !xa_empty(xa));
 683	/* An empty array should assign %base to the first alloc */
 684	xa_alloc_index(xa, base, GFP_KERNEL);
 685
 686	/* Erasing it should make the array empty again */
 687	xa_erase_index(xa, base);
 688	XA_BUG_ON(xa, !xa_empty(xa));
 689
 690	/* And it should assign %base again */
 691	xa_alloc_index(xa, base, GFP_KERNEL);
 692
 693	/* Allocating and then erasing a lot should not lose base */
 694	for (i = base + 1; i < 2 * XA_CHUNK_SIZE; i++)
 695		xa_alloc_index(xa, i, GFP_KERNEL);
 696	for (i = base; i < 2 * XA_CHUNK_SIZE; i++)
 697		xa_erase_index(xa, i);
 698	xa_alloc_index(xa, base, GFP_KERNEL);
 699
 700	/* Destroying the array should do the same as erasing */
 701	xa_destroy(xa);
 702
 703	/* And it should assign %base again */
 704	xa_alloc_index(xa, base, GFP_KERNEL);
 705
 706	/* The next assigned ID should be base+1 */
 707	xa_alloc_index(xa, base + 1, GFP_KERNEL);
 708	xa_erase_index(xa, base + 1);
 709
 710	/* Storing a value should mark it used */
 711	xa_store_index(xa, base + 1, GFP_KERNEL);
 712	xa_alloc_index(xa, base + 2, GFP_KERNEL);
 713
 714	/* If we then erase base, it should be free */
 715	xa_erase_index(xa, base);
 716	xa_alloc_index(xa, base, GFP_KERNEL);
 717
 718	xa_erase_index(xa, base + 1);
 719	xa_erase_index(xa, base + 2);
 720
 721	for (i = 1; i < 5000; i++) {
 722		xa_alloc_index(xa, base + i, GFP_KERNEL);
 723	}
 724
 725	xa_destroy(xa);
 726
 727	/* Check that we fail properly at the limit of allocation */
 728	XA_BUG_ON(xa, xa_alloc(xa, &id, xa_mk_index(UINT_MAX - 1),
 729				XA_LIMIT(UINT_MAX - 1, UINT_MAX),
 730				GFP_KERNEL) != 0);
 731	XA_BUG_ON(xa, id != 0xfffffffeU);
 732	XA_BUG_ON(xa, xa_alloc(xa, &id, xa_mk_index(UINT_MAX),
 733				XA_LIMIT(UINT_MAX - 1, UINT_MAX),
 734				GFP_KERNEL) != 0);
 735	XA_BUG_ON(xa, id != 0xffffffffU);
 736	id = 3;
 737	XA_BUG_ON(xa, xa_alloc(xa, &id, xa_mk_index(0),
 738				XA_LIMIT(UINT_MAX - 1, UINT_MAX),
 739				GFP_KERNEL) != -EBUSY);
 740	XA_BUG_ON(xa, id != 3);
 741	xa_destroy(xa);
 742
 743	XA_BUG_ON(xa, xa_alloc(xa, &id, xa_mk_index(10), XA_LIMIT(10, 5),
 744				GFP_KERNEL) != -EBUSY);
 745	XA_BUG_ON(xa, xa_store_index(xa, 3, GFP_KERNEL) != 0);
 746	XA_BUG_ON(xa, xa_alloc(xa, &id, xa_mk_index(10), XA_LIMIT(10, 5),
 747				GFP_KERNEL) != -EBUSY);
 748	xa_erase_index(xa, 3);
 749	XA_BUG_ON(xa, !xa_empty(xa));
 750}
 751
 752static noinline void check_xa_alloc_2(struct xarray *xa, unsigned int base)
 753{
 754	unsigned int i, id;
 755	unsigned long index;
 756	void *entry;
 757
 758	/* Allocate and free a NULL and check xa_empty() behaves */
 759	XA_BUG_ON(xa, !xa_empty(xa));
 760	XA_BUG_ON(xa, xa_alloc(xa, &id, NULL, xa_limit_32b, GFP_KERNEL) != 0);
 761	XA_BUG_ON(xa, id != base);
 762	XA_BUG_ON(xa, xa_empty(xa));
 763	XA_BUG_ON(xa, xa_erase(xa, id) != NULL);
 764	XA_BUG_ON(xa, !xa_empty(xa));
 765
 766	/* Ditto, but check destroy instead of erase */
 767	XA_BUG_ON(xa, !xa_empty(xa));
 768	XA_BUG_ON(xa, xa_alloc(xa, &id, NULL, xa_limit_32b, GFP_KERNEL) != 0);
 769	XA_BUG_ON(xa, id != base);
 770	XA_BUG_ON(xa, xa_empty(xa));
 771	xa_destroy(xa);
 772	XA_BUG_ON(xa, !xa_empty(xa));
 773
 774	for (i = base; i < base + 10; i++) {
 775		XA_BUG_ON(xa, xa_alloc(xa, &id, NULL, xa_limit_32b,
 776					GFP_KERNEL) != 0);
 777		XA_BUG_ON(xa, id != i);
 778	}
 779
 780	XA_BUG_ON(xa, xa_store(xa, 3, xa_mk_index(3), GFP_KERNEL) != NULL);
 781	XA_BUG_ON(xa, xa_store(xa, 4, xa_mk_index(4), GFP_KERNEL) != NULL);
 782	XA_BUG_ON(xa, xa_store(xa, 4, NULL, GFP_KERNEL) != xa_mk_index(4));
 783	XA_BUG_ON(xa, xa_erase(xa, 5) != NULL);
 784	XA_BUG_ON(xa, xa_alloc(xa, &id, NULL, xa_limit_32b, GFP_KERNEL) != 0);
 785	XA_BUG_ON(xa, id != 5);
 786
 787	xa_for_each(xa, index, entry) {
 788		xa_erase_index(xa, index);
 789	}
 790
 791	for (i = base; i < base + 9; i++) {
 792		XA_BUG_ON(xa, xa_erase(xa, i) != NULL);
 793		XA_BUG_ON(xa, xa_empty(xa));
 794	}
 795	XA_BUG_ON(xa, xa_erase(xa, 8) != NULL);
 796	XA_BUG_ON(xa, xa_empty(xa));
 797	XA_BUG_ON(xa, xa_erase(xa, base + 9) != NULL);
 798	XA_BUG_ON(xa, !xa_empty(xa));
 799
 800	xa_destroy(xa);
 801}
 802
 803static noinline void check_xa_alloc_3(struct xarray *xa, unsigned int base)
 804{
 805	struct xa_limit limit = XA_LIMIT(1, 0x3fff);
 806	u32 next = 0;
 807	unsigned int i, id;
 808	unsigned long index;
 809	void *entry;
 810
 811	XA_BUG_ON(xa, xa_alloc_cyclic(xa, &id, xa_mk_index(1), limit,
 812				&next, GFP_KERNEL) != 0);
 813	XA_BUG_ON(xa, id != 1);
 814
 815	next = 0x3ffd;
 816	XA_BUG_ON(xa, xa_alloc_cyclic(xa, &id, xa_mk_index(0x3ffd), limit,
 817				&next, GFP_KERNEL) != 0);
 818	XA_BUG_ON(xa, id != 0x3ffd);
 819	xa_erase_index(xa, 0x3ffd);
 820	xa_erase_index(xa, 1);
 821	XA_BUG_ON(xa, !xa_empty(xa));
 822
 823	for (i = 0x3ffe; i < 0x4003; i++) {
 824		if (i < 0x4000)
 825			entry = xa_mk_index(i);
 826		else
 827			entry = xa_mk_index(i - 0x3fff);
 828		XA_BUG_ON(xa, xa_alloc_cyclic(xa, &id, entry, limit,
 829					&next, GFP_KERNEL) != (id == 1));
 830		XA_BUG_ON(xa, xa_mk_index(id) != entry);
 831	}
 832
 833	/* Check wrap-around is handled correctly */
 834	if (base != 0)
 835		xa_erase_index(xa, base);
 836	xa_erase_index(xa, base + 1);
 837	next = UINT_MAX;
 838	XA_BUG_ON(xa, xa_alloc_cyclic(xa, &id, xa_mk_index(UINT_MAX),
 839				xa_limit_32b, &next, GFP_KERNEL) != 0);
 840	XA_BUG_ON(xa, id != UINT_MAX);
 841	XA_BUG_ON(xa, xa_alloc_cyclic(xa, &id, xa_mk_index(base),
 842				xa_limit_32b, &next, GFP_KERNEL) != 1);
 843	XA_BUG_ON(xa, id != base);
 844	XA_BUG_ON(xa, xa_alloc_cyclic(xa, &id, xa_mk_index(base + 1),
 845				xa_limit_32b, &next, GFP_KERNEL) != 0);
 846	XA_BUG_ON(xa, id != base + 1);
 847
 848	xa_for_each(xa, index, entry)
 849		xa_erase_index(xa, index);
 850
 851	XA_BUG_ON(xa, !xa_empty(xa));
 852}
 853
 854static DEFINE_XARRAY_ALLOC(xa0);
 855static DEFINE_XARRAY_ALLOC1(xa1);
 856
 857static noinline void check_xa_alloc(void)
 858{
 859	check_xa_alloc_1(&xa0, 0);
 860	check_xa_alloc_1(&xa1, 1);
 861	check_xa_alloc_2(&xa0, 0);
 862	check_xa_alloc_2(&xa1, 1);
 863	check_xa_alloc_3(&xa0, 0);
 864	check_xa_alloc_3(&xa1, 1);
 865}
 866
 867static noinline void __check_store_iter(struct xarray *xa, unsigned long start,
 868			unsigned int order, unsigned int present)
 869{
 870	XA_STATE_ORDER(xas, xa, start, order);
 871	void *entry;
 872	unsigned int count = 0;
 873
 874retry:
 875	xas_lock(&xas);
 876	xas_for_each_conflict(&xas, entry) {
 877		XA_BUG_ON(xa, !xa_is_value(entry));
 878		XA_BUG_ON(xa, entry < xa_mk_index(start));
 879		XA_BUG_ON(xa, entry > xa_mk_index(start + (1UL << order) - 1));
 880		count++;
 881	}
 882	xas_store(&xas, xa_mk_index(start));
 883	xas_unlock(&xas);
 884	if (xas_nomem(&xas, GFP_KERNEL)) {
 885		count = 0;
 886		goto retry;
 887	}
 888	XA_BUG_ON(xa, xas_error(&xas));
 889	XA_BUG_ON(xa, count != present);
 890	XA_BUG_ON(xa, xa_load(xa, start) != xa_mk_index(start));
 891	XA_BUG_ON(xa, xa_load(xa, start + (1UL << order) - 1) !=
 892			xa_mk_index(start));
 893	xa_erase_index(xa, start);
 894}
 895
 896static noinline void check_store_iter(struct xarray *xa)
 897{
 898	unsigned int i, j;
 899	unsigned int max_order = IS_ENABLED(CONFIG_XARRAY_MULTI) ? 20 : 1;
 900
 901	for (i = 0; i < max_order; i++) {
 902		unsigned int min = 1 << i;
 903		unsigned int max = (2 << i) - 1;
 904		__check_store_iter(xa, 0, i, 0);
 905		XA_BUG_ON(xa, !xa_empty(xa));
 906		__check_store_iter(xa, min, i, 0);
 907		XA_BUG_ON(xa, !xa_empty(xa));
 908
 909		xa_store_index(xa, min, GFP_KERNEL);
 910		__check_store_iter(xa, min, i, 1);
 911		XA_BUG_ON(xa, !xa_empty(xa));
 912		xa_store_index(xa, max, GFP_KERNEL);
 913		__check_store_iter(xa, min, i, 1);
 914		XA_BUG_ON(xa, !xa_empty(xa));
 915
 916		for (j = 0; j < min; j++)
 917			xa_store_index(xa, j, GFP_KERNEL);
 918		__check_store_iter(xa, 0, i, min);
 919		XA_BUG_ON(xa, !xa_empty(xa));
 920		for (j = 0; j < min; j++)
 921			xa_store_index(xa, min + j, GFP_KERNEL);
 922		__check_store_iter(xa, min, i, min);
 923		XA_BUG_ON(xa, !xa_empty(xa));
 924	}
 925#ifdef CONFIG_XARRAY_MULTI
 926	xa_store_index(xa, 63, GFP_KERNEL);
 927	xa_store_index(xa, 65, GFP_KERNEL);
 928	__check_store_iter(xa, 64, 2, 1);
 929	xa_erase_index(xa, 63);
 930#endif
 931	XA_BUG_ON(xa, !xa_empty(xa));
 932}
 933
 934static noinline void check_multi_find_1(struct xarray *xa, unsigned order)
 935{
 936#ifdef CONFIG_XARRAY_MULTI
 937	unsigned long multi = 3 << order;
 938	unsigned long next = 4 << order;
 939	unsigned long index;
 940
 941	xa_store_order(xa, multi, order, xa_mk_value(multi), GFP_KERNEL);
 942	XA_BUG_ON(xa, xa_store_index(xa, next, GFP_KERNEL) != NULL);
 943	XA_BUG_ON(xa, xa_store_index(xa, next + 1, GFP_KERNEL) != NULL);
 944
 945	index = 0;
 946	XA_BUG_ON(xa, xa_find(xa, &index, ULONG_MAX, XA_PRESENT) !=
 947			xa_mk_value(multi));
 948	XA_BUG_ON(xa, index != multi);
 949	index = multi + 1;
 950	XA_BUG_ON(xa, xa_find(xa, &index, ULONG_MAX, XA_PRESENT) !=
 951			xa_mk_value(multi));
 952	XA_BUG_ON(xa, (index < multi) || (index >= next));
 953	XA_BUG_ON(xa, xa_find_after(xa, &index, ULONG_MAX, XA_PRESENT) !=
 954			xa_mk_value(next));
 955	XA_BUG_ON(xa, index != next);
 956	XA_BUG_ON(xa, xa_find_after(xa, &index, next, XA_PRESENT) != NULL);
 957	XA_BUG_ON(xa, index != next);
 958
 959	xa_erase_index(xa, multi);
 960	xa_erase_index(xa, next);
 961	xa_erase_index(xa, next + 1);
 962	XA_BUG_ON(xa, !xa_empty(xa));
 963#endif
 964}
 965
 966static noinline void check_multi_find_2(struct xarray *xa)
 967{
 968	unsigned int max_order = IS_ENABLED(CONFIG_XARRAY_MULTI) ? 10 : 1;
 969	unsigned int i, j;
 970	void *entry;
 971
 972	for (i = 0; i < max_order; i++) {
 973		unsigned long index = 1UL << i;
 974		for (j = 0; j < index; j++) {
 975			XA_STATE(xas, xa, j + index);
 976			xa_store_index(xa, index - 1, GFP_KERNEL);
 977			xa_store_order(xa, index, i, xa_mk_index(index),
 978					GFP_KERNEL);
 979			rcu_read_lock();
 980			xas_for_each(&xas, entry, ULONG_MAX) {
 981				xa_erase_index(xa, index);
 982			}
 983			rcu_read_unlock();
 984			xa_erase_index(xa, index - 1);
 985			XA_BUG_ON(xa, !xa_empty(xa));
 986		}
 987	}
 988}
 989
 990static noinline void check_multi_find_3(struct xarray *xa)
 991{
 992	unsigned int order;
 993
 994	for (order = 5; order < order_limit; order++) {
 995		unsigned long index = 1UL << (order - 5);
 996
 997		XA_BUG_ON(xa, !xa_empty(xa));
 998		xa_store_order(xa, 0, order - 4, xa_mk_index(0), GFP_KERNEL);
 999		XA_BUG_ON(xa, xa_find_after(xa, &index, ULONG_MAX, XA_PRESENT));
1000		xa_erase_index(xa, 0);
1001	}
1002}
1003
1004static noinline void check_find_1(struct xarray *xa)
1005{
1006	unsigned long i, j, k;
1007
1008	XA_BUG_ON(xa, !xa_empty(xa));
1009
1010	/*
1011	 * Check xa_find with all pairs between 0 and 99 inclusive,
1012	 * starting at every index between 0 and 99
1013	 */
1014	for (i = 0; i < 100; i++) {
1015		XA_BUG_ON(xa, xa_store_index(xa, i, GFP_KERNEL) != NULL);
1016		xa_set_mark(xa, i, XA_MARK_0);
1017		for (j = 0; j < i; j++) {
1018			XA_BUG_ON(xa, xa_store_index(xa, j, GFP_KERNEL) !=
1019					NULL);
1020			xa_set_mark(xa, j, XA_MARK_0);
1021			for (k = 0; k < 100; k++) {
1022				unsigned long index = k;
1023				void *entry = xa_find(xa, &index, ULONG_MAX,
1024								XA_PRESENT);
1025				if (k <= j)
1026					XA_BUG_ON(xa, index != j);
1027				else if (k <= i)
1028					XA_BUG_ON(xa, index != i);
1029				else
1030					XA_BUG_ON(xa, entry != NULL);
1031
1032				index = k;
1033				entry = xa_find(xa, &index, ULONG_MAX,
1034								XA_MARK_0);
1035				if (k <= j)
1036					XA_BUG_ON(xa, index != j);
1037				else if (k <= i)
1038					XA_BUG_ON(xa, index != i);
1039				else
1040					XA_BUG_ON(xa, entry != NULL);
1041			}
1042			xa_erase_index(xa, j);
1043			XA_BUG_ON(xa, xa_get_mark(xa, j, XA_MARK_0));
1044			XA_BUG_ON(xa, !xa_get_mark(xa, i, XA_MARK_0));
1045		}
1046		xa_erase_index(xa, i);
1047		XA_BUG_ON(xa, xa_get_mark(xa, i, XA_MARK_0));
1048	}
1049	XA_BUG_ON(xa, !xa_empty(xa));
1050}
1051
1052static noinline void check_find_2(struct xarray *xa)
1053{
1054	void *entry;
1055	unsigned long i, j, index;
1056
1057	xa_for_each(xa, index, entry) {
1058		XA_BUG_ON(xa, true);
1059	}
1060
1061	for (i = 0; i < 1024; i++) {
1062		xa_store_index(xa, index, GFP_KERNEL);
1063		j = 0;
1064		xa_for_each(xa, index, entry) {
1065			XA_BUG_ON(xa, xa_mk_index(index) != entry);
1066			XA_BUG_ON(xa, index != j++);
1067		}
1068	}
1069
1070	xa_destroy(xa);
1071}
1072
1073static noinline void check_find_3(struct xarray *xa)
1074{
1075	XA_STATE(xas, xa, 0);
1076	unsigned long i, j, k;
1077	void *entry;
1078
1079	for (i = 0; i < 100; i++) {
1080		for (j = 0; j < 100; j++) {
1081			rcu_read_lock();
1082			for (k = 0; k < 100; k++) {
1083				xas_set(&xas, j);
1084				xas_for_each_marked(&xas, entry, k, XA_MARK_0)
1085					;
1086				if (j > k)
1087					XA_BUG_ON(xa,
1088						xas.xa_node != XAS_RESTART);
1089			}
1090			rcu_read_unlock();
1091		}
1092		xa_store_index(xa, i, GFP_KERNEL);
1093		xa_set_mark(xa, i, XA_MARK_0);
1094	}
1095	xa_destroy(xa);
1096}
1097
1098static noinline void check_find_4(struct xarray *xa)
1099{
1100	unsigned long index = 0;
1101	void *entry;
1102
1103	xa_store_index(xa, ULONG_MAX, GFP_KERNEL);
1104
1105	entry = xa_find_after(xa, &index, ULONG_MAX, XA_PRESENT);
1106	XA_BUG_ON(xa, entry != xa_mk_index(ULONG_MAX));
1107
1108	entry = xa_find_after(xa, &index, ULONG_MAX, XA_PRESENT);
1109	XA_BUG_ON(xa, entry);
1110
1111	xa_erase_index(xa, ULONG_MAX);
1112}
1113
1114static noinline void check_find(struct xarray *xa)
1115{
1116	unsigned i;
1117
1118	check_find_1(xa);
1119	check_find_2(xa);
1120	check_find_3(xa);
1121	check_find_4(xa);
1122
1123	for (i = 2; i < 10; i++)
1124		check_multi_find_1(xa, i);
1125	check_multi_find_2(xa);
1126	check_multi_find_3(xa);
1127}
1128
1129/* See find_swap_entry() in mm/shmem.c */
1130static noinline unsigned long xa_find_entry(struct xarray *xa, void *item)
1131{
1132	XA_STATE(xas, xa, 0);
1133	unsigned int checked = 0;
1134	void *entry;
1135
1136	rcu_read_lock();
1137	xas_for_each(&xas, entry, ULONG_MAX) {
1138		if (xas_retry(&xas, entry))
1139			continue;
1140		if (entry == item)
1141			break;
1142		checked++;
1143		if ((checked % 4) != 0)
1144			continue;
1145		xas_pause(&xas);
1146	}
1147	rcu_read_unlock();
1148
1149	return entry ? xas.xa_index : -1;
1150}
1151
1152static noinline void check_find_entry(struct xarray *xa)
1153{
1154#ifdef CONFIG_XARRAY_MULTI
1155	unsigned int order;
1156	unsigned long offset, index;
1157
1158	for (order = 0; order < 20; order++) {
1159		for (offset = 0; offset < (1UL << (order + 3));
1160		     offset += (1UL << order)) {
1161			for (index = 0; index < (1UL << (order + 5));
1162			     index += (1UL << order)) {
1163				xa_store_order(xa, index, order,
1164						xa_mk_index(index), GFP_KERNEL);
1165				XA_BUG_ON(xa, xa_load(xa, index) !=
1166						xa_mk_index(index));
1167				XA_BUG_ON(xa, xa_find_entry(xa,
1168						xa_mk_index(index)) != index);
1169			}
1170			XA_BUG_ON(xa, xa_find_entry(xa, xa) != -1);
1171			xa_destroy(xa);
1172		}
1173	}
1174#endif
1175
1176	XA_BUG_ON(xa, xa_find_entry(xa, xa) != -1);
1177	xa_store_index(xa, ULONG_MAX, GFP_KERNEL);
1178	XA_BUG_ON(xa, xa_find_entry(xa, xa) != -1);
1179	XA_BUG_ON(xa, xa_find_entry(xa, xa_mk_index(ULONG_MAX)) != -1);
1180	xa_erase_index(xa, ULONG_MAX);
1181	XA_BUG_ON(xa, !xa_empty(xa));
1182}
1183
1184static noinline void check_pause(struct xarray *xa)
1185{
1186	XA_STATE(xas, xa, 0);
1187	void *entry;
1188	unsigned int order;
1189	unsigned long index = 1;
1190	unsigned int count = 0;
1191
1192	for (order = 0; order < order_limit; order++) {
1193		XA_BUG_ON(xa, xa_store_order(xa, index, order,
1194					xa_mk_index(index), GFP_KERNEL));
1195		index += 1UL << order;
1196	}
1197
1198	rcu_read_lock();
1199	xas_for_each(&xas, entry, ULONG_MAX) {
1200		XA_BUG_ON(xa, entry != xa_mk_index(1UL << count));
1201		count++;
1202	}
1203	rcu_read_unlock();
1204	XA_BUG_ON(xa, count != order_limit);
1205
1206	count = 0;
1207	xas_set(&xas, 0);
1208	rcu_read_lock();
1209	xas_for_each(&xas, entry, ULONG_MAX) {
1210		XA_BUG_ON(xa, entry != xa_mk_index(1UL << count));
1211		count++;
1212		xas_pause(&xas);
1213	}
1214	rcu_read_unlock();
1215	XA_BUG_ON(xa, count != order_limit);
1216
1217	xa_destroy(xa);
1218}
1219
1220static noinline void check_move_tiny(struct xarray *xa)
1221{
1222	XA_STATE(xas, xa, 0);
1223
1224	XA_BUG_ON(xa, !xa_empty(xa));
1225	rcu_read_lock();
1226	XA_BUG_ON(xa, xas_next(&xas) != NULL);
1227	XA_BUG_ON(xa, xas_next(&xas) != NULL);
1228	rcu_read_unlock();
1229	xa_store_index(xa, 0, GFP_KERNEL);
1230	rcu_read_lock();
1231	xas_set(&xas, 0);
1232	XA_BUG_ON(xa, xas_next(&xas) != xa_mk_index(0));
1233	XA_BUG_ON(xa, xas_next(&xas) != NULL);
1234	xas_set(&xas, 0);
1235	XA_BUG_ON(xa, xas_prev(&xas) != xa_mk_index(0));
1236	XA_BUG_ON(xa, xas_prev(&xas) != NULL);
1237	rcu_read_unlock();
1238	xa_erase_index(xa, 0);
1239	XA_BUG_ON(xa, !xa_empty(xa));
1240}
1241
1242static noinline void check_move_max(struct xarray *xa)
1243{
1244	XA_STATE(xas, xa, 0);
1245
1246	xa_store_index(xa, ULONG_MAX, GFP_KERNEL);
1247	rcu_read_lock();
1248	XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != xa_mk_index(ULONG_MAX));
1249	XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != NULL);
1250	rcu_read_unlock();
1251
1252	xas_set(&xas, 0);
1253	rcu_read_lock();
1254	XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != xa_mk_index(ULONG_MAX));
1255	xas_pause(&xas);
1256	XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != NULL);
1257	rcu_read_unlock();
1258
1259	xa_erase_index(xa, ULONG_MAX);
1260	XA_BUG_ON(xa, !xa_empty(xa));
1261}
1262
1263static noinline void check_move_small(struct xarray *xa, unsigned long idx)
1264{
1265	XA_STATE(xas, xa, 0);
1266	unsigned long i;
1267
1268	xa_store_index(xa, 0, GFP_KERNEL);
1269	xa_store_index(xa, idx, GFP_KERNEL);
1270
1271	rcu_read_lock();
1272	for (i = 0; i < idx * 4; i++) {
1273		void *entry = xas_next(&xas);
1274		if (i <= idx)
1275			XA_BUG_ON(xa, xas.xa_node == XAS_RESTART);
1276		XA_BUG_ON(xa, xas.xa_index != i);
1277		if (i == 0 || i == idx)
1278			XA_BUG_ON(xa, entry != xa_mk_index(i));
1279		else
1280			XA_BUG_ON(xa, entry != NULL);
1281	}
1282	xas_next(&xas);
1283	XA_BUG_ON(xa, xas.xa_index != i);
1284
1285	do {
1286		void *entry = xas_prev(&xas);
1287		i--;
1288		if (i <= idx)
1289			XA_BUG_ON(xa, xas.xa_node == XAS_RESTART);
1290		XA_BUG_ON(xa, xas.xa_index != i);
1291		if (i == 0 || i == idx)
1292			XA_BUG_ON(xa, entry != xa_mk_index(i));
1293		else
1294			XA_BUG_ON(xa, entry != NULL);
1295	} while (i > 0);
1296
1297	xas_set(&xas, ULONG_MAX);
1298	XA_BUG_ON(xa, xas_next(&xas) != NULL);
1299	XA_BUG_ON(xa, xas.xa_index != ULONG_MAX);
1300	XA_BUG_ON(xa, xas_next(&xas) != xa_mk_value(0));
1301	XA_BUG_ON(xa, xas.xa_index != 0);
1302	XA_BUG_ON(xa, xas_prev(&xas) != NULL);
1303	XA_BUG_ON(xa, xas.xa_index != ULONG_MAX);
1304	rcu_read_unlock();
1305
1306	xa_erase_index(xa, 0);
1307	xa_erase_index(xa, idx);
1308	XA_BUG_ON(xa, !xa_empty(xa));
1309}
1310
1311static noinline void check_move(struct xarray *xa)
1312{
1313	XA_STATE(xas, xa, (1 << 16) - 1);
1314	unsigned long i;
1315
1316	for (i = 0; i < (1 << 16); i++)
1317		XA_BUG_ON(xa, xa_store_index(xa, i, GFP_KERNEL) != NULL);
1318
1319	rcu_read_lock();
1320	do {
1321		void *entry = xas_prev(&xas);
1322		i--;
1323		XA_BUG_ON(xa, entry != xa_mk_index(i));
1324		XA_BUG_ON(xa, i != xas.xa_index);
1325	} while (i != 0);
1326
1327	XA_BUG_ON(xa, xas_prev(&xas) != NULL);
1328	XA_BUG_ON(xa, xas.xa_index != ULONG_MAX);
1329
1330	do {
1331		void *entry = xas_next(&xas);
1332		XA_BUG_ON(xa, entry != xa_mk_index(i));
1333		XA_BUG_ON(xa, i != xas.xa_index);
1334		i++;
1335	} while (i < (1 << 16));
1336	rcu_read_unlock();
1337
1338	for (i = (1 << 8); i < (1 << 15); i++)
1339		xa_erase_index(xa, i);
1340
1341	i = xas.xa_index;
1342
1343	rcu_read_lock();
1344	do {
1345		void *entry = xas_prev(&xas);
1346		i--;
1347		if ((i < (1 << 8)) || (i >= (1 << 15)))
1348			XA_BUG_ON(xa, entry != xa_mk_index(i));
1349		else
1350			XA_BUG_ON(xa, entry != NULL);
1351		XA_BUG_ON(xa, i != xas.xa_index);
1352	} while (i != 0);
1353
1354	XA_BUG_ON(xa, xas_prev(&xas) != NULL);
1355	XA_BUG_ON(xa, xas.xa_index != ULONG_MAX);
1356
1357	do {
1358		void *entry = xas_next(&xas);
1359		if ((i < (1 << 8)) || (i >= (1 << 15)))
1360			XA_BUG_ON(xa, entry != xa_mk_index(i));
1361		else
1362			XA_BUG_ON(xa, entry != NULL);
1363		XA_BUG_ON(xa, i != xas.xa_index);
1364		i++;
1365	} while (i < (1 << 16));
1366	rcu_read_unlock();
1367
1368	xa_destroy(xa);
1369
1370	check_move_tiny(xa);
1371	check_move_max(xa);
1372
1373	for (i = 0; i < 16; i++)
1374		check_move_small(xa, 1UL << i);
1375
1376	for (i = 2; i < 16; i++)
1377		check_move_small(xa, (1UL << i) - 1);
1378}
1379
1380static noinline void xa_store_many_order(struct xarray *xa,
1381		unsigned long index, unsigned order)
1382{
1383	XA_STATE_ORDER(xas, xa, index, order);
1384	unsigned int i = 0;
1385
1386	do {
1387		xas_lock(&xas);
1388		XA_BUG_ON(xa, xas_find_conflict(&xas));
1389		xas_create_range(&xas);
1390		if (xas_error(&xas))
1391			goto unlock;
1392		for (i = 0; i < (1U << order); i++) {
1393			XA_BUG_ON(xa, xas_store(&xas, xa_mk_index(index + i)));
1394			xas_next(&xas);
1395		}
1396unlock:
1397		xas_unlock(&xas);
1398	} while (xas_nomem(&xas, GFP_KERNEL));
1399
1400	XA_BUG_ON(xa, xas_error(&xas));
1401}
1402
1403static noinline void check_create_range_1(struct xarray *xa,
1404		unsigned long index, unsigned order)
1405{
1406	unsigned long i;
1407
1408	xa_store_many_order(xa, index, order);
1409	for (i = index; i < index + (1UL << order); i++)
1410		xa_erase_index(xa, i);
1411	XA_BUG_ON(xa, !xa_empty(xa));
1412}
1413
1414static noinline void check_create_range_2(struct xarray *xa, unsigned order)
1415{
1416	unsigned long i;
1417	unsigned long nr = 1UL << order;
1418
1419	for (i = 0; i < nr * nr; i += nr)
1420		xa_store_many_order(xa, i, order);
1421	for (i = 0; i < nr * nr; i++)
1422		xa_erase_index(xa, i);
1423	XA_BUG_ON(xa, !xa_empty(xa));
1424}
1425
1426static noinline void check_create_range_3(void)
1427{
1428	XA_STATE(xas, NULL, 0);
1429	xas_set_err(&xas, -EEXIST);
1430	xas_create_range(&xas);
1431	XA_BUG_ON(NULL, xas_error(&xas) != -EEXIST);
1432}
1433
1434static noinline void check_create_range_4(struct xarray *xa,
1435		unsigned long index, unsigned order)
1436{
1437	XA_STATE_ORDER(xas, xa, index, order);
1438	unsigned long base = xas.xa_index;
1439	unsigned long i = 0;
1440
1441	xa_store_index(xa, index, GFP_KERNEL);
1442	do {
1443		xas_lock(&xas);
1444		xas_create_range(&xas);
1445		if (xas_error(&xas))
1446			goto unlock;
1447		for (i = 0; i < (1UL << order); i++) {
1448			void *old = xas_store(&xas, xa_mk_index(base + i));
1449			if (xas.xa_index == index)
1450				XA_BUG_ON(xa, old != xa_mk_index(base + i));
1451			else
1452				XA_BUG_ON(xa, old != NULL);
1453			xas_next(&xas);
1454		}
1455unlock:
1456		xas_unlock(&xas);
1457	} while (xas_nomem(&xas, GFP_KERNEL));
1458
1459	XA_BUG_ON(xa, xas_error(&xas));
1460
1461	for (i = base; i < base + (1UL << order); i++)
1462		xa_erase_index(xa, i);
1463	XA_BUG_ON(xa, !xa_empty(xa));
1464}
1465
1466static noinline void check_create_range(struct xarray *xa)
1467{
1468	unsigned int order;
1469	unsigned int max_order = IS_ENABLED(CONFIG_XARRAY_MULTI) ? 12 : 1;
1470
1471	for (order = 0; order < max_order; order++) {
1472		check_create_range_1(xa, 0, order);
1473		check_create_range_1(xa, 1U << order, order);
1474		check_create_range_1(xa, 2U << order, order);
1475		check_create_range_1(xa, 3U << order, order);
1476		check_create_range_1(xa, 1U << 24, order);
1477		if (order < 10)
1478			check_create_range_2(xa, order);
1479
1480		check_create_range_4(xa, 0, order);
1481		check_create_range_4(xa, 1U << order, order);
1482		check_create_range_4(xa, 2U << order, order);
1483		check_create_range_4(xa, 3U << order, order);
1484		check_create_range_4(xa, 1U << 24, order);
1485
1486		check_create_range_4(xa, 1, order);
1487		check_create_range_4(xa, (1U << order) + 1, order);
1488		check_create_range_4(xa, (2U << order) + 1, order);
1489		check_create_range_4(xa, (2U << order) - 1, order);
1490		check_create_range_4(xa, (3U << order) + 1, order);
1491		check_create_range_4(xa, (3U << order) - 1, order);
1492		check_create_range_4(xa, (1U << 24) + 1, order);
1493	}
1494
1495	check_create_range_3();
1496}
1497
1498static noinline void __check_store_range(struct xarray *xa, unsigned long first,
1499		unsigned long last)
1500{
1501#ifdef CONFIG_XARRAY_MULTI
1502	xa_store_range(xa, first, last, xa_mk_index(first), GFP_KERNEL);
1503
1504	XA_BUG_ON(xa, xa_load(xa, first) != xa_mk_index(first));
1505	XA_BUG_ON(xa, xa_load(xa, last) != xa_mk_index(first));
1506	XA_BUG_ON(xa, xa_load(xa, first - 1) != NULL);
1507	XA_BUG_ON(xa, xa_load(xa, last + 1) != NULL);
1508
1509	xa_store_range(xa, first, last, NULL, GFP_KERNEL);
1510#endif
1511
1512	XA_BUG_ON(xa, !xa_empty(xa));
1513}
1514
1515static noinline void check_store_range(struct xarray *xa)
1516{
1517	unsigned long i, j;
1518
1519	for (i = 0; i < 128; i++) {
1520		for (j = i; j < 128; j++) {
1521			__check_store_range(xa, i, j);
1522			__check_store_range(xa, 128 + i, 128 + j);
1523			__check_store_range(xa, 4095 + i, 4095 + j);
1524			__check_store_range(xa, 4096 + i, 4096 + j);
1525			__check_store_range(xa, 123456 + i, 123456 + j);
1526			__check_store_range(xa, (1 << 24) + i, (1 << 24) + j);
1527		}
1528	}
1529}
1530
1531#ifdef CONFIG_XARRAY_MULTI
1532static void check_split_1(struct xarray *xa, unsigned long index,
1533				unsigned int order, unsigned int new_order)
1534{
1535	XA_STATE_ORDER(xas, xa, index, new_order);
1536	unsigned int i;
1537
1538	xa_store_order(xa, index, order, xa, GFP_KERNEL);
1539
1540	xas_split_alloc(&xas, xa, order, GFP_KERNEL);
1541	xas_lock(&xas);
1542	xas_split(&xas, xa, order);
1543	for (i = 0; i < (1 << order); i += (1 << new_order))
1544		__xa_store(xa, index + i, xa_mk_index(index + i), 0);
1545	xas_unlock(&xas);
1546
1547	for (i = 0; i < (1 << order); i++) {
1548		unsigned int val = index + (i & ~((1 << new_order) - 1));
1549		XA_BUG_ON(xa, xa_load(xa, index + i) != xa_mk_index(val));
1550	}
1551
1552	xa_set_mark(xa, index, XA_MARK_0);
1553	XA_BUG_ON(xa, !xa_get_mark(xa, index, XA_MARK_0));
1554
1555	xa_destroy(xa);
1556}
1557
1558static noinline void check_split(struct xarray *xa)
1559{
1560	unsigned int order, new_order;
1561
1562	XA_BUG_ON(xa, !xa_empty(xa));
1563
1564	for (order = 1; order < 2 * XA_CHUNK_SHIFT; order++) {
1565		for (new_order = 0; new_order < order; new_order++) {
1566			check_split_1(xa, 0, order, new_order);
1567			check_split_1(xa, 1UL << order, order, new_order);
1568			check_split_1(xa, 3UL << order, order, new_order);
1569		}
1570	}
1571}
1572#else
1573static void check_split(struct xarray *xa) { }
1574#endif
1575
1576static void check_align_1(struct xarray *xa, char *name)
1577{
1578	int i;
1579	unsigned int id;
1580	unsigned long index;
1581	void *entry;
1582
1583	for (i = 0; i < 8; i++) {
1584		XA_BUG_ON(xa, xa_alloc(xa, &id, name + i, xa_limit_32b,
1585					GFP_KERNEL) != 0);
1586		XA_BUG_ON(xa, id != i);
1587	}
1588	xa_for_each(xa, index, entry)
1589		XA_BUG_ON(xa, xa_is_err(entry));
1590	xa_destroy(xa);
1591}
1592
1593/*
1594 * We should always be able to store without allocating memory after
1595 * reserving a slot.
1596 */
1597static void check_align_2(struct xarray *xa, char *name)
1598{
1599	int i;
1600
1601	XA_BUG_ON(xa, !xa_empty(xa));
1602
1603	for (i = 0; i < 8; i++) {
1604		XA_BUG_ON(xa, xa_store(xa, 0, name + i, GFP_KERNEL) != NULL);
1605		xa_erase(xa, 0);
1606	}
1607
1608	for (i = 0; i < 8; i++) {
1609		XA_BUG_ON(xa, xa_reserve(xa, 0, GFP_KERNEL) != 0);
1610		XA_BUG_ON(xa, xa_store(xa, 0, name + i, 0) != NULL);
1611		xa_erase(xa, 0);
1612	}
1613
1614	XA_BUG_ON(xa, !xa_empty(xa));
1615}
1616
1617static noinline void check_align(struct xarray *xa)
1618{
1619	char name[] = "Motorola 68000";
1620
1621	check_align_1(xa, name);
1622	check_align_1(xa, name + 1);
1623	check_align_1(xa, name + 2);
1624	check_align_1(xa, name + 3);
1625	check_align_2(xa, name);
1626}
1627
1628static LIST_HEAD(shadow_nodes);
1629
1630static void test_update_node(struct xa_node *node)
1631{
1632	if (node->count && node->count == node->nr_values) {
1633		if (list_empty(&node->private_list))
1634			list_add(&shadow_nodes, &node->private_list);
1635	} else {
1636		if (!list_empty(&node->private_list))
1637			list_del_init(&node->private_list);
1638	}
1639}
1640
1641static noinline void shadow_remove(struct xarray *xa)
1642{
1643	struct xa_node *node;
1644
1645	xa_lock(xa);
1646	while ((node = list_first_entry_or_null(&shadow_nodes,
1647					struct xa_node, private_list))) {
 
1648		XA_BUG_ON(xa, node->array != xa);
1649		list_del_init(&node->private_list);
1650		xa_delete_node(node, test_update_node);
 
 
 
 
1651	}
1652	xa_unlock(xa);
1653}
1654
1655static noinline void check_workingset(struct xarray *xa, unsigned long index)
1656{
1657	XA_STATE(xas, xa, index);
1658	xas_set_update(&xas, test_update_node);
1659
1660	do {
1661		xas_lock(&xas);
1662		xas_store(&xas, xa_mk_value(0));
1663		xas_next(&xas);
1664		xas_store(&xas, xa_mk_value(1));
1665		xas_unlock(&xas);
1666	} while (xas_nomem(&xas, GFP_KERNEL));
1667
1668	XA_BUG_ON(xa, list_empty(&shadow_nodes));
1669
1670	xas_lock(&xas);
1671	xas_next(&xas);
1672	xas_store(&xas, &xas);
1673	XA_BUG_ON(xa, !list_empty(&shadow_nodes));
1674
1675	xas_store(&xas, xa_mk_value(2));
1676	xas_unlock(&xas);
1677	XA_BUG_ON(xa, list_empty(&shadow_nodes));
1678
1679	shadow_remove(xa);
1680	XA_BUG_ON(xa, !list_empty(&shadow_nodes));
1681	XA_BUG_ON(xa, !xa_empty(xa));
1682}
1683
1684/*
1685 * Check that the pointer / value / sibling entries are accounted the
1686 * way we expect them to be.
1687 */
1688static noinline void check_account(struct xarray *xa)
1689{
1690#ifdef CONFIG_XARRAY_MULTI
1691	unsigned int order;
1692
1693	for (order = 1; order < 12; order++) {
1694		XA_STATE(xas, xa, 1 << order);
1695
1696		xa_store_order(xa, 0, order, xa, GFP_KERNEL);
1697		rcu_read_lock();
1698		xas_load(&xas);
1699		XA_BUG_ON(xa, xas.xa_node->count == 0);
1700		XA_BUG_ON(xa, xas.xa_node->count > (1 << order));
1701		XA_BUG_ON(xa, xas.xa_node->nr_values != 0);
1702		rcu_read_unlock();
1703
1704		xa_store_order(xa, 1 << order, order, xa_mk_index(1UL << order),
1705				GFP_KERNEL);
1706		XA_BUG_ON(xa, xas.xa_node->count != xas.xa_node->nr_values * 2);
1707
1708		xa_erase(xa, 1 << order);
1709		XA_BUG_ON(xa, xas.xa_node->nr_values != 0);
1710
1711		xa_erase(xa, 0);
1712		XA_BUG_ON(xa, !xa_empty(xa));
1713	}
1714#endif
1715}
1716
1717static noinline void check_get_order(struct xarray *xa)
1718{
1719	unsigned int max_order = IS_ENABLED(CONFIG_XARRAY_MULTI) ? 20 : 1;
1720	unsigned int order;
1721	unsigned long i, j;
1722
1723	for (i = 0; i < 3; i++)
1724		XA_BUG_ON(xa, xa_get_order(xa, i) != 0);
1725
1726	for (order = 0; order < max_order; order++) {
1727		for (i = 0; i < 10; i++) {
1728			xa_store_order(xa, i << order, order,
1729					xa_mk_index(i << order), GFP_KERNEL);
1730			for (j = i << order; j < (i + 1) << order; j++)
1731				XA_BUG_ON(xa, xa_get_order(xa, j) != order);
1732			xa_erase(xa, i << order);
1733		}
1734	}
1735}
1736
1737static noinline void check_destroy(struct xarray *xa)
1738{
1739	unsigned long index;
1740
1741	XA_BUG_ON(xa, !xa_empty(xa));
1742
1743	/* Destroying an empty array is a no-op */
1744	xa_destroy(xa);
1745	XA_BUG_ON(xa, !xa_empty(xa));
1746
1747	/* Destroying an array with a single entry */
1748	for (index = 0; index < 1000; index++) {
1749		xa_store_index(xa, index, GFP_KERNEL);
1750		XA_BUG_ON(xa, xa_empty(xa));
1751		xa_destroy(xa);
1752		XA_BUG_ON(xa, !xa_empty(xa));
1753	}
1754
1755	/* Destroying an array with a single entry at ULONG_MAX */
1756	xa_store(xa, ULONG_MAX, xa, GFP_KERNEL);
1757	XA_BUG_ON(xa, xa_empty(xa));
1758	xa_destroy(xa);
1759	XA_BUG_ON(xa, !xa_empty(xa));
1760
1761#ifdef CONFIG_XARRAY_MULTI
1762	/* Destroying an array with a multi-index entry */
1763	xa_store_order(xa, 1 << 11, 11, xa, GFP_KERNEL);
1764	XA_BUG_ON(xa, xa_empty(xa));
1765	xa_destroy(xa);
1766	XA_BUG_ON(xa, !xa_empty(xa));
1767#endif
1768}
1769
1770static DEFINE_XARRAY(array);
1771
1772static int xarray_checks(void)
1773{
1774	check_xa_err(&array);
1775	check_xas_retry(&array);
1776	check_xa_load(&array);
1777	check_xa_mark(&array);
1778	check_xa_shrink(&array);
1779	check_xas_erase(&array);
1780	check_insert(&array);
1781	check_cmpxchg(&array);
1782	check_reserve(&array);
1783	check_reserve(&xa0);
1784	check_multi_store(&array);
1785	check_get_order(&array);
1786	check_xa_alloc();
1787	check_find(&array);
1788	check_find_entry(&array);
1789	check_pause(&array);
1790	check_account(&array);
1791	check_destroy(&array);
1792	check_move(&array);
1793	check_create_range(&array);
1794	check_store_range(&array);
1795	check_store_iter(&array);
1796	check_align(&xa0);
1797	check_split(&array);
1798
1799	check_workingset(&array, 0);
1800	check_workingset(&array, 64);
1801	check_workingset(&array, 4096);
1802
1803	printk("XArray: %u of %u tests passed\n", tests_passed, tests_run);
1804	return (tests_run == tests_passed) ? 0 : -EINVAL;
1805}
1806
1807static void xarray_exit(void)
1808{
1809}
1810
1811module_init(xarray_checks);
1812module_exit(xarray_exit);
1813MODULE_AUTHOR("Matthew Wilcox <willy@infradead.org>");
1814MODULE_LICENSE("GPL");
v5.4
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * test_xarray.c: Test the XArray API
   4 * Copyright (c) 2017-2018 Microsoft Corporation
 
   5 * Author: Matthew Wilcox <willy@infradead.org>
   6 */
   7
   8#include <linux/xarray.h>
   9#include <linux/module.h>
  10
  11static unsigned int tests_run;
  12static unsigned int tests_passed;
  13
 
 
 
  14#ifndef XA_DEBUG
  15# ifdef __KERNEL__
  16void xa_dump(const struct xarray *xa) { }
  17# endif
  18#undef XA_BUG_ON
  19#define XA_BUG_ON(xa, x) do {					\
  20	tests_run++;						\
  21	if (x) {						\
  22		printk("BUG at %s:%d\n", __func__, __LINE__);	\
  23		xa_dump(xa);					\
  24		dump_stack();					\
  25	} else {						\
  26		tests_passed++;					\
  27	}							\
  28} while (0)
  29#endif
  30
  31static void *xa_mk_index(unsigned long index)
  32{
  33	return xa_mk_value(index & LONG_MAX);
  34}
  35
  36static void *xa_store_index(struct xarray *xa, unsigned long index, gfp_t gfp)
  37{
  38	return xa_store(xa, index, xa_mk_index(index), gfp);
  39}
  40
  41static void xa_insert_index(struct xarray *xa, unsigned long index)
  42{
  43	XA_BUG_ON(xa, xa_insert(xa, index, xa_mk_index(index),
  44				GFP_KERNEL) != 0);
  45}
  46
  47static void xa_alloc_index(struct xarray *xa, unsigned long index, gfp_t gfp)
  48{
  49	u32 id;
  50
  51	XA_BUG_ON(xa, xa_alloc(xa, &id, xa_mk_index(index), xa_limit_32b,
  52				gfp) != 0);
  53	XA_BUG_ON(xa, id != index);
  54}
  55
  56static void xa_erase_index(struct xarray *xa, unsigned long index)
  57{
  58	XA_BUG_ON(xa, xa_erase(xa, index) != xa_mk_index(index));
  59	XA_BUG_ON(xa, xa_load(xa, index) != NULL);
  60}
  61
  62/*
  63 * If anyone needs this, please move it to xarray.c.  We have no current
  64 * users outside the test suite because all current multislot users want
  65 * to use the advanced API.
  66 */
  67static void *xa_store_order(struct xarray *xa, unsigned long index,
  68		unsigned order, void *entry, gfp_t gfp)
  69{
  70	XA_STATE_ORDER(xas, xa, index, order);
  71	void *curr;
  72
  73	do {
  74		xas_lock(&xas);
  75		curr = xas_store(&xas, entry);
  76		xas_unlock(&xas);
  77	} while (xas_nomem(&xas, gfp));
  78
  79	return curr;
  80}
  81
  82static noinline void check_xa_err(struct xarray *xa)
  83{
  84	XA_BUG_ON(xa, xa_err(xa_store_index(xa, 0, GFP_NOWAIT)) != 0);
  85	XA_BUG_ON(xa, xa_err(xa_erase(xa, 0)) != 0);
  86#ifndef __KERNEL__
  87	/* The kernel does not fail GFP_NOWAIT allocations */
  88	XA_BUG_ON(xa, xa_err(xa_store_index(xa, 1, GFP_NOWAIT)) != -ENOMEM);
  89	XA_BUG_ON(xa, xa_err(xa_store_index(xa, 1, GFP_NOWAIT)) != -ENOMEM);
  90#endif
  91	XA_BUG_ON(xa, xa_err(xa_store_index(xa, 1, GFP_KERNEL)) != 0);
  92	XA_BUG_ON(xa, xa_err(xa_store(xa, 1, xa_mk_value(0), GFP_KERNEL)) != 0);
  93	XA_BUG_ON(xa, xa_err(xa_erase(xa, 1)) != 0);
  94// kills the test-suite :-(
  95//	XA_BUG_ON(xa, xa_err(xa_store(xa, 0, xa_mk_internal(0), 0)) != -EINVAL);
  96}
  97
  98static noinline void check_xas_retry(struct xarray *xa)
  99{
 100	XA_STATE(xas, xa, 0);
 101	void *entry;
 102
 103	xa_store_index(xa, 0, GFP_KERNEL);
 104	xa_store_index(xa, 1, GFP_KERNEL);
 105
 106	rcu_read_lock();
 107	XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != xa_mk_value(0));
 108	xa_erase_index(xa, 1);
 109	XA_BUG_ON(xa, !xa_is_retry(xas_reload(&xas)));
 110	XA_BUG_ON(xa, xas_retry(&xas, NULL));
 111	XA_BUG_ON(xa, xas_retry(&xas, xa_mk_value(0)));
 112	xas_reset(&xas);
 113	XA_BUG_ON(xa, xas.xa_node != XAS_RESTART);
 114	XA_BUG_ON(xa, xas_next_entry(&xas, ULONG_MAX) != xa_mk_value(0));
 115	XA_BUG_ON(xa, xas.xa_node != NULL);
 116	rcu_read_unlock();
 117
 118	XA_BUG_ON(xa, xa_store_index(xa, 1, GFP_KERNEL) != NULL);
 119
 120	rcu_read_lock();
 121	XA_BUG_ON(xa, !xa_is_internal(xas_reload(&xas)));
 122	xas.xa_node = XAS_RESTART;
 123	XA_BUG_ON(xa, xas_next_entry(&xas, ULONG_MAX) != xa_mk_value(0));
 124	rcu_read_unlock();
 125
 126	/* Make sure we can iterate through retry entries */
 127	xas_lock(&xas);
 128	xas_set(&xas, 0);
 129	xas_store(&xas, XA_RETRY_ENTRY);
 130	xas_set(&xas, 1);
 131	xas_store(&xas, XA_RETRY_ENTRY);
 132
 133	xas_set(&xas, 0);
 134	xas_for_each(&xas, entry, ULONG_MAX) {
 135		xas_store(&xas, xa_mk_index(xas.xa_index));
 136	}
 137	xas_unlock(&xas);
 138
 139	xa_erase_index(xa, 0);
 140	xa_erase_index(xa, 1);
 141}
 142
 143static noinline void check_xa_load(struct xarray *xa)
 144{
 145	unsigned long i, j;
 146
 147	for (i = 0; i < 1024; i++) {
 148		for (j = 0; j < 1024; j++) {
 149			void *entry = xa_load(xa, j);
 150			if (j < i)
 151				XA_BUG_ON(xa, xa_to_value(entry) != j);
 152			else
 153				XA_BUG_ON(xa, entry);
 154		}
 155		XA_BUG_ON(xa, xa_store_index(xa, i, GFP_KERNEL) != NULL);
 156	}
 157
 158	for (i = 0; i < 1024; i++) {
 159		for (j = 0; j < 1024; j++) {
 160			void *entry = xa_load(xa, j);
 161			if (j >= i)
 162				XA_BUG_ON(xa, xa_to_value(entry) != j);
 163			else
 164				XA_BUG_ON(xa, entry);
 165		}
 166		xa_erase_index(xa, i);
 167	}
 168	XA_BUG_ON(xa, !xa_empty(xa));
 169}
 170
 171static noinline void check_xa_mark_1(struct xarray *xa, unsigned long index)
 172{
 173	unsigned int order;
 174	unsigned int max_order = IS_ENABLED(CONFIG_XARRAY_MULTI) ? 8 : 1;
 175
 176	/* NULL elements have no marks set */
 177	XA_BUG_ON(xa, xa_get_mark(xa, index, XA_MARK_0));
 178	xa_set_mark(xa, index, XA_MARK_0);
 179	XA_BUG_ON(xa, xa_get_mark(xa, index, XA_MARK_0));
 180
 181	/* Storing a pointer will not make a mark appear */
 182	XA_BUG_ON(xa, xa_store_index(xa, index, GFP_KERNEL) != NULL);
 183	XA_BUG_ON(xa, xa_get_mark(xa, index, XA_MARK_0));
 184	xa_set_mark(xa, index, XA_MARK_0);
 185	XA_BUG_ON(xa, !xa_get_mark(xa, index, XA_MARK_0));
 186
 187	/* Setting one mark will not set another mark */
 188	XA_BUG_ON(xa, xa_get_mark(xa, index + 1, XA_MARK_0));
 189	XA_BUG_ON(xa, xa_get_mark(xa, index, XA_MARK_1));
 190
 191	/* Storing NULL clears marks, and they can't be set again */
 192	xa_erase_index(xa, index);
 193	XA_BUG_ON(xa, !xa_empty(xa));
 194	XA_BUG_ON(xa, xa_get_mark(xa, index, XA_MARK_0));
 195	xa_set_mark(xa, index, XA_MARK_0);
 196	XA_BUG_ON(xa, xa_get_mark(xa, index, XA_MARK_0));
 197
 198	/*
 199	 * Storing a multi-index entry over entries with marks gives the
 200	 * entire entry the union of the marks
 201	 */
 202	BUG_ON((index % 4) != 0);
 203	for (order = 2; order < max_order; order++) {
 204		unsigned long base = round_down(index, 1UL << order);
 205		unsigned long next = base + (1UL << order);
 206		unsigned long i;
 207
 208		XA_BUG_ON(xa, xa_store_index(xa, index + 1, GFP_KERNEL));
 209		xa_set_mark(xa, index + 1, XA_MARK_0);
 210		XA_BUG_ON(xa, xa_store_index(xa, index + 2, GFP_KERNEL));
 211		xa_set_mark(xa, index + 2, XA_MARK_2);
 212		XA_BUG_ON(xa, xa_store_index(xa, next, GFP_KERNEL));
 213		xa_store_order(xa, index, order, xa_mk_index(index),
 214				GFP_KERNEL);
 215		for (i = base; i < next; i++) {
 216			XA_STATE(xas, xa, i);
 217			unsigned int seen = 0;
 218			void *entry;
 219
 220			XA_BUG_ON(xa, !xa_get_mark(xa, i, XA_MARK_0));
 221			XA_BUG_ON(xa, xa_get_mark(xa, i, XA_MARK_1));
 222			XA_BUG_ON(xa, !xa_get_mark(xa, i, XA_MARK_2));
 223
 224			/* We should see two elements in the array */
 225			rcu_read_lock();
 226			xas_for_each(&xas, entry, ULONG_MAX)
 227				seen++;
 228			rcu_read_unlock();
 229			XA_BUG_ON(xa, seen != 2);
 230
 231			/* One of which is marked */
 232			xas_set(&xas, 0);
 233			seen = 0;
 234			rcu_read_lock();
 235			xas_for_each_marked(&xas, entry, ULONG_MAX, XA_MARK_0)
 236				seen++;
 237			rcu_read_unlock();
 238			XA_BUG_ON(xa, seen != 1);
 239		}
 240		XA_BUG_ON(xa, xa_get_mark(xa, next, XA_MARK_0));
 241		XA_BUG_ON(xa, xa_get_mark(xa, next, XA_MARK_1));
 242		XA_BUG_ON(xa, xa_get_mark(xa, next, XA_MARK_2));
 243		xa_erase_index(xa, index);
 244		xa_erase_index(xa, next);
 245		XA_BUG_ON(xa, !xa_empty(xa));
 246	}
 247	XA_BUG_ON(xa, !xa_empty(xa));
 248}
 249
 250static noinline void check_xa_mark_2(struct xarray *xa)
 251{
 252	XA_STATE(xas, xa, 0);
 253	unsigned long index;
 254	unsigned int count = 0;
 255	void *entry;
 256
 257	xa_store_index(xa, 0, GFP_KERNEL);
 258	xa_set_mark(xa, 0, XA_MARK_0);
 259	xas_lock(&xas);
 260	xas_load(&xas);
 261	xas_init_marks(&xas);
 262	xas_unlock(&xas);
 263	XA_BUG_ON(xa, !xa_get_mark(xa, 0, XA_MARK_0) == 0);
 264
 265	for (index = 3500; index < 4500; index++) {
 266		xa_store_index(xa, index, GFP_KERNEL);
 267		xa_set_mark(xa, index, XA_MARK_0);
 268	}
 269
 270	xas_reset(&xas);
 271	rcu_read_lock();
 272	xas_for_each_marked(&xas, entry, ULONG_MAX, XA_MARK_0)
 273		count++;
 274	rcu_read_unlock();
 275	XA_BUG_ON(xa, count != 1000);
 276
 277	xas_lock(&xas);
 278	xas_for_each(&xas, entry, ULONG_MAX) {
 279		xas_init_marks(&xas);
 280		XA_BUG_ON(xa, !xa_get_mark(xa, xas.xa_index, XA_MARK_0));
 281		XA_BUG_ON(xa, !xas_get_mark(&xas, XA_MARK_0));
 282	}
 283	xas_unlock(&xas);
 284
 285	xa_destroy(xa);
 286}
 287
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 288static noinline void check_xa_mark(struct xarray *xa)
 289{
 290	unsigned long index;
 291
 292	for (index = 0; index < 16384; index += 4)
 293		check_xa_mark_1(xa, index);
 294
 295	check_xa_mark_2(xa);
 
 296}
 297
 298static noinline void check_xa_shrink(struct xarray *xa)
 299{
 300	XA_STATE(xas, xa, 1);
 301	struct xa_node *node;
 302	unsigned int order;
 303	unsigned int max_order = IS_ENABLED(CONFIG_XARRAY_MULTI) ? 15 : 1;
 304
 305	XA_BUG_ON(xa, !xa_empty(xa));
 306	XA_BUG_ON(xa, xa_store_index(xa, 0, GFP_KERNEL) != NULL);
 307	XA_BUG_ON(xa, xa_store_index(xa, 1, GFP_KERNEL) != NULL);
 308
 309	/*
 310	 * Check that erasing the entry at 1 shrinks the tree and properly
 311	 * marks the node as being deleted.
 312	 */
 313	xas_lock(&xas);
 314	XA_BUG_ON(xa, xas_load(&xas) != xa_mk_value(1));
 315	node = xas.xa_node;
 316	XA_BUG_ON(xa, xa_entry_locked(xa, node, 0) != xa_mk_value(0));
 317	XA_BUG_ON(xa, xas_store(&xas, NULL) != xa_mk_value(1));
 318	XA_BUG_ON(xa, xa_load(xa, 1) != NULL);
 319	XA_BUG_ON(xa, xas.xa_node != XAS_BOUNDS);
 320	XA_BUG_ON(xa, xa_entry_locked(xa, node, 0) != XA_RETRY_ENTRY);
 321	XA_BUG_ON(xa, xas_load(&xas) != NULL);
 322	xas_unlock(&xas);
 323	XA_BUG_ON(xa, xa_load(xa, 0) != xa_mk_value(0));
 324	xa_erase_index(xa, 0);
 325	XA_BUG_ON(xa, !xa_empty(xa));
 326
 327	for (order = 0; order < max_order; order++) {
 328		unsigned long max = (1UL << order) - 1;
 329		xa_store_order(xa, 0, order, xa_mk_value(0), GFP_KERNEL);
 330		XA_BUG_ON(xa, xa_load(xa, max) != xa_mk_value(0));
 331		XA_BUG_ON(xa, xa_load(xa, max + 1) != NULL);
 332		rcu_read_lock();
 333		node = xa_head(xa);
 334		rcu_read_unlock();
 335		XA_BUG_ON(xa, xa_store_index(xa, ULONG_MAX, GFP_KERNEL) !=
 336				NULL);
 337		rcu_read_lock();
 338		XA_BUG_ON(xa, xa_head(xa) == node);
 339		rcu_read_unlock();
 340		XA_BUG_ON(xa, xa_load(xa, max + 1) != NULL);
 341		xa_erase_index(xa, ULONG_MAX);
 342		XA_BUG_ON(xa, xa->xa_head != node);
 343		xa_erase_index(xa, 0);
 344	}
 345}
 346
 347static noinline void check_insert(struct xarray *xa)
 348{
 349	unsigned long i;
 350
 351	for (i = 0; i < 1024; i++) {
 352		xa_insert_index(xa, i);
 353		XA_BUG_ON(xa, xa_load(xa, i - 1) != NULL);
 354		XA_BUG_ON(xa, xa_load(xa, i + 1) != NULL);
 355		xa_erase_index(xa, i);
 356	}
 357
 358	for (i = 10; i < BITS_PER_LONG; i++) {
 359		xa_insert_index(xa, 1UL << i);
 360		XA_BUG_ON(xa, xa_load(xa, (1UL << i) - 1) != NULL);
 361		XA_BUG_ON(xa, xa_load(xa, (1UL << i) + 1) != NULL);
 362		xa_erase_index(xa, 1UL << i);
 363
 364		xa_insert_index(xa, (1UL << i) - 1);
 365		XA_BUG_ON(xa, xa_load(xa, (1UL << i) - 2) != NULL);
 366		XA_BUG_ON(xa, xa_load(xa, 1UL << i) != NULL);
 367		xa_erase_index(xa, (1UL << i) - 1);
 368	}
 369
 370	xa_insert_index(xa, ~0UL);
 371	XA_BUG_ON(xa, xa_load(xa, 0UL) != NULL);
 372	XA_BUG_ON(xa, xa_load(xa, ~1UL) != NULL);
 373	xa_erase_index(xa, ~0UL);
 374
 375	XA_BUG_ON(xa, !xa_empty(xa));
 376}
 377
 378static noinline void check_cmpxchg(struct xarray *xa)
 379{
 380	void *FIVE = xa_mk_value(5);
 381	void *SIX = xa_mk_value(6);
 382	void *LOTS = xa_mk_value(12345678);
 383
 384	XA_BUG_ON(xa, !xa_empty(xa));
 385	XA_BUG_ON(xa, xa_store_index(xa, 12345678, GFP_KERNEL) != NULL);
 386	XA_BUG_ON(xa, xa_insert(xa, 12345678, xa, GFP_KERNEL) != -EBUSY);
 387	XA_BUG_ON(xa, xa_cmpxchg(xa, 12345678, SIX, FIVE, GFP_KERNEL) != LOTS);
 388	XA_BUG_ON(xa, xa_cmpxchg(xa, 12345678, LOTS, FIVE, GFP_KERNEL) != LOTS);
 389	XA_BUG_ON(xa, xa_cmpxchg(xa, 12345678, FIVE, LOTS, GFP_KERNEL) != FIVE);
 390	XA_BUG_ON(xa, xa_cmpxchg(xa, 5, FIVE, NULL, GFP_KERNEL) != NULL);
 391	XA_BUG_ON(xa, xa_cmpxchg(xa, 5, NULL, FIVE, GFP_KERNEL) != NULL);
 
 
 
 392	xa_erase_index(xa, 12345678);
 393	xa_erase_index(xa, 5);
 394	XA_BUG_ON(xa, !xa_empty(xa));
 395}
 396
 397static noinline void check_reserve(struct xarray *xa)
 398{
 399	void *entry;
 400	unsigned long index;
 401	int count;
 402
 403	/* An array with a reserved entry is not empty */
 404	XA_BUG_ON(xa, !xa_empty(xa));
 405	XA_BUG_ON(xa, xa_reserve(xa, 12345678, GFP_KERNEL) != 0);
 406	XA_BUG_ON(xa, xa_empty(xa));
 407	XA_BUG_ON(xa, xa_load(xa, 12345678));
 408	xa_release(xa, 12345678);
 409	XA_BUG_ON(xa, !xa_empty(xa));
 410
 411	/* Releasing a used entry does nothing */
 412	XA_BUG_ON(xa, xa_reserve(xa, 12345678, GFP_KERNEL) != 0);
 413	XA_BUG_ON(xa, xa_store_index(xa, 12345678, GFP_NOWAIT) != NULL);
 414	xa_release(xa, 12345678);
 415	xa_erase_index(xa, 12345678);
 416	XA_BUG_ON(xa, !xa_empty(xa));
 417
 418	/* cmpxchg sees a reserved entry as ZERO */
 419	XA_BUG_ON(xa, xa_reserve(xa, 12345678, GFP_KERNEL) != 0);
 420	XA_BUG_ON(xa, xa_cmpxchg(xa, 12345678, XA_ZERO_ENTRY,
 421				xa_mk_value(12345678), GFP_NOWAIT) != NULL);
 422	xa_release(xa, 12345678);
 423	xa_erase_index(xa, 12345678);
 424	XA_BUG_ON(xa, !xa_empty(xa));
 425
 426	/* xa_insert treats it as busy */
 427	XA_BUG_ON(xa, xa_reserve(xa, 12345678, GFP_KERNEL) != 0);
 428	XA_BUG_ON(xa, xa_insert(xa, 12345678, xa_mk_value(12345678), 0) !=
 429			-EBUSY);
 430	XA_BUG_ON(xa, xa_empty(xa));
 431	XA_BUG_ON(xa, xa_erase(xa, 12345678) != NULL);
 432	XA_BUG_ON(xa, !xa_empty(xa));
 433
 434	/* Can iterate through a reserved entry */
 435	xa_store_index(xa, 5, GFP_KERNEL);
 436	XA_BUG_ON(xa, xa_reserve(xa, 6, GFP_KERNEL) != 0);
 437	xa_store_index(xa, 7, GFP_KERNEL);
 438
 439	count = 0;
 440	xa_for_each(xa, index, entry) {
 441		XA_BUG_ON(xa, index != 5 && index != 7);
 442		count++;
 443	}
 444	XA_BUG_ON(xa, count != 2);
 445
 446	/* If we free a reserved entry, we should be able to allocate it */
 447	if (xa->xa_flags & XA_FLAGS_ALLOC) {
 448		u32 id;
 449
 450		XA_BUG_ON(xa, xa_alloc(xa, &id, xa_mk_value(8),
 451					XA_LIMIT(5, 10), GFP_KERNEL) != 0);
 452		XA_BUG_ON(xa, id != 8);
 453
 454		xa_release(xa, 6);
 455		XA_BUG_ON(xa, xa_alloc(xa, &id, xa_mk_value(6),
 456					XA_LIMIT(5, 10), GFP_KERNEL) != 0);
 457		XA_BUG_ON(xa, id != 6);
 458	}
 459
 460	xa_destroy(xa);
 461}
 462
 463static noinline void check_xas_erase(struct xarray *xa)
 464{
 465	XA_STATE(xas, xa, 0);
 466	void *entry;
 467	unsigned long i, j;
 468
 469	for (i = 0; i < 200; i++) {
 470		for (j = i; j < 2 * i + 17; j++) {
 471			xas_set(&xas, j);
 472			do {
 473				xas_lock(&xas);
 474				xas_store(&xas, xa_mk_index(j));
 475				xas_unlock(&xas);
 476			} while (xas_nomem(&xas, GFP_KERNEL));
 477		}
 478
 479		xas_set(&xas, ULONG_MAX);
 480		do {
 481			xas_lock(&xas);
 482			xas_store(&xas, xa_mk_value(0));
 483			xas_unlock(&xas);
 484		} while (xas_nomem(&xas, GFP_KERNEL));
 485
 486		xas_lock(&xas);
 487		xas_store(&xas, NULL);
 488
 489		xas_set(&xas, 0);
 490		j = i;
 491		xas_for_each(&xas, entry, ULONG_MAX) {
 492			XA_BUG_ON(xa, entry != xa_mk_index(j));
 493			xas_store(&xas, NULL);
 494			j++;
 495		}
 496		xas_unlock(&xas);
 497		XA_BUG_ON(xa, !xa_empty(xa));
 498	}
 499}
 500
 501#ifdef CONFIG_XARRAY_MULTI
 502static noinline void check_multi_store_1(struct xarray *xa, unsigned long index,
 503		unsigned int order)
 504{
 505	XA_STATE(xas, xa, index);
 506	unsigned long min = index & ~((1UL << order) - 1);
 507	unsigned long max = min + (1UL << order);
 508
 509	xa_store_order(xa, index, order, xa_mk_index(index), GFP_KERNEL);
 510	XA_BUG_ON(xa, xa_load(xa, min) != xa_mk_index(index));
 511	XA_BUG_ON(xa, xa_load(xa, max - 1) != xa_mk_index(index));
 512	XA_BUG_ON(xa, xa_load(xa, max) != NULL);
 513	XA_BUG_ON(xa, xa_load(xa, min - 1) != NULL);
 514
 515	xas_lock(&xas);
 516	XA_BUG_ON(xa, xas_store(&xas, xa_mk_index(min)) != xa_mk_index(index));
 517	xas_unlock(&xas);
 518	XA_BUG_ON(xa, xa_load(xa, min) != xa_mk_index(min));
 519	XA_BUG_ON(xa, xa_load(xa, max - 1) != xa_mk_index(min));
 520	XA_BUG_ON(xa, xa_load(xa, max) != NULL);
 521	XA_BUG_ON(xa, xa_load(xa, min - 1) != NULL);
 522
 523	xa_erase_index(xa, min);
 524	XA_BUG_ON(xa, !xa_empty(xa));
 525}
 526
 527static noinline void check_multi_store_2(struct xarray *xa, unsigned long index,
 528		unsigned int order)
 529{
 530	XA_STATE(xas, xa, index);
 531	xa_store_order(xa, index, order, xa_mk_value(0), GFP_KERNEL);
 532
 533	xas_lock(&xas);
 534	XA_BUG_ON(xa, xas_store(&xas, xa_mk_value(1)) != xa_mk_value(0));
 535	XA_BUG_ON(xa, xas.xa_index != index);
 536	XA_BUG_ON(xa, xas_store(&xas, NULL) != xa_mk_value(1));
 537	xas_unlock(&xas);
 538	XA_BUG_ON(xa, !xa_empty(xa));
 539}
 540
 541static noinline void check_multi_store_3(struct xarray *xa, unsigned long index,
 542		unsigned int order)
 543{
 544	XA_STATE(xas, xa, 0);
 545	void *entry;
 546	int n = 0;
 547
 548	xa_store_order(xa, index, order, xa_mk_index(index), GFP_KERNEL);
 549
 550	xas_lock(&xas);
 551	xas_for_each(&xas, entry, ULONG_MAX) {
 552		XA_BUG_ON(xa, entry != xa_mk_index(index));
 553		n++;
 554	}
 555	XA_BUG_ON(xa, n != 1);
 556	xas_set(&xas, index + 1);
 557	xas_for_each(&xas, entry, ULONG_MAX) {
 558		XA_BUG_ON(xa, entry != xa_mk_index(index));
 559		n++;
 560	}
 561	XA_BUG_ON(xa, n != 2);
 562	xas_unlock(&xas);
 563
 564	xa_destroy(xa);
 565}
 566#endif
 567
 568static noinline void check_multi_store(struct xarray *xa)
 569{
 570#ifdef CONFIG_XARRAY_MULTI
 571	unsigned long i, j, k;
 572	unsigned int max_order = (sizeof(long) == 4) ? 30 : 60;
 573
 574	/* Loading from any position returns the same value */
 575	xa_store_order(xa, 0, 1, xa_mk_value(0), GFP_KERNEL);
 576	XA_BUG_ON(xa, xa_load(xa, 0) != xa_mk_value(0));
 577	XA_BUG_ON(xa, xa_load(xa, 1) != xa_mk_value(0));
 578	XA_BUG_ON(xa, xa_load(xa, 2) != NULL);
 579	rcu_read_lock();
 580	XA_BUG_ON(xa, xa_to_node(xa_head(xa))->count != 2);
 581	XA_BUG_ON(xa, xa_to_node(xa_head(xa))->nr_values != 2);
 582	rcu_read_unlock();
 583
 584	/* Storing adjacent to the value does not alter the value */
 585	xa_store(xa, 3, xa, GFP_KERNEL);
 586	XA_BUG_ON(xa, xa_load(xa, 0) != xa_mk_value(0));
 587	XA_BUG_ON(xa, xa_load(xa, 1) != xa_mk_value(0));
 588	XA_BUG_ON(xa, xa_load(xa, 2) != NULL);
 589	rcu_read_lock();
 590	XA_BUG_ON(xa, xa_to_node(xa_head(xa))->count != 3);
 591	XA_BUG_ON(xa, xa_to_node(xa_head(xa))->nr_values != 2);
 592	rcu_read_unlock();
 593
 594	/* Overwriting multiple indexes works */
 595	xa_store_order(xa, 0, 2, xa_mk_value(1), GFP_KERNEL);
 596	XA_BUG_ON(xa, xa_load(xa, 0) != xa_mk_value(1));
 597	XA_BUG_ON(xa, xa_load(xa, 1) != xa_mk_value(1));
 598	XA_BUG_ON(xa, xa_load(xa, 2) != xa_mk_value(1));
 599	XA_BUG_ON(xa, xa_load(xa, 3) != xa_mk_value(1));
 600	XA_BUG_ON(xa, xa_load(xa, 4) != NULL);
 601	rcu_read_lock();
 602	XA_BUG_ON(xa, xa_to_node(xa_head(xa))->count != 4);
 603	XA_BUG_ON(xa, xa_to_node(xa_head(xa))->nr_values != 4);
 604	rcu_read_unlock();
 605
 606	/* We can erase multiple values with a single store */
 607	xa_store_order(xa, 0, BITS_PER_LONG - 1, NULL, GFP_KERNEL);
 608	XA_BUG_ON(xa, !xa_empty(xa));
 609
 610	/* Even when the first slot is empty but the others aren't */
 611	xa_store_index(xa, 1, GFP_KERNEL);
 612	xa_store_index(xa, 2, GFP_KERNEL);
 613	xa_store_order(xa, 0, 2, NULL, GFP_KERNEL);
 614	XA_BUG_ON(xa, !xa_empty(xa));
 615
 616	for (i = 0; i < max_order; i++) {
 617		for (j = 0; j < max_order; j++) {
 618			xa_store_order(xa, 0, i, xa_mk_index(i), GFP_KERNEL);
 619			xa_store_order(xa, 0, j, xa_mk_index(j), GFP_KERNEL);
 620
 621			for (k = 0; k < max_order; k++) {
 622				void *entry = xa_load(xa, (1UL << k) - 1);
 623				if ((i < k) && (j < k))
 624					XA_BUG_ON(xa, entry != NULL);
 625				else
 626					XA_BUG_ON(xa, entry != xa_mk_index(j));
 627			}
 628
 629			xa_erase(xa, 0);
 630			XA_BUG_ON(xa, !xa_empty(xa));
 631		}
 632	}
 633
 634	for (i = 0; i < 20; i++) {
 635		check_multi_store_1(xa, 200, i);
 636		check_multi_store_1(xa, 0, i);
 637		check_multi_store_1(xa, (1UL << i) + 1, i);
 638	}
 639	check_multi_store_2(xa, 4095, 9);
 640
 641	for (i = 1; i < 20; i++) {
 642		check_multi_store_3(xa, 0, i);
 643		check_multi_store_3(xa, 1UL << i, i);
 644	}
 645#endif
 646}
 647
 648static noinline void check_xa_alloc_1(struct xarray *xa, unsigned int base)
 649{
 650	int i;
 651	u32 id;
 652
 653	XA_BUG_ON(xa, !xa_empty(xa));
 654	/* An empty array should assign %base to the first alloc */
 655	xa_alloc_index(xa, base, GFP_KERNEL);
 656
 657	/* Erasing it should make the array empty again */
 658	xa_erase_index(xa, base);
 659	XA_BUG_ON(xa, !xa_empty(xa));
 660
 661	/* And it should assign %base again */
 662	xa_alloc_index(xa, base, GFP_KERNEL);
 663
 664	/* Allocating and then erasing a lot should not lose base */
 665	for (i = base + 1; i < 2 * XA_CHUNK_SIZE; i++)
 666		xa_alloc_index(xa, i, GFP_KERNEL);
 667	for (i = base; i < 2 * XA_CHUNK_SIZE; i++)
 668		xa_erase_index(xa, i);
 669	xa_alloc_index(xa, base, GFP_KERNEL);
 670
 671	/* Destroying the array should do the same as erasing */
 672	xa_destroy(xa);
 673
 674	/* And it should assign %base again */
 675	xa_alloc_index(xa, base, GFP_KERNEL);
 676
 677	/* The next assigned ID should be base+1 */
 678	xa_alloc_index(xa, base + 1, GFP_KERNEL);
 679	xa_erase_index(xa, base + 1);
 680
 681	/* Storing a value should mark it used */
 682	xa_store_index(xa, base + 1, GFP_KERNEL);
 683	xa_alloc_index(xa, base + 2, GFP_KERNEL);
 684
 685	/* If we then erase base, it should be free */
 686	xa_erase_index(xa, base);
 687	xa_alloc_index(xa, base, GFP_KERNEL);
 688
 689	xa_erase_index(xa, base + 1);
 690	xa_erase_index(xa, base + 2);
 691
 692	for (i = 1; i < 5000; i++) {
 693		xa_alloc_index(xa, base + i, GFP_KERNEL);
 694	}
 695
 696	xa_destroy(xa);
 697
 698	/* Check that we fail properly at the limit of allocation */
 699	XA_BUG_ON(xa, xa_alloc(xa, &id, xa_mk_index(UINT_MAX - 1),
 700				XA_LIMIT(UINT_MAX - 1, UINT_MAX),
 701				GFP_KERNEL) != 0);
 702	XA_BUG_ON(xa, id != 0xfffffffeU);
 703	XA_BUG_ON(xa, xa_alloc(xa, &id, xa_mk_index(UINT_MAX),
 704				XA_LIMIT(UINT_MAX - 1, UINT_MAX),
 705				GFP_KERNEL) != 0);
 706	XA_BUG_ON(xa, id != 0xffffffffU);
 707	id = 3;
 708	XA_BUG_ON(xa, xa_alloc(xa, &id, xa_mk_index(0),
 709				XA_LIMIT(UINT_MAX - 1, UINT_MAX),
 710				GFP_KERNEL) != -EBUSY);
 711	XA_BUG_ON(xa, id != 3);
 712	xa_destroy(xa);
 713
 714	XA_BUG_ON(xa, xa_alloc(xa, &id, xa_mk_index(10), XA_LIMIT(10, 5),
 715				GFP_KERNEL) != -EBUSY);
 716	XA_BUG_ON(xa, xa_store_index(xa, 3, GFP_KERNEL) != 0);
 717	XA_BUG_ON(xa, xa_alloc(xa, &id, xa_mk_index(10), XA_LIMIT(10, 5),
 718				GFP_KERNEL) != -EBUSY);
 719	xa_erase_index(xa, 3);
 720	XA_BUG_ON(xa, !xa_empty(xa));
 721}
 722
 723static noinline void check_xa_alloc_2(struct xarray *xa, unsigned int base)
 724{
 725	unsigned int i, id;
 726	unsigned long index;
 727	void *entry;
 728
 729	/* Allocate and free a NULL and check xa_empty() behaves */
 730	XA_BUG_ON(xa, !xa_empty(xa));
 731	XA_BUG_ON(xa, xa_alloc(xa, &id, NULL, xa_limit_32b, GFP_KERNEL) != 0);
 732	XA_BUG_ON(xa, id != base);
 733	XA_BUG_ON(xa, xa_empty(xa));
 734	XA_BUG_ON(xa, xa_erase(xa, id) != NULL);
 735	XA_BUG_ON(xa, !xa_empty(xa));
 736
 737	/* Ditto, but check destroy instead of erase */
 738	XA_BUG_ON(xa, !xa_empty(xa));
 739	XA_BUG_ON(xa, xa_alloc(xa, &id, NULL, xa_limit_32b, GFP_KERNEL) != 0);
 740	XA_BUG_ON(xa, id != base);
 741	XA_BUG_ON(xa, xa_empty(xa));
 742	xa_destroy(xa);
 743	XA_BUG_ON(xa, !xa_empty(xa));
 744
 745	for (i = base; i < base + 10; i++) {
 746		XA_BUG_ON(xa, xa_alloc(xa, &id, NULL, xa_limit_32b,
 747					GFP_KERNEL) != 0);
 748		XA_BUG_ON(xa, id != i);
 749	}
 750
 751	XA_BUG_ON(xa, xa_store(xa, 3, xa_mk_index(3), GFP_KERNEL) != NULL);
 752	XA_BUG_ON(xa, xa_store(xa, 4, xa_mk_index(4), GFP_KERNEL) != NULL);
 753	XA_BUG_ON(xa, xa_store(xa, 4, NULL, GFP_KERNEL) != xa_mk_index(4));
 754	XA_BUG_ON(xa, xa_erase(xa, 5) != NULL);
 755	XA_BUG_ON(xa, xa_alloc(xa, &id, NULL, xa_limit_32b, GFP_KERNEL) != 0);
 756	XA_BUG_ON(xa, id != 5);
 757
 758	xa_for_each(xa, index, entry) {
 759		xa_erase_index(xa, index);
 760	}
 761
 762	for (i = base; i < base + 9; i++) {
 763		XA_BUG_ON(xa, xa_erase(xa, i) != NULL);
 764		XA_BUG_ON(xa, xa_empty(xa));
 765	}
 766	XA_BUG_ON(xa, xa_erase(xa, 8) != NULL);
 767	XA_BUG_ON(xa, xa_empty(xa));
 768	XA_BUG_ON(xa, xa_erase(xa, base + 9) != NULL);
 769	XA_BUG_ON(xa, !xa_empty(xa));
 770
 771	xa_destroy(xa);
 772}
 773
 774static noinline void check_xa_alloc_3(struct xarray *xa, unsigned int base)
 775{
 776	struct xa_limit limit = XA_LIMIT(1, 0x3fff);
 777	u32 next = 0;
 778	unsigned int i, id;
 779	unsigned long index;
 780	void *entry;
 781
 782	XA_BUG_ON(xa, xa_alloc_cyclic(xa, &id, xa_mk_index(1), limit,
 783				&next, GFP_KERNEL) != 0);
 784	XA_BUG_ON(xa, id != 1);
 785
 786	next = 0x3ffd;
 787	XA_BUG_ON(xa, xa_alloc_cyclic(xa, &id, xa_mk_index(0x3ffd), limit,
 788				&next, GFP_KERNEL) != 0);
 789	XA_BUG_ON(xa, id != 0x3ffd);
 790	xa_erase_index(xa, 0x3ffd);
 791	xa_erase_index(xa, 1);
 792	XA_BUG_ON(xa, !xa_empty(xa));
 793
 794	for (i = 0x3ffe; i < 0x4003; i++) {
 795		if (i < 0x4000)
 796			entry = xa_mk_index(i);
 797		else
 798			entry = xa_mk_index(i - 0x3fff);
 799		XA_BUG_ON(xa, xa_alloc_cyclic(xa, &id, entry, limit,
 800					&next, GFP_KERNEL) != (id == 1));
 801		XA_BUG_ON(xa, xa_mk_index(id) != entry);
 802	}
 803
 804	/* Check wrap-around is handled correctly */
 805	if (base != 0)
 806		xa_erase_index(xa, base);
 807	xa_erase_index(xa, base + 1);
 808	next = UINT_MAX;
 809	XA_BUG_ON(xa, xa_alloc_cyclic(xa, &id, xa_mk_index(UINT_MAX),
 810				xa_limit_32b, &next, GFP_KERNEL) != 0);
 811	XA_BUG_ON(xa, id != UINT_MAX);
 812	XA_BUG_ON(xa, xa_alloc_cyclic(xa, &id, xa_mk_index(base),
 813				xa_limit_32b, &next, GFP_KERNEL) != 1);
 814	XA_BUG_ON(xa, id != base);
 815	XA_BUG_ON(xa, xa_alloc_cyclic(xa, &id, xa_mk_index(base + 1),
 816				xa_limit_32b, &next, GFP_KERNEL) != 0);
 817	XA_BUG_ON(xa, id != base + 1);
 818
 819	xa_for_each(xa, index, entry)
 820		xa_erase_index(xa, index);
 821
 822	XA_BUG_ON(xa, !xa_empty(xa));
 823}
 824
 825static DEFINE_XARRAY_ALLOC(xa0);
 826static DEFINE_XARRAY_ALLOC1(xa1);
 827
 828static noinline void check_xa_alloc(void)
 829{
 830	check_xa_alloc_1(&xa0, 0);
 831	check_xa_alloc_1(&xa1, 1);
 832	check_xa_alloc_2(&xa0, 0);
 833	check_xa_alloc_2(&xa1, 1);
 834	check_xa_alloc_3(&xa0, 0);
 835	check_xa_alloc_3(&xa1, 1);
 836}
 837
 838static noinline void __check_store_iter(struct xarray *xa, unsigned long start,
 839			unsigned int order, unsigned int present)
 840{
 841	XA_STATE_ORDER(xas, xa, start, order);
 842	void *entry;
 843	unsigned int count = 0;
 844
 845retry:
 846	xas_lock(&xas);
 847	xas_for_each_conflict(&xas, entry) {
 848		XA_BUG_ON(xa, !xa_is_value(entry));
 849		XA_BUG_ON(xa, entry < xa_mk_index(start));
 850		XA_BUG_ON(xa, entry > xa_mk_index(start + (1UL << order) - 1));
 851		count++;
 852	}
 853	xas_store(&xas, xa_mk_index(start));
 854	xas_unlock(&xas);
 855	if (xas_nomem(&xas, GFP_KERNEL)) {
 856		count = 0;
 857		goto retry;
 858	}
 859	XA_BUG_ON(xa, xas_error(&xas));
 860	XA_BUG_ON(xa, count != present);
 861	XA_BUG_ON(xa, xa_load(xa, start) != xa_mk_index(start));
 862	XA_BUG_ON(xa, xa_load(xa, start + (1UL << order) - 1) !=
 863			xa_mk_index(start));
 864	xa_erase_index(xa, start);
 865}
 866
 867static noinline void check_store_iter(struct xarray *xa)
 868{
 869	unsigned int i, j;
 870	unsigned int max_order = IS_ENABLED(CONFIG_XARRAY_MULTI) ? 20 : 1;
 871
 872	for (i = 0; i < max_order; i++) {
 873		unsigned int min = 1 << i;
 874		unsigned int max = (2 << i) - 1;
 875		__check_store_iter(xa, 0, i, 0);
 876		XA_BUG_ON(xa, !xa_empty(xa));
 877		__check_store_iter(xa, min, i, 0);
 878		XA_BUG_ON(xa, !xa_empty(xa));
 879
 880		xa_store_index(xa, min, GFP_KERNEL);
 881		__check_store_iter(xa, min, i, 1);
 882		XA_BUG_ON(xa, !xa_empty(xa));
 883		xa_store_index(xa, max, GFP_KERNEL);
 884		__check_store_iter(xa, min, i, 1);
 885		XA_BUG_ON(xa, !xa_empty(xa));
 886
 887		for (j = 0; j < min; j++)
 888			xa_store_index(xa, j, GFP_KERNEL);
 889		__check_store_iter(xa, 0, i, min);
 890		XA_BUG_ON(xa, !xa_empty(xa));
 891		for (j = 0; j < min; j++)
 892			xa_store_index(xa, min + j, GFP_KERNEL);
 893		__check_store_iter(xa, min, i, min);
 894		XA_BUG_ON(xa, !xa_empty(xa));
 895	}
 896#ifdef CONFIG_XARRAY_MULTI
 897	xa_store_index(xa, 63, GFP_KERNEL);
 898	xa_store_index(xa, 65, GFP_KERNEL);
 899	__check_store_iter(xa, 64, 2, 1);
 900	xa_erase_index(xa, 63);
 901#endif
 902	XA_BUG_ON(xa, !xa_empty(xa));
 903}
 904
 905static noinline void check_multi_find(struct xarray *xa)
 906{
 907#ifdef CONFIG_XARRAY_MULTI
 
 
 908	unsigned long index;
 909
 910	xa_store_order(xa, 12, 2, xa_mk_value(12), GFP_KERNEL);
 911	XA_BUG_ON(xa, xa_store_index(xa, 16, GFP_KERNEL) != NULL);
 
 912
 913	index = 0;
 914	XA_BUG_ON(xa, xa_find(xa, &index, ULONG_MAX, XA_PRESENT) !=
 915			xa_mk_value(12));
 916	XA_BUG_ON(xa, index != 12);
 917	index = 13;
 918	XA_BUG_ON(xa, xa_find(xa, &index, ULONG_MAX, XA_PRESENT) !=
 919			xa_mk_value(12));
 920	XA_BUG_ON(xa, (index < 12) || (index >= 16));
 921	XA_BUG_ON(xa, xa_find_after(xa, &index, ULONG_MAX, XA_PRESENT) !=
 922			xa_mk_value(16));
 923	XA_BUG_ON(xa, index != 16);
 924
 925	xa_erase_index(xa, 12);
 926	xa_erase_index(xa, 16);
 
 
 
 927	XA_BUG_ON(xa, !xa_empty(xa));
 928#endif
 929}
 930
 931static noinline void check_multi_find_2(struct xarray *xa)
 932{
 933	unsigned int max_order = IS_ENABLED(CONFIG_XARRAY_MULTI) ? 10 : 1;
 934	unsigned int i, j;
 935	void *entry;
 936
 937	for (i = 0; i < max_order; i++) {
 938		unsigned long index = 1UL << i;
 939		for (j = 0; j < index; j++) {
 940			XA_STATE(xas, xa, j + index);
 941			xa_store_index(xa, index - 1, GFP_KERNEL);
 942			xa_store_order(xa, index, i, xa_mk_index(index),
 943					GFP_KERNEL);
 944			rcu_read_lock();
 945			xas_for_each(&xas, entry, ULONG_MAX) {
 946				xa_erase_index(xa, index);
 947			}
 948			rcu_read_unlock();
 949			xa_erase_index(xa, index - 1);
 950			XA_BUG_ON(xa, !xa_empty(xa));
 951		}
 952	}
 953}
 954
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 955static noinline void check_find_1(struct xarray *xa)
 956{
 957	unsigned long i, j, k;
 958
 959	XA_BUG_ON(xa, !xa_empty(xa));
 960
 961	/*
 962	 * Check xa_find with all pairs between 0 and 99 inclusive,
 963	 * starting at every index between 0 and 99
 964	 */
 965	for (i = 0; i < 100; i++) {
 966		XA_BUG_ON(xa, xa_store_index(xa, i, GFP_KERNEL) != NULL);
 967		xa_set_mark(xa, i, XA_MARK_0);
 968		for (j = 0; j < i; j++) {
 969			XA_BUG_ON(xa, xa_store_index(xa, j, GFP_KERNEL) !=
 970					NULL);
 971			xa_set_mark(xa, j, XA_MARK_0);
 972			for (k = 0; k < 100; k++) {
 973				unsigned long index = k;
 974				void *entry = xa_find(xa, &index, ULONG_MAX,
 975								XA_PRESENT);
 976				if (k <= j)
 977					XA_BUG_ON(xa, index != j);
 978				else if (k <= i)
 979					XA_BUG_ON(xa, index != i);
 980				else
 981					XA_BUG_ON(xa, entry != NULL);
 982
 983				index = k;
 984				entry = xa_find(xa, &index, ULONG_MAX,
 985								XA_MARK_0);
 986				if (k <= j)
 987					XA_BUG_ON(xa, index != j);
 988				else if (k <= i)
 989					XA_BUG_ON(xa, index != i);
 990				else
 991					XA_BUG_ON(xa, entry != NULL);
 992			}
 993			xa_erase_index(xa, j);
 994			XA_BUG_ON(xa, xa_get_mark(xa, j, XA_MARK_0));
 995			XA_BUG_ON(xa, !xa_get_mark(xa, i, XA_MARK_0));
 996		}
 997		xa_erase_index(xa, i);
 998		XA_BUG_ON(xa, xa_get_mark(xa, i, XA_MARK_0));
 999	}
1000	XA_BUG_ON(xa, !xa_empty(xa));
1001}
1002
1003static noinline void check_find_2(struct xarray *xa)
1004{
1005	void *entry;
1006	unsigned long i, j, index;
1007
1008	xa_for_each(xa, index, entry) {
1009		XA_BUG_ON(xa, true);
1010	}
1011
1012	for (i = 0; i < 1024; i++) {
1013		xa_store_index(xa, index, GFP_KERNEL);
1014		j = 0;
1015		xa_for_each(xa, index, entry) {
1016			XA_BUG_ON(xa, xa_mk_index(index) != entry);
1017			XA_BUG_ON(xa, index != j++);
1018		}
1019	}
1020
1021	xa_destroy(xa);
1022}
1023
1024static noinline void check_find_3(struct xarray *xa)
1025{
1026	XA_STATE(xas, xa, 0);
1027	unsigned long i, j, k;
1028	void *entry;
1029
1030	for (i = 0; i < 100; i++) {
1031		for (j = 0; j < 100; j++) {
1032			rcu_read_lock();
1033			for (k = 0; k < 100; k++) {
1034				xas_set(&xas, j);
1035				xas_for_each_marked(&xas, entry, k, XA_MARK_0)
1036					;
1037				if (j > k)
1038					XA_BUG_ON(xa,
1039						xas.xa_node != XAS_RESTART);
1040			}
1041			rcu_read_unlock();
1042		}
1043		xa_store_index(xa, i, GFP_KERNEL);
1044		xa_set_mark(xa, i, XA_MARK_0);
1045	}
1046	xa_destroy(xa);
1047}
1048
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1049static noinline void check_find(struct xarray *xa)
1050{
 
 
1051	check_find_1(xa);
1052	check_find_2(xa);
1053	check_find_3(xa);
1054	check_multi_find(xa);
 
 
 
1055	check_multi_find_2(xa);
 
1056}
1057
1058/* See find_swap_entry() in mm/shmem.c */
1059static noinline unsigned long xa_find_entry(struct xarray *xa, void *item)
1060{
1061	XA_STATE(xas, xa, 0);
1062	unsigned int checked = 0;
1063	void *entry;
1064
1065	rcu_read_lock();
1066	xas_for_each(&xas, entry, ULONG_MAX) {
1067		if (xas_retry(&xas, entry))
1068			continue;
1069		if (entry == item)
1070			break;
1071		checked++;
1072		if ((checked % 4) != 0)
1073			continue;
1074		xas_pause(&xas);
1075	}
1076	rcu_read_unlock();
1077
1078	return entry ? xas.xa_index : -1;
1079}
1080
1081static noinline void check_find_entry(struct xarray *xa)
1082{
1083#ifdef CONFIG_XARRAY_MULTI
1084	unsigned int order;
1085	unsigned long offset, index;
1086
1087	for (order = 0; order < 20; order++) {
1088		for (offset = 0; offset < (1UL << (order + 3));
1089		     offset += (1UL << order)) {
1090			for (index = 0; index < (1UL << (order + 5));
1091			     index += (1UL << order)) {
1092				xa_store_order(xa, index, order,
1093						xa_mk_index(index), GFP_KERNEL);
1094				XA_BUG_ON(xa, xa_load(xa, index) !=
1095						xa_mk_index(index));
1096				XA_BUG_ON(xa, xa_find_entry(xa,
1097						xa_mk_index(index)) != index);
1098			}
1099			XA_BUG_ON(xa, xa_find_entry(xa, xa) != -1);
1100			xa_destroy(xa);
1101		}
1102	}
1103#endif
1104
1105	XA_BUG_ON(xa, xa_find_entry(xa, xa) != -1);
1106	xa_store_index(xa, ULONG_MAX, GFP_KERNEL);
1107	XA_BUG_ON(xa, xa_find_entry(xa, xa) != -1);
1108	XA_BUG_ON(xa, xa_find_entry(xa, xa_mk_index(ULONG_MAX)) != -1);
1109	xa_erase_index(xa, ULONG_MAX);
1110	XA_BUG_ON(xa, !xa_empty(xa));
1111}
1112
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1113static noinline void check_move_tiny(struct xarray *xa)
1114{
1115	XA_STATE(xas, xa, 0);
1116
1117	XA_BUG_ON(xa, !xa_empty(xa));
1118	rcu_read_lock();
1119	XA_BUG_ON(xa, xas_next(&xas) != NULL);
1120	XA_BUG_ON(xa, xas_next(&xas) != NULL);
1121	rcu_read_unlock();
1122	xa_store_index(xa, 0, GFP_KERNEL);
1123	rcu_read_lock();
1124	xas_set(&xas, 0);
1125	XA_BUG_ON(xa, xas_next(&xas) != xa_mk_index(0));
1126	XA_BUG_ON(xa, xas_next(&xas) != NULL);
1127	xas_set(&xas, 0);
1128	XA_BUG_ON(xa, xas_prev(&xas) != xa_mk_index(0));
1129	XA_BUG_ON(xa, xas_prev(&xas) != NULL);
1130	rcu_read_unlock();
1131	xa_erase_index(xa, 0);
1132	XA_BUG_ON(xa, !xa_empty(xa));
1133}
1134
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1135static noinline void check_move_small(struct xarray *xa, unsigned long idx)
1136{
1137	XA_STATE(xas, xa, 0);
1138	unsigned long i;
1139
1140	xa_store_index(xa, 0, GFP_KERNEL);
1141	xa_store_index(xa, idx, GFP_KERNEL);
1142
1143	rcu_read_lock();
1144	for (i = 0; i < idx * 4; i++) {
1145		void *entry = xas_next(&xas);
1146		if (i <= idx)
1147			XA_BUG_ON(xa, xas.xa_node == XAS_RESTART);
1148		XA_BUG_ON(xa, xas.xa_index != i);
1149		if (i == 0 || i == idx)
1150			XA_BUG_ON(xa, entry != xa_mk_index(i));
1151		else
1152			XA_BUG_ON(xa, entry != NULL);
1153	}
1154	xas_next(&xas);
1155	XA_BUG_ON(xa, xas.xa_index != i);
1156
1157	do {
1158		void *entry = xas_prev(&xas);
1159		i--;
1160		if (i <= idx)
1161			XA_BUG_ON(xa, xas.xa_node == XAS_RESTART);
1162		XA_BUG_ON(xa, xas.xa_index != i);
1163		if (i == 0 || i == idx)
1164			XA_BUG_ON(xa, entry != xa_mk_index(i));
1165		else
1166			XA_BUG_ON(xa, entry != NULL);
1167	} while (i > 0);
1168
1169	xas_set(&xas, ULONG_MAX);
1170	XA_BUG_ON(xa, xas_next(&xas) != NULL);
1171	XA_BUG_ON(xa, xas.xa_index != ULONG_MAX);
1172	XA_BUG_ON(xa, xas_next(&xas) != xa_mk_value(0));
1173	XA_BUG_ON(xa, xas.xa_index != 0);
1174	XA_BUG_ON(xa, xas_prev(&xas) != NULL);
1175	XA_BUG_ON(xa, xas.xa_index != ULONG_MAX);
1176	rcu_read_unlock();
1177
1178	xa_erase_index(xa, 0);
1179	xa_erase_index(xa, idx);
1180	XA_BUG_ON(xa, !xa_empty(xa));
1181}
1182
1183static noinline void check_move(struct xarray *xa)
1184{
1185	XA_STATE(xas, xa, (1 << 16) - 1);
1186	unsigned long i;
1187
1188	for (i = 0; i < (1 << 16); i++)
1189		XA_BUG_ON(xa, xa_store_index(xa, i, GFP_KERNEL) != NULL);
1190
1191	rcu_read_lock();
1192	do {
1193		void *entry = xas_prev(&xas);
1194		i--;
1195		XA_BUG_ON(xa, entry != xa_mk_index(i));
1196		XA_BUG_ON(xa, i != xas.xa_index);
1197	} while (i != 0);
1198
1199	XA_BUG_ON(xa, xas_prev(&xas) != NULL);
1200	XA_BUG_ON(xa, xas.xa_index != ULONG_MAX);
1201
1202	do {
1203		void *entry = xas_next(&xas);
1204		XA_BUG_ON(xa, entry != xa_mk_index(i));
1205		XA_BUG_ON(xa, i != xas.xa_index);
1206		i++;
1207	} while (i < (1 << 16));
1208	rcu_read_unlock();
1209
1210	for (i = (1 << 8); i < (1 << 15); i++)
1211		xa_erase_index(xa, i);
1212
1213	i = xas.xa_index;
1214
1215	rcu_read_lock();
1216	do {
1217		void *entry = xas_prev(&xas);
1218		i--;
1219		if ((i < (1 << 8)) || (i >= (1 << 15)))
1220			XA_BUG_ON(xa, entry != xa_mk_index(i));
1221		else
1222			XA_BUG_ON(xa, entry != NULL);
1223		XA_BUG_ON(xa, i != xas.xa_index);
1224	} while (i != 0);
1225
1226	XA_BUG_ON(xa, xas_prev(&xas) != NULL);
1227	XA_BUG_ON(xa, xas.xa_index != ULONG_MAX);
1228
1229	do {
1230		void *entry = xas_next(&xas);
1231		if ((i < (1 << 8)) || (i >= (1 << 15)))
1232			XA_BUG_ON(xa, entry != xa_mk_index(i));
1233		else
1234			XA_BUG_ON(xa, entry != NULL);
1235		XA_BUG_ON(xa, i != xas.xa_index);
1236		i++;
1237	} while (i < (1 << 16));
1238	rcu_read_unlock();
1239
1240	xa_destroy(xa);
1241
1242	check_move_tiny(xa);
 
1243
1244	for (i = 0; i < 16; i++)
1245		check_move_small(xa, 1UL << i);
1246
1247	for (i = 2; i < 16; i++)
1248		check_move_small(xa, (1UL << i) - 1);
1249}
1250
1251static noinline void xa_store_many_order(struct xarray *xa,
1252		unsigned long index, unsigned order)
1253{
1254	XA_STATE_ORDER(xas, xa, index, order);
1255	unsigned int i = 0;
1256
1257	do {
1258		xas_lock(&xas);
1259		XA_BUG_ON(xa, xas_find_conflict(&xas));
1260		xas_create_range(&xas);
1261		if (xas_error(&xas))
1262			goto unlock;
1263		for (i = 0; i < (1U << order); i++) {
1264			XA_BUG_ON(xa, xas_store(&xas, xa_mk_index(index + i)));
1265			xas_next(&xas);
1266		}
1267unlock:
1268		xas_unlock(&xas);
1269	} while (xas_nomem(&xas, GFP_KERNEL));
1270
1271	XA_BUG_ON(xa, xas_error(&xas));
1272}
1273
1274static noinline void check_create_range_1(struct xarray *xa,
1275		unsigned long index, unsigned order)
1276{
1277	unsigned long i;
1278
1279	xa_store_many_order(xa, index, order);
1280	for (i = index; i < index + (1UL << order); i++)
1281		xa_erase_index(xa, i);
1282	XA_BUG_ON(xa, !xa_empty(xa));
1283}
1284
1285static noinline void check_create_range_2(struct xarray *xa, unsigned order)
1286{
1287	unsigned long i;
1288	unsigned long nr = 1UL << order;
1289
1290	for (i = 0; i < nr * nr; i += nr)
1291		xa_store_many_order(xa, i, order);
1292	for (i = 0; i < nr * nr; i++)
1293		xa_erase_index(xa, i);
1294	XA_BUG_ON(xa, !xa_empty(xa));
1295}
1296
1297static noinline void check_create_range_3(void)
1298{
1299	XA_STATE(xas, NULL, 0);
1300	xas_set_err(&xas, -EEXIST);
1301	xas_create_range(&xas);
1302	XA_BUG_ON(NULL, xas_error(&xas) != -EEXIST);
1303}
1304
1305static noinline void check_create_range_4(struct xarray *xa,
1306		unsigned long index, unsigned order)
1307{
1308	XA_STATE_ORDER(xas, xa, index, order);
1309	unsigned long base = xas.xa_index;
1310	unsigned long i = 0;
1311
1312	xa_store_index(xa, index, GFP_KERNEL);
1313	do {
1314		xas_lock(&xas);
1315		xas_create_range(&xas);
1316		if (xas_error(&xas))
1317			goto unlock;
1318		for (i = 0; i < (1UL << order); i++) {
1319			void *old = xas_store(&xas, xa_mk_index(base + i));
1320			if (xas.xa_index == index)
1321				XA_BUG_ON(xa, old != xa_mk_index(base + i));
1322			else
1323				XA_BUG_ON(xa, old != NULL);
1324			xas_next(&xas);
1325		}
1326unlock:
1327		xas_unlock(&xas);
1328	} while (xas_nomem(&xas, GFP_KERNEL));
1329
1330	XA_BUG_ON(xa, xas_error(&xas));
1331
1332	for (i = base; i < base + (1UL << order); i++)
1333		xa_erase_index(xa, i);
1334	XA_BUG_ON(xa, !xa_empty(xa));
1335}
1336
1337static noinline void check_create_range(struct xarray *xa)
1338{
1339	unsigned int order;
1340	unsigned int max_order = IS_ENABLED(CONFIG_XARRAY_MULTI) ? 12 : 1;
1341
1342	for (order = 0; order < max_order; order++) {
1343		check_create_range_1(xa, 0, order);
1344		check_create_range_1(xa, 1U << order, order);
1345		check_create_range_1(xa, 2U << order, order);
1346		check_create_range_1(xa, 3U << order, order);
1347		check_create_range_1(xa, 1U << 24, order);
1348		if (order < 10)
1349			check_create_range_2(xa, order);
1350
1351		check_create_range_4(xa, 0, order);
1352		check_create_range_4(xa, 1U << order, order);
1353		check_create_range_4(xa, 2U << order, order);
1354		check_create_range_4(xa, 3U << order, order);
1355		check_create_range_4(xa, 1U << 24, order);
1356
1357		check_create_range_4(xa, 1, order);
1358		check_create_range_4(xa, (1U << order) + 1, order);
1359		check_create_range_4(xa, (2U << order) + 1, order);
1360		check_create_range_4(xa, (2U << order) - 1, order);
1361		check_create_range_4(xa, (3U << order) + 1, order);
1362		check_create_range_4(xa, (3U << order) - 1, order);
1363		check_create_range_4(xa, (1U << 24) + 1, order);
1364	}
1365
1366	check_create_range_3();
1367}
1368
1369static noinline void __check_store_range(struct xarray *xa, unsigned long first,
1370		unsigned long last)
1371{
1372#ifdef CONFIG_XARRAY_MULTI
1373	xa_store_range(xa, first, last, xa_mk_index(first), GFP_KERNEL);
1374
1375	XA_BUG_ON(xa, xa_load(xa, first) != xa_mk_index(first));
1376	XA_BUG_ON(xa, xa_load(xa, last) != xa_mk_index(first));
1377	XA_BUG_ON(xa, xa_load(xa, first - 1) != NULL);
1378	XA_BUG_ON(xa, xa_load(xa, last + 1) != NULL);
1379
1380	xa_store_range(xa, first, last, NULL, GFP_KERNEL);
1381#endif
1382
1383	XA_BUG_ON(xa, !xa_empty(xa));
1384}
1385
1386static noinline void check_store_range(struct xarray *xa)
1387{
1388	unsigned long i, j;
1389
1390	for (i = 0; i < 128; i++) {
1391		for (j = i; j < 128; j++) {
1392			__check_store_range(xa, i, j);
1393			__check_store_range(xa, 128 + i, 128 + j);
1394			__check_store_range(xa, 4095 + i, 4095 + j);
1395			__check_store_range(xa, 4096 + i, 4096 + j);
1396			__check_store_range(xa, 123456 + i, 123456 + j);
1397			__check_store_range(xa, (1 << 24) + i, (1 << 24) + j);
1398		}
1399	}
1400}
1401
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1402static void check_align_1(struct xarray *xa, char *name)
1403{
1404	int i;
1405	unsigned int id;
1406	unsigned long index;
1407	void *entry;
1408
1409	for (i = 0; i < 8; i++) {
1410		XA_BUG_ON(xa, xa_alloc(xa, &id, name + i, xa_limit_32b,
1411					GFP_KERNEL) != 0);
1412		XA_BUG_ON(xa, id != i);
1413	}
1414	xa_for_each(xa, index, entry)
1415		XA_BUG_ON(xa, xa_is_err(entry));
1416	xa_destroy(xa);
1417}
1418
1419/*
1420 * We should always be able to store without allocating memory after
1421 * reserving a slot.
1422 */
1423static void check_align_2(struct xarray *xa, char *name)
1424{
1425	int i;
1426
1427	XA_BUG_ON(xa, !xa_empty(xa));
1428
1429	for (i = 0; i < 8; i++) {
1430		XA_BUG_ON(xa, xa_store(xa, 0, name + i, GFP_KERNEL) != NULL);
1431		xa_erase(xa, 0);
1432	}
1433
1434	for (i = 0; i < 8; i++) {
1435		XA_BUG_ON(xa, xa_reserve(xa, 0, GFP_KERNEL) != 0);
1436		XA_BUG_ON(xa, xa_store(xa, 0, name + i, 0) != NULL);
1437		xa_erase(xa, 0);
1438	}
1439
1440	XA_BUG_ON(xa, !xa_empty(xa));
1441}
1442
1443static noinline void check_align(struct xarray *xa)
1444{
1445	char name[] = "Motorola 68000";
1446
1447	check_align_1(xa, name);
1448	check_align_1(xa, name + 1);
1449	check_align_1(xa, name + 2);
1450	check_align_1(xa, name + 3);
1451	check_align_2(xa, name);
1452}
1453
1454static LIST_HEAD(shadow_nodes);
1455
1456static void test_update_node(struct xa_node *node)
1457{
1458	if (node->count && node->count == node->nr_values) {
1459		if (list_empty(&node->private_list))
1460			list_add(&shadow_nodes, &node->private_list);
1461	} else {
1462		if (!list_empty(&node->private_list))
1463			list_del_init(&node->private_list);
1464	}
1465}
1466
1467static noinline void shadow_remove(struct xarray *xa)
1468{
1469	struct xa_node *node;
1470
1471	xa_lock(xa);
1472	while ((node = list_first_entry_or_null(&shadow_nodes,
1473					struct xa_node, private_list))) {
1474		XA_STATE(xas, node->array, 0);
1475		XA_BUG_ON(xa, node->array != xa);
1476		list_del_init(&node->private_list);
1477		xas.xa_node = xa_parent_locked(node->array, node);
1478		xas.xa_offset = node->offset;
1479		xas.xa_shift = node->shift + XA_CHUNK_SHIFT;
1480		xas_set_update(&xas, test_update_node);
1481		xas_store(&xas, NULL);
1482	}
1483	xa_unlock(xa);
1484}
1485
1486static noinline void check_workingset(struct xarray *xa, unsigned long index)
1487{
1488	XA_STATE(xas, xa, index);
1489	xas_set_update(&xas, test_update_node);
1490
1491	do {
1492		xas_lock(&xas);
1493		xas_store(&xas, xa_mk_value(0));
1494		xas_next(&xas);
1495		xas_store(&xas, xa_mk_value(1));
1496		xas_unlock(&xas);
1497	} while (xas_nomem(&xas, GFP_KERNEL));
1498
1499	XA_BUG_ON(xa, list_empty(&shadow_nodes));
1500
1501	xas_lock(&xas);
1502	xas_next(&xas);
1503	xas_store(&xas, &xas);
1504	XA_BUG_ON(xa, !list_empty(&shadow_nodes));
1505
1506	xas_store(&xas, xa_mk_value(2));
1507	xas_unlock(&xas);
1508	XA_BUG_ON(xa, list_empty(&shadow_nodes));
1509
1510	shadow_remove(xa);
1511	XA_BUG_ON(xa, !list_empty(&shadow_nodes));
1512	XA_BUG_ON(xa, !xa_empty(xa));
1513}
1514
1515/*
1516 * Check that the pointer / value / sibling entries are accounted the
1517 * way we expect them to be.
1518 */
1519static noinline void check_account(struct xarray *xa)
1520{
1521#ifdef CONFIG_XARRAY_MULTI
1522	unsigned int order;
1523
1524	for (order = 1; order < 12; order++) {
1525		XA_STATE(xas, xa, 1 << order);
1526
1527		xa_store_order(xa, 0, order, xa, GFP_KERNEL);
1528		rcu_read_lock();
1529		xas_load(&xas);
1530		XA_BUG_ON(xa, xas.xa_node->count == 0);
1531		XA_BUG_ON(xa, xas.xa_node->count > (1 << order));
1532		XA_BUG_ON(xa, xas.xa_node->nr_values != 0);
1533		rcu_read_unlock();
1534
1535		xa_store_order(xa, 1 << order, order, xa_mk_index(1UL << order),
1536				GFP_KERNEL);
1537		XA_BUG_ON(xa, xas.xa_node->count != xas.xa_node->nr_values * 2);
1538
1539		xa_erase(xa, 1 << order);
1540		XA_BUG_ON(xa, xas.xa_node->nr_values != 0);
1541
1542		xa_erase(xa, 0);
1543		XA_BUG_ON(xa, !xa_empty(xa));
1544	}
1545#endif
1546}
1547
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1548static noinline void check_destroy(struct xarray *xa)
1549{
1550	unsigned long index;
1551
1552	XA_BUG_ON(xa, !xa_empty(xa));
1553
1554	/* Destroying an empty array is a no-op */
1555	xa_destroy(xa);
1556	XA_BUG_ON(xa, !xa_empty(xa));
1557
1558	/* Destroying an array with a single entry */
1559	for (index = 0; index < 1000; index++) {
1560		xa_store_index(xa, index, GFP_KERNEL);
1561		XA_BUG_ON(xa, xa_empty(xa));
1562		xa_destroy(xa);
1563		XA_BUG_ON(xa, !xa_empty(xa));
1564	}
1565
1566	/* Destroying an array with a single entry at ULONG_MAX */
1567	xa_store(xa, ULONG_MAX, xa, GFP_KERNEL);
1568	XA_BUG_ON(xa, xa_empty(xa));
1569	xa_destroy(xa);
1570	XA_BUG_ON(xa, !xa_empty(xa));
1571
1572#ifdef CONFIG_XARRAY_MULTI
1573	/* Destroying an array with a multi-index entry */
1574	xa_store_order(xa, 1 << 11, 11, xa, GFP_KERNEL);
1575	XA_BUG_ON(xa, xa_empty(xa));
1576	xa_destroy(xa);
1577	XA_BUG_ON(xa, !xa_empty(xa));
1578#endif
1579}
1580
1581static DEFINE_XARRAY(array);
1582
1583static int xarray_checks(void)
1584{
1585	check_xa_err(&array);
1586	check_xas_retry(&array);
1587	check_xa_load(&array);
1588	check_xa_mark(&array);
1589	check_xa_shrink(&array);
1590	check_xas_erase(&array);
1591	check_insert(&array);
1592	check_cmpxchg(&array);
1593	check_reserve(&array);
1594	check_reserve(&xa0);
1595	check_multi_store(&array);
 
1596	check_xa_alloc();
1597	check_find(&array);
1598	check_find_entry(&array);
 
1599	check_account(&array);
1600	check_destroy(&array);
1601	check_move(&array);
1602	check_create_range(&array);
1603	check_store_range(&array);
1604	check_store_iter(&array);
1605	check_align(&xa0);
 
1606
1607	check_workingset(&array, 0);
1608	check_workingset(&array, 64);
1609	check_workingset(&array, 4096);
1610
1611	printk("XArray: %u of %u tests passed\n", tests_passed, tests_run);
1612	return (tests_run == tests_passed) ? 0 : -EINVAL;
1613}
1614
1615static void xarray_exit(void)
1616{
1617}
1618
1619module_init(xarray_checks);
1620module_exit(xarray_exit);
1621MODULE_AUTHOR("Matthew Wilcox <willy@infradead.org>");
1622MODULE_LICENSE("GPL");