lib/xarray: introduce a new helper xas_get_order
It can be used after xas_load to check the order of loaded entries. Compared to xa_get_order, it saves an XA_STATE and avoid a rewalk. Added new test for xas_get_order, to make the test work, we have to export xas_get_order with EXPORT_SYMBOL_GPL. Also fix a sparse warning by checking the slot value with xa_entry instead of accessing it directly, as suggested by Matthew Wilcox. [kasong@tencent.com: simplify comment, sparse warning fix, per Matthew Wilcox] Link: https://lkml.kernel.org/r/20240416071722.45997-4-ryncsn@gmail.com Link: https://lkml.kernel.org/r/20240415171857.19244-4-ryncsn@gmail.com Signed-off-by: Kairui Song <kasong@tencent.com> Cc: Matthew Wilcox (Oracle) <willy@infradead.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
b2ebcf9d3d
commit
a4864671ca
@@ -1984,6 +1984,39 @@ static noinline void check_get_order(struct xarray *xa)
|
||||
}
|
||||
}
|
||||
|
||||
static noinline void check_xas_get_order(struct xarray *xa)
|
||||
{
|
||||
XA_STATE(xas, xa, 0);
|
||||
|
||||
unsigned int max_order = IS_ENABLED(CONFIG_XARRAY_MULTI) ? 20 : 1;
|
||||
unsigned int order;
|
||||
unsigned long i, j;
|
||||
|
||||
for (order = 0; order < max_order; order++) {
|
||||
for (i = 0; i < 10; i++) {
|
||||
xas_set_order(&xas, i << order, order);
|
||||
do {
|
||||
xas_lock(&xas);
|
||||
xas_store(&xas, xa_mk_value(i));
|
||||
xas_unlock(&xas);
|
||||
} while (xas_nomem(&xas, GFP_KERNEL));
|
||||
|
||||
for (j = i << order; j < (i + 1) << order; j++) {
|
||||
xas_set_order(&xas, j, 0);
|
||||
rcu_read_lock();
|
||||
xas_load(&xas);
|
||||
XA_BUG_ON(xa, xas_get_order(&xas) != order);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
xas_lock(&xas);
|
||||
xas_set_order(&xas, i << order, order);
|
||||
xas_store(&xas, NULL);
|
||||
xas_unlock(&xas);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static noinline void check_destroy(struct xarray *xa)
|
||||
{
|
||||
unsigned long index;
|
||||
@@ -2035,6 +2068,7 @@ static int xarray_checks(void)
|
||||
check_multi_store(&array);
|
||||
check_multi_store_advanced(&array);
|
||||
check_get_order(&array);
|
||||
check_xas_get_order(&array);
|
||||
check_xa_alloc();
|
||||
check_find(&array);
|
||||
check_find_entry(&array);
|
||||
|
||||
Reference in New Issue
Block a user