88 lines
1.8 KiB
C
88 lines
1.8 KiB
C
|
// SPDX-License-Identifier: GPL-2.0+
|
||
|
/*
|
||
|
* test_xarray.c: Test the XArray API
|
||
|
* Copyright (c) 2017-2018 Microsoft Corporation
|
||
|
* Author: Matthew Wilcox <willy@infradead.org>
|
||
|
*/
|
||
|
|
||
|
#include <linux/xarray.h>
|
||
|
#include <linux/module.h>
|
||
|
|
||
|
static unsigned int tests_run;
|
||
|
static unsigned int tests_passed;
|
||
|
|
||
|
#ifndef XA_DEBUG
|
||
|
# ifdef __KERNEL__
|
||
|
void xa_dump(const struct xarray *xa) { }
|
||
|
# endif
|
||
|
#undef XA_BUG_ON
|
||
|
#define XA_BUG_ON(xa, x) do { \
|
||
|
tests_run++; \
|
||
|
if (x) { \
|
||
|
printk("BUG at %s:%d\n", __func__, __LINE__); \
|
||
|
xa_dump(xa); \
|
||
|
dump_stack(); \
|
||
|
} else { \
|
||
|
tests_passed++; \
|
||
|
} \
|
||
|
} while (0)
|
||
|
#endif
|
||
|
|
||
|
static void *xa_store_index(struct xarray *xa, unsigned long index, gfp_t gfp)
|
||
|
{
|
||
|
radix_tree_insert(xa, index, xa_mk_value(index));
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
static void xa_erase_index(struct xarray *xa, unsigned long index)
|
||
|
{
|
||
|
radix_tree_delete(xa, index);
|
||
|
}
|
||
|
|
||
|
static noinline void check_xa_load(struct xarray *xa)
|
||
|
{
|
||
|
unsigned long i, j;
|
||
|
|
||
|
for (i = 0; i < 1024; i++) {
|
||
|
for (j = 0; j < 1024; j++) {
|
||
|
void *entry = xa_load(xa, j);
|
||
|
if (j < i)
|
||
|
XA_BUG_ON(xa, xa_to_value(entry) != j);
|
||
|
else
|
||
|
XA_BUG_ON(xa, entry);
|
||
|
}
|
||
|
XA_BUG_ON(xa, xa_store_index(xa, i, GFP_KERNEL) != NULL);
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < 1024; i++) {
|
||
|
for (j = 0; j < 1024; j++) {
|
||
|
void *entry = xa_load(xa, j);
|
||
|
if (j >= i)
|
||
|
XA_BUG_ON(xa, xa_to_value(entry) != j);
|
||
|
else
|
||
|
XA_BUG_ON(xa, entry);
|
||
|
}
|
||
|
xa_erase_index(xa, i);
|
||
|
}
|
||
|
XA_BUG_ON(xa, !xa_empty(xa));
|
||
|
}
|
||
|
|
||
|
static RADIX_TREE(array, GFP_KERNEL);
|
||
|
|
||
|
static int xarray_checks(void)
|
||
|
{
|
||
|
check_xa_load(&array);
|
||
|
|
||
|
printk("XArray: %u of %u tests passed\n", tests_passed, tests_run);
|
||
|
return (tests_run == tests_passed) ? 0 : -EINVAL;
|
||
|
}
|
||
|
|
||
|
static void xarray_exit(void)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
module_init(xarray_checks);
|
||
|
module_exit(xarray_exit);
|
||
|
MODULE_AUTHOR("Matthew Wilcox <willy@infradead.org>");
|
||
|
MODULE_LICENSE("GPL");
|