mirror of
https://github.com/torvalds/linux
synced 2024-09-06 18:01:05 +00:00
XArray update for 5.18:
- Documentation update - Fix test-suite build after move of bitmap.h - Fix xas_create_range() when a large entry is already present - Fix xas_split() of a shadow entry -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEejHryeLBw/spnjHrDpNsjXcpgj4FAmJHBfoACgkQDpNsjXcp gj4eGggAlBsHZCBDT1wY45hQjaZA+GlI1Q7M8/x+MkaK3CN6O3FMdNcbUx/KVkMJ YItwoh9X5VywsMD4ASxPqT/3t2lJFV7ldNvwQpLr1eVSP34XsVxprYDgT09a/CXS JEwLoyy18FMCZJTWPdszGvazrtAaQmvEMwcz3Y9km93qVx5o+dvninGsKWfOuu+O b/+VIv0wHG0RfsXVrC10BfzMlqe50YMrLOWVrb66+XDdjtITeZ2M7PXRtsa5iOtG TDFzngSrOl59gqqhvDrhZOHY2S+wJnuCaXiG6w6rBLDRucZ5p2x4WWYeqtZGQlDk nLi6wMAp3fTt6+JlbXPtT01RHWZEyw== =xrXd -----END PGP SIGNATURE----- Merge tag 'xarray-5.18' of git://git.infradead.org/users/willy/xarray Pull XArray updates from Matthew Wilcox: - Documentation update - Fix test-suite build after move of bitmap.h - Fix xas_create_range() when a large entry is already present - Fix xas_split() of a shadow entry * tag 'xarray-5.18' of git://git.infradead.org/users/willy/xarray: XArray: Update the LRU list in xas_split() XArray: Fix xas_create_range() when multi-order entry present XArray: Include bitmap.h from xarray.h XArray: Document the locking requirement for the xa_state
This commit is contained in:
commit
5a3fe95d76
|
@ -315,11 +315,15 @@ indeed the normal API is implemented in terms of the advanced API. The
|
||||||
advanced API is only available to modules with a GPL-compatible license.
|
advanced API is only available to modules with a GPL-compatible license.
|
||||||
|
|
||||||
The advanced API is based around the xa_state. This is an opaque data
|
The advanced API is based around the xa_state. This is an opaque data
|
||||||
structure which you declare on the stack using the XA_STATE()
|
structure which you declare on the stack using the XA_STATE() macro.
|
||||||
macro. This macro initialises the xa_state ready to start walking
|
This macro initialises the xa_state ready to start walking around the
|
||||||
around the XArray. It is used as a cursor to maintain the position
|
XArray. It is used as a cursor to maintain the position in the XArray
|
||||||
in the XArray and let you compose various operations together without
|
and let you compose various operations together without having to restart
|
||||||
having to restart from the top every time.
|
from the top every time. The contents of the xa_state are protected by
|
||||||
|
the rcu_read_lock() or the xas_lock(). If you need to drop whichever of
|
||||||
|
those locks is protecting your state and tree, you must call xas_pause()
|
||||||
|
so that future calls do not rely on the parts of the state which were
|
||||||
|
left unprotected.
|
||||||
|
|
||||||
The xa_state is also used to store errors. You can call
|
The xa_state is also used to store errors. You can call
|
||||||
xas_error() to retrieve the error. All operations check whether
|
xas_error() to retrieve the error. All operations check whether
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
* See Documentation/core-api/xarray.rst for how to use the XArray.
|
* See Documentation/core-api/xarray.rst for how to use the XArray.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/bitmap.h>
|
||||||
#include <linux/bug.h>
|
#include <linux/bug.h>
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
#include <linux/gfp.h>
|
#include <linux/gfp.h>
|
||||||
|
|
|
@ -1463,6 +1463,25 @@ static noinline void check_create_range_4(struct xarray *xa,
|
||||||
XA_BUG_ON(xa, !xa_empty(xa));
|
XA_BUG_ON(xa, !xa_empty(xa));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static noinline void check_create_range_5(struct xarray *xa,
|
||||||
|
unsigned long index, unsigned int order)
|
||||||
|
{
|
||||||
|
XA_STATE_ORDER(xas, xa, index, order);
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
xa_store_order(xa, index, order, xa_mk_index(index), GFP_KERNEL);
|
||||||
|
|
||||||
|
for (i = 0; i < order + 10; i++) {
|
||||||
|
do {
|
||||||
|
xas_lock(&xas);
|
||||||
|
xas_create_range(&xas);
|
||||||
|
xas_unlock(&xas);
|
||||||
|
} while (xas_nomem(&xas, GFP_KERNEL));
|
||||||
|
}
|
||||||
|
|
||||||
|
xa_destroy(xa);
|
||||||
|
}
|
||||||
|
|
||||||
static noinline void check_create_range(struct xarray *xa)
|
static noinline void check_create_range(struct xarray *xa)
|
||||||
{
|
{
|
||||||
unsigned int order;
|
unsigned int order;
|
||||||
|
@ -1490,6 +1509,9 @@ static noinline void check_create_range(struct xarray *xa)
|
||||||
check_create_range_4(xa, (3U << order) + 1, order);
|
check_create_range_4(xa, (3U << order) + 1, order);
|
||||||
check_create_range_4(xa, (3U << order) - 1, order);
|
check_create_range_4(xa, (3U << order) - 1, order);
|
||||||
check_create_range_4(xa, (1U << 24) + 1, order);
|
check_create_range_4(xa, (1U << 24) + 1, order);
|
||||||
|
|
||||||
|
check_create_range_5(xa, 0, order);
|
||||||
|
check_create_range_5(xa, (1U << order), order);
|
||||||
}
|
}
|
||||||
|
|
||||||
check_create_range_3();
|
check_create_range_3();
|
||||||
|
|
|
@ -722,6 +722,8 @@ void xas_create_range(struct xa_state *xas)
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
struct xa_node *node = xas->xa_node;
|
struct xa_node *node = xas->xa_node;
|
||||||
|
if (node->shift >= shift)
|
||||||
|
break;
|
||||||
xas->xa_node = xa_parent_locked(xas->xa, node);
|
xas->xa_node = xa_parent_locked(xas->xa, node);
|
||||||
xas->xa_offset = node->offset - 1;
|
xas->xa_offset = node->offset - 1;
|
||||||
if (node->offset != 0)
|
if (node->offset != 0)
|
||||||
|
@ -1079,6 +1081,7 @@ void xas_split(struct xa_state *xas, void *entry, unsigned int order)
|
||||||
xa_mk_node(child));
|
xa_mk_node(child));
|
||||||
if (xa_is_value(curr))
|
if (xa_is_value(curr))
|
||||||
values--;
|
values--;
|
||||||
|
xas_update(xas, child);
|
||||||
} else {
|
} else {
|
||||||
unsigned int canon = offset - xas->xa_sibs;
|
unsigned int canon = offset - xas->xa_sibs;
|
||||||
|
|
||||||
|
@ -1093,6 +1096,7 @@ void xas_split(struct xa_state *xas, void *entry, unsigned int order)
|
||||||
} while (offset-- > xas->xa_offset);
|
} while (offset-- > xas->xa_offset);
|
||||||
|
|
||||||
node->nr_values += values;
|
node->nr_values += values;
|
||||||
|
xas_update(xas, node);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(xas_split);
|
EXPORT_SYMBOL_GPL(xas_split);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue