mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-28 16:52:18 +00:00
xarray: extract xa_zero_to_null
Patch series "xarray: extract __xa_cmpxchg_raw". This series reduces duplication between __xa_cmpxchg and __xa_insert by extracting a new function that does not coerce zero entries to null on the return path. The new function may be used by the upcoming Rust xarray abstraction in its reservation API where it is useful to tell the difference between zero entries and null slots. This patch (of 2): Reduce code duplication by extracting a static inline function that returns its argument if it is non-zero and NULL otherwise. This changes xas_result to check for errors before checking for zero but this cannot change the behavior of existing callers: - __xa_erase: passes the result of xas_store(_, NULL) which cannot fail. - __xa_store: passes the result of xas_store(_, entry) which may fail. xas_store calls xas_create when entry is not NULL which returns NULL on error, which is immediately checked. This should not change observable behavior. - __xa_cmpxchg: passes the result of xas_load(_) which might be zero. This would previously return NULL regardless of the outcome of xas_store but xas_store cannot fail if xas_load returns zero because there is no need to allocate memory. - xa_store_range: same as __xa_erase. Link: https://lkml.kernel.org/r/20241112-xarray-insert-cmpxchg-v1-0-dc2bdd8c4136@gmail.com Link: https://lkml.kernel.org/r/20241112-xarray-insert-cmpxchg-v1-1-dc2bdd8c4136@gmail.com Signed-off-by: Tamir Duberstein <tamird@gmail.com> Cc: Alice Ryhl <aliceryhl@google.com> Cc: Andreas Hindborg <a.hindborg@kernel.org> Cc: Matthew Wilcox <willy@infradead.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
6565e7e8e8
commit
d208efb688
17
lib/xarray.c
17
lib/xarray.c
@ -435,6 +435,11 @@ static unsigned long max_index(void *entry)
|
||||
return (XA_CHUNK_SIZE << xa_to_node(entry)->shift) - 1;
|
||||
}
|
||||
|
||||
static inline void *xa_zero_to_null(void *entry)
|
||||
{
|
||||
return xa_is_zero(entry) ? NULL : entry;
|
||||
}
|
||||
|
||||
static void xas_shrink(struct xa_state *xas)
|
||||
{
|
||||
struct xarray *xa = xas->xa;
|
||||
@ -451,8 +456,8 @@ static void xas_shrink(struct xa_state *xas)
|
||||
break;
|
||||
if (!xa_is_node(entry) && node->shift)
|
||||
break;
|
||||
if (xa_is_zero(entry) && xa_zero_busy(xa))
|
||||
entry = NULL;
|
||||
if (xa_zero_busy(xa))
|
||||
entry = xa_zero_to_null(entry);
|
||||
xas->xa_node = XAS_BOUNDS;
|
||||
|
||||
RCU_INIT_POINTER(xa->xa_head, entry);
|
||||
@ -1474,9 +1479,7 @@ void *xa_load(struct xarray *xa, unsigned long index)
|
||||
|
||||
rcu_read_lock();
|
||||
do {
|
||||
entry = xas_load(&xas);
|
||||
if (xa_is_zero(entry))
|
||||
entry = NULL;
|
||||
entry = xa_zero_to_null(xas_load(&xas));
|
||||
} while (xas_retry(&xas, entry));
|
||||
rcu_read_unlock();
|
||||
|
||||
@ -1486,11 +1489,9 @@ EXPORT_SYMBOL(xa_load);
|
||||
|
||||
static void *xas_result(struct xa_state *xas, void *curr)
|
||||
{
|
||||
if (xa_is_zero(curr))
|
||||
return NULL;
|
||||
if (xas_error(xas))
|
||||
curr = xas->xa_node;
|
||||
return curr;
|
||||
return xa_zero_to_null(curr);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user