Lines Matching refs:xa
18 * @xa is used to refer to the entire xarray.
31 static inline unsigned int xa_lock_type(const struct xarray *xa)
33 return (__force unsigned int)xa->xa_flags & 3;
56 static inline bool xa_track_free(const struct xarray *xa)
58 return xa->xa_flags & XA_FLAGS_TRACK_FREE;
61 static inline bool xa_zero_busy(const struct xarray *xa)
63 return xa->xa_flags & XA_FLAGS_ZERO_BUSY;
66 static inline void xa_mark_set(struct xarray *xa, xa_mark_t mark)
68 if (!(xa->xa_flags & XA_FLAGS_MARK(mark)))
69 xa->xa_flags |= XA_FLAGS_MARK(mark);
72 static inline void xa_mark_clear(struct xarray *xa, xa_mark_t mark)
74 if (xa->xa_flags & XA_FLAGS_MARK(mark))
75 xa->xa_flags &= ~(XA_FLAGS_MARK(mark));
188 entry = xa_head(xas->xa);
204 void *entry = xa_entry(xas->xa, node, offset);
209 entry = xa_entry(xas->xa, node, offset);
303 if (xas->xa->xa_flags & XA_FLAGS_ACCOUNT)
325 __must_hold(xas->xa->xa_lock)
327 unsigned int lock_type = xa_lock_type(xas->xa);
333 if (xas->xa->xa_flags & XA_FLAGS_ACCOUNT)
371 if (xas->xa->xa_flags & XA_FLAGS_ACCOUNT)
393 node->array = xas->xa;
438 struct xarray *xa = xas->xa;
447 entry = xa_entry_locked(xa, node, 0);
452 if (xa_is_zero(entry) && xa_zero_busy(xa))
456 RCU_INIT_POINTER(xa->xa_head, entry);
457 if (xa_track_free(xa) && !node_get_mark(node, 0, XA_FREE_MARK))
458 xa_mark_clear(xa, XA_FREE_MARK);
477 * Attempts to delete the @xas->xa_node. This will fail if xa->node has
491 parent = xa_parent_locked(xas->xa, node);
497 xas->xa->xa_head = NULL;
528 void *entry = xa_entry_locked(xas->xa, node, offset);
541 parent = xa_parent_locked(xas->xa, node);
560 struct xarray *xa = xas->xa;
592 if (xa_track_free(xa) && mark == XA_FREE_MARK) {
594 if (!xa_marked(xa, XA_FREE_MARK)) {
596 xa_mark_set(xa, XA_FREE_MARK);
598 } else if (xa_marked(xa, mark)) {
615 rcu_assign_pointer(xa->xa_head, head);
640 struct xarray *xa = xas->xa;
648 entry = xa_head_locked(xa);
650 if (!entry && xa_zero_busy(xa))
657 entry = xa_head_locked(xa);
658 slot = &xa->xa_head;
665 entry = xa_entry_locked(xa, node, offset);
669 entry = xa_head_locked(xa);
670 slot = &xa->xa_head;
679 if (xa_track_free(xa))
727 xas->xa_node = xa_parent_locked(xas->xa, node);
777 void __rcu **slot = &xas->xa->xa_head;
834 next = xa_entry_locked(xas->xa, node, ++offset);
861 return xa_marked(xas->xa, mark);
887 node = xa_parent_locked(xas->xa, node);
890 if (!xa_marked(xas->xa, mark))
891 xa_mark_set(xas->xa, mark);
919 node = xa_parent_locked(xas->xa, node);
922 if (xa_marked(xas->xa, mark))
923 xa_mark_clear(xas->xa, mark);
943 if (xa_track_free(xas->xa) && mark == XA_FREE_MARK)
1022 node->array = xas->xa;
1129 if (!xa_is_sibling(xa_entry(xas->xa, node, offset)))
1164 xas->xa_node = xa_parent(xas->xa, xas->xa_node);
1170 entry = xa_entry(xas->xa, xas->xa_node, xas->xa_offset);
1203 xas->xa_node = xa_parent(xas->xa, xas->xa_node);
1209 entry = xa_entry(xas->xa, xas->xa_node, xas->xa_offset);
1261 xas->xa_node = xa_parent(xas->xa, xas->xa_node);
1265 entry = xa_entry(xas->xa, xas->xa_node, xas->xa_offset);
1320 entry = xa_head(xas->xa);
1325 if (xa_marked(xas->xa, mark))
1337 xas->xa_node = xa_parent(xas->xa, xas->xa_node);
1345 entry = xa_entry(xas->xa, xas->xa_node, xas->xa_offset);
1364 entry = xa_entry(xas->xa, xas->xa_node, xas->xa_offset);
1365 if (!entry && !(xa_track_free(xas->xa) && mark == XA_FREE_MARK))
1423 xas->xa_node = xa_parent_locked(xas->xa, xas->xa_node);
1428 curr = xa_entry_locked(xas->xa, xas->xa_node, ++xas->xa_offset);
1434 curr = xa_entry_locked(xas->xa, xas->xa_node, 0);
1446 * @xa: XArray.
1450 * Return: The entry at @index in @xa.
1452 void *xa_load(struct xarray *xa, unsigned long index)
1454 XA_STATE(xas, xa, index);
1480 * @xa: XArray.
1490 void *__xa_erase(struct xarray *xa, unsigned long index)
1492 XA_STATE(xas, xa, index);
1499 * @xa: XArray.
1509 void *xa_erase(struct xarray *xa, unsigned long index)
1513 xa_lock(xa);
1514 entry = __xa_erase(xa, index);
1515 xa_unlock(xa);
1523 * @xa: XArray.
1536 void *__xa_store(struct xarray *xa, unsigned long index, void *entry, gfp_t gfp)
1538 XA_STATE(xas, xa, index);
1543 if (xa_track_free(xa) && !entry)
1548 if (xa_track_free(xa))
1558 * @xa: XArray.
1573 void *xa_store(struct xarray *xa, unsigned long index, void *entry, gfp_t gfp)
1577 xa_lock(xa);
1578 curr = __xa_store(xa, index, entry, gfp);
1579 xa_unlock(xa);
1587 * @xa: XArray.
1601 void *__xa_cmpxchg(struct xarray *xa, unsigned long index,
1604 XA_STATE(xas, xa, index);
1614 if (xa_track_free(xa) && entry && !curr)
1625 * @xa: XArray.
1639 int __xa_insert(struct xarray *xa, unsigned long index, void *entry, gfp_t gfp)
1641 XA_STATE(xas, xa, index);
1653 if (xa_track_free(xa))
1698 * @xa: XArray.
1714 void *xa_store_range(struct xarray *xa, unsigned long first,
1717 XA_STATE(xas, xa, 0);
1752 * @xa: XArray.
1757 int xa_get_order(struct xarray *xa, unsigned long index)
1759 XA_STATE(xas, xa, index);
1793 * @xa: XArray.
1799 * Finds an empty entry in @xa between @limit.min and @limit.max,
1808 int __xa_alloc(struct xarray *xa, u32 *id, void *entry,
1811 XA_STATE(xas, xa, 0);
1815 if (WARN_ON_ONCE(!xa_track_free(xa)))
1838 * @xa: XArray.
1845 * Finds an empty entry in @xa between @limit.min and @limit.max,
1857 int __xa_alloc_cyclic(struct xarray *xa, u32 *id, void *entry,
1864 ret = __xa_alloc(xa, id, entry, limit, gfp);
1865 if ((xa->xa_flags & XA_FLAGS_ALLOC_WRAPPED) && ret == 0) {
1866 xa->xa_flags &= ~XA_FLAGS_ALLOC_WRAPPED;
1872 ret = __xa_alloc(xa, id, entry, limit, gfp);
1880 xa->xa_flags |= XA_FLAGS_ALLOC_WRAPPED;
1888 * @xa: XArray.
1896 void __xa_set_mark(struct xarray *xa, unsigned long index, xa_mark_t mark)
1898 XA_STATE(xas, xa, index);
1908 * @xa: XArray.
1914 void __xa_clear_mark(struct xarray *xa, unsigned long index, xa_mark_t mark)
1916 XA_STATE(xas, xa, index);
1926 * @xa: XArray.
1936 bool xa_get_mark(struct xarray *xa, unsigned long index, xa_mark_t mark)
1938 XA_STATE(xas, xa, index);
1958 * @xa: XArray.
1966 void xa_set_mark(struct xarray *xa, unsigned long index, xa_mark_t mark)
1968 xa_lock(xa);
1969 __xa_set_mark(xa, index, mark);
1970 xa_unlock(xa);
1976 * @xa: XArray.
1984 void xa_clear_mark(struct xarray *xa, unsigned long index, xa_mark_t mark)
1986 xa_lock(xa);
1987 __xa_clear_mark(xa, index, mark);
1988 xa_unlock(xa);
1994 * @xa: XArray.
1999 * Finds the entry in @xa which matches the @filter, and has the lowest
2009 void *xa_find(struct xarray *xa, unsigned long *indexp,
2012 XA_STATE(xas, xa, *indexp);
2044 * @xa: XArray.
2049 * Finds the entry in @xa which matches the @filter and has the lowest
2059 void *xa_find_after(struct xarray *xa, unsigned long *indexp,
2062 XA_STATE(xas, xa, *indexp + 1);
2130 * @xa: The source XArray to copy from.
2156 unsigned int xa_extract(struct xarray *xa, void **dst, unsigned long start,
2159 XA_STATE(xas, xa, start);
2180 .xa = node->array,
2195 * @xa: XArray.
2203 void xa_destroy(struct xarray *xa)
2205 XA_STATE(xas, xa, 0);
2211 entry = xa_head_locked(xa);
2212 RCU_INIT_POINTER(xa->xa_head, NULL);
2214 if (xa_zero_busy(xa))
2215 xa_mark_clear(xa, XA_FREE_MARK);
2289 void xa_dump(const struct xarray *xa)
2291 void *entry = xa->xa_head;
2294 pr_info("xarray: %px head %px flags %x marks %d %d %d\n", xa, entry,
2295 xa->xa_flags, xa_marked(xa, XA_MARK_0),
2296 xa_marked(xa, XA_MARK_1), xa_marked(xa, XA_MARK_2));