Lines Matching refs:xa
20 * @xa is used to refer to the entire xarray.
33 static inline unsigned int xa_lock_type(const struct xarray *xa)
35 return (__force unsigned int)xa->xa_flags & 3;
58 static inline bool xa_track_free(const struct xarray *xa)
60 return xa->xa_flags & XA_FLAGS_TRACK_FREE;
63 static inline bool xa_zero_busy(const struct xarray *xa)
65 return xa->xa_flags & XA_FLAGS_ZERO_BUSY;
68 static inline void xa_mark_set(struct xarray *xa, xa_mark_t mark)
70 if (!(xa->xa_flags & XA_FLAGS_MARK(mark)))
71 xa->xa_flags |= XA_FLAGS_MARK(mark);
74 static inline void xa_mark_clear(struct xarray *xa, xa_mark_t mark)
76 if (xa->xa_flags & XA_FLAGS_MARK(mark))
77 xa->xa_flags &= ~(XA_FLAGS_MARK(mark));
190 entry = xa_head(xas->xa);
206 void *entry = xa_entry(xas->xa, node, offset);
211 entry = xa_entry(xas->xa, node, offset);
304 if (xas->xa->xa_flags & XA_FLAGS_ACCOUNT)
326 __must_hold(xas->xa->xa_lock)
328 unsigned int lock_type = xa_lock_type(xas->xa);
334 if (xas->xa->xa_flags & XA_FLAGS_ACCOUNT)
372 if (xas->xa->xa_flags & XA_FLAGS_ACCOUNT)
394 node->array = xas->xa;
439 struct xarray *xa = xas->xa;
448 entry = xa_entry_locked(xa, node, 0);
453 if (xa_is_zero(entry) && xa_zero_busy(xa))
457 RCU_INIT_POINTER(xa->xa_head, entry);
458 if (xa_track_free(xa) && !node_get_mark(node, 0, XA_FREE_MARK))
459 xa_mark_clear(xa, XA_FREE_MARK);
478 * Attempts to delete the @xas->xa_node. This will fail if xa->node has
492 parent = xa_parent_locked(xas->xa, node);
498 xas->xa->xa_head = NULL;
529 void *entry = xa_entry_locked(xas->xa, node, offset);
542 parent = xa_parent_locked(xas->xa, node);
561 struct xarray *xa = xas->xa;
593 if (xa_track_free(xa) && mark == XA_FREE_MARK) {
595 if (!xa_marked(xa, XA_FREE_MARK)) {
597 xa_mark_set(xa, XA_FREE_MARK);
599 } else if (xa_marked(xa, mark)) {
616 rcu_assign_pointer(xa->xa_head, head);
641 struct xarray *xa = xas->xa;
649 entry = xa_head_locked(xa);
651 if (!entry && xa_zero_busy(xa))
658 entry = xa_head_locked(xa);
659 slot = &xa->xa_head;
666 entry = xa_entry_locked(xa, node, offset);
670 entry = xa_head_locked(xa);
671 slot = &xa->xa_head;
680 if (xa_track_free(xa))
728 xas->xa_node = xa_parent_locked(xas->xa, node);
778 void __rcu **slot = &xas->xa->xa_head;
835 next = xa_entry_locked(xas->xa, node, ++offset);
862 return xa_marked(xas->xa, mark);
888 node = xa_parent_locked(xas->xa, node);
891 if (!xa_marked(xas->xa, mark))
892 xa_mark_set(xas->xa, mark);
920 node = xa_parent_locked(xas->xa, node);
923 if (xa_marked(xas->xa, mark))
924 xa_mark_clear(xas->xa, mark);
944 if (xa_track_free(xas->xa) && mark == XA_FREE_MARK)
1023 node->array = xas->xa;
1131 if (!xa_is_sibling(xa_entry(xas->xa, node, offset)))
1166 xas->xa_node = xa_parent(xas->xa, xas->xa_node);
1172 entry = xa_entry(xas->xa, xas->xa_node, xas->xa_offset);
1205 xas->xa_node = xa_parent(xas->xa, xas->xa_node);
1211 entry = xa_entry(xas->xa, xas->xa_node, xas->xa_offset);
1263 xas->xa_node = xa_parent(xas->xa, xas->xa_node);
1267 entry = xa_entry(xas->xa, xas->xa_node, xas->xa_offset);
1322 entry = xa_head(xas->xa);
1327 if (xa_marked(xas->xa, mark))
1339 xas->xa_node = xa_parent(xas->xa, xas->xa_node);
1347 entry = xa_entry(xas->xa, xas->xa_node, xas->xa_offset);
1366 entry = xa_entry(xas->xa, xas->xa_node, xas->xa_offset);
1367 if (!entry && !(xa_track_free(xas->xa) && mark == XA_FREE_MARK))
1425 xas->xa_node = xa_parent_locked(xas->xa, xas->xa_node);
1430 curr = xa_entry_locked(xas->xa, xas->xa_node, ++xas->xa_offset);
1436 curr = xa_entry_locked(xas->xa, xas->xa_node, 0);
1448 * @xa: XArray.
1452 * Return: The entry at @index in @xa.
1454 void *xa_load(struct xarray *xa, unsigned long index)
1456 XA_STATE(xas, xa, index);
1482 * @xa: XArray.
1492 void *__xa_erase(struct xarray *xa, unsigned long index)
1494 XA_STATE(xas, xa, index);
1501 * @xa: XArray.
1511 void *xa_erase(struct xarray *xa, unsigned long index)
1515 xa_lock(xa);
1516 entry = __xa_erase(xa, index);
1517 xa_unlock(xa);
1525 * @xa: XArray.
1538 void *__xa_store(struct xarray *xa, unsigned long index, void *entry, gfp_t gfp)
1540 XA_STATE(xas, xa, index);
1545 if (xa_track_free(xa) && !entry)
1550 if (xa_track_free(xa))
1560 * @xa: XArray.
1575 void *xa_store(struct xarray *xa, unsigned long index, void *entry, gfp_t gfp)
1579 xa_lock(xa);
1580 curr = __xa_store(xa, index, entry, gfp);
1581 xa_unlock(xa);
1589 * @xa: XArray.
1603 void *__xa_cmpxchg(struct xarray *xa, unsigned long index,
1606 XA_STATE(xas, xa, index);
1616 if (xa_track_free(xa) && entry && !curr)
1627 * @xa: XArray.
1641 int __xa_insert(struct xarray *xa, unsigned long index, void *entry, gfp_t gfp)
1643 XA_STATE(xas, xa, index);
1655 if (xa_track_free(xa))
1700 * @xa: XArray.
1716 void *xa_store_range(struct xarray *xa, unsigned long first,
1719 XA_STATE(xas, xa, 0);
1754 * @xa: XArray.
1759 int xa_get_order(struct xarray *xa, unsigned long index)
1761 XA_STATE(xas, xa, index);
1795 * @xa: XArray.
1801 * Finds an empty entry in @xa between @limit.min and @limit.max,
1813 int __xa_alloc(struct xarray *xa, u32 *id, void *entry,
1816 XA_STATE(xas, xa, 0);
1820 if (WARN_ON_ONCE(!xa_track_free(xa)))
1843 * @xa: XArray.
1850 * Finds an empty entry in @xa between @limit.min and @limit.max,
1865 int __xa_alloc_cyclic(struct xarray *xa, u32 *id, void *entry,
1872 ret = __xa_alloc(xa, id, entry, limit, gfp);
1873 if ((xa->xa_flags & XA_FLAGS_ALLOC_WRAPPED) && ret == 0) {
1874 xa->xa_flags &= ~XA_FLAGS_ALLOC_WRAPPED;
1880 ret = __xa_alloc(xa, id, entry, limit, gfp);
1888 xa->xa_flags |= XA_FLAGS_ALLOC_WRAPPED;
1896 * @xa: XArray.
1904 void __xa_set_mark(struct xarray *xa, unsigned long index, xa_mark_t mark)
1906 XA_STATE(xas, xa, index);
1916 * @xa: XArray.
1922 void __xa_clear_mark(struct xarray *xa, unsigned long index, xa_mark_t mark)
1924 XA_STATE(xas, xa, index);
1934 * @xa: XArray.
1944 bool xa_get_mark(struct xarray *xa, unsigned long index, xa_mark_t mark)
1946 XA_STATE(xas, xa, index);
1966 * @xa: XArray.
1974 void xa_set_mark(struct xarray *xa, unsigned long index, xa_mark_t mark)
1976 xa_lock(xa);
1977 __xa_set_mark(xa, index, mark);
1978 xa_unlock(xa);
1984 * @xa: XArray.
1992 void xa_clear_mark(struct xarray *xa, unsigned long index, xa_mark_t mark)
1994 xa_lock(xa);
1995 __xa_clear_mark(xa, index, mark);
1996 xa_unlock(xa);
2002 * @xa: XArray.
2007 * Finds the entry in @xa which matches the @filter, and has the lowest
2017 void *xa_find(struct xarray *xa, unsigned long *indexp,
2020 XA_STATE(xas, xa, *indexp);
2052 * @xa: XArray.
2057 * Finds the entry in @xa which matches the @filter and has the lowest
2067 void *xa_find_after(struct xarray *xa, unsigned long *indexp,
2070 XA_STATE(xas, xa, *indexp + 1);
2138 * @xa: The source XArray to copy from.
2164 unsigned int xa_extract(struct xarray *xa, void **dst, unsigned long start,
2167 XA_STATE(xas, xa, start);
2188 .xa = node->array,
2203 * @xa: XArray.
2211 void xa_destroy(struct xarray *xa)
2213 XA_STATE(xas, xa, 0);
2219 entry = xa_head_locked(xa);
2220 RCU_INIT_POINTER(xa->xa_head, NULL);
2222 if (xa_zero_busy(xa))
2223 xa_mark_clear(xa, XA_FREE_MARK);
2297 void xa_dump(const struct xarray *xa)
2299 void *entry = xa->xa_head;
2302 pr_info("xarray: %px head %px flags %x marks %d %d %d\n", xa, entry,
2303 xa->xa_flags, xa_marked(xa, XA_MARK_0),
2304 xa_marked(xa, XA_MARK_1), xa_marked(xa, XA_MARK_2));