xas 160 drivers/infiniband/core/device.c XA_STATE(xas, xa, *indexp); xas 165 drivers/infiniband/core/device.c entry = xas_find_marked(&xas, ULONG_MAX, filter); xas 168 drivers/infiniband/core/device.c } while (xas_retry(&xas, entry)); xas 172 drivers/infiniband/core/device.c *indexp = xas.xa_index; xas 115 drivers/infiniband/core/restrack.c XA_STATE(xas, &rt->xa, 0); xas 119 drivers/infiniband/core/restrack.c xas_for_each(&xas, e, U32_MAX) { xas 147 fs/dax.c static wait_queue_head_t *dax_entry_waitqueue(struct xa_state *xas, xas 151 fs/dax.c unsigned long index = xas->xa_index; xas 160 fs/dax.c key->xa = xas->xa; xas 163 fs/dax.c hash = hash_long((unsigned long)xas->xa ^ index, DAX_WAIT_TABLE_BITS); xas 185 fs/dax.c static void dax_wake_entry(struct xa_state *xas, void *entry, bool wake_all) xas 190 fs/dax.c wq = dax_entry_waitqueue(xas, entry, &key); xas 212 fs/dax.c static void *get_unlocked_entry(struct xa_state *xas, unsigned int order) xas 222 fs/dax.c entry = xas_find_conflict(xas); xas 230 fs/dax.c wq = dax_entry_waitqueue(xas, entry, &ewait.key); xas 233 fs/dax.c xas_unlock_irq(xas); xas 234 fs/dax.c xas_reset(xas); xas 237 fs/dax.c xas_lock_irq(xas); xas 246 fs/dax.c static void wait_entry_unlocked(struct xa_state *xas, void *entry) xas 254 fs/dax.c wq = dax_entry_waitqueue(xas, entry, &ewait.key); xas 262 fs/dax.c xas_unlock_irq(xas); xas 267 fs/dax.c static void put_unlocked_entry(struct xa_state *xas, void *entry) xas 271 fs/dax.c dax_wake_entry(xas, entry, false); xas 279 fs/dax.c static void dax_unlock_entry(struct xa_state *xas, void *entry) xas 284 fs/dax.c xas_reset(xas); xas 285 fs/dax.c xas_lock_irq(xas); xas 286 fs/dax.c old = xas_store(xas, entry); xas 287 fs/dax.c xas_unlock_irq(xas); xas 289 fs/dax.c dax_wake_entry(xas, entry, false); xas 295 fs/dax.c static void *dax_lock_entry(struct xa_state *xas, void *entry) xas 298 fs/dax.c return xas_store(xas, xa_mk_value(v | DAX_LOCKED)); xas 391 fs/dax.c XA_STATE(xas, NULL, 0); xas 414 fs/dax.c xas.xa = &mapping->i_pages; xas 415 fs/dax.c xas_lock_irq(&xas); xas 417 fs/dax.c xas_unlock_irq(&xas); xas 420 fs/dax.c xas_set(&xas, page->index); xas 421 fs/dax.c entry = xas_load(&xas); xas 424 fs/dax.c wait_entry_unlocked(&xas, entry); xas 428 fs/dax.c dax_lock_entry(&xas, entry); xas 429 fs/dax.c xas_unlock_irq(&xas); xas 439 fs/dax.c XA_STATE(xas, &mapping->i_pages, page->index); xas 444 fs/dax.c dax_unlock_entry(&xas, (void *)cookie); xas 476 fs/dax.c static void *grab_mapping_entry(struct xa_state *xas, xas 479 fs/dax.c unsigned long index = xas->xa_index; xas 484 fs/dax.c xas_lock_irq(xas); xas 485 fs/dax.c entry = get_unlocked_entry(xas, order); xas 491 fs/dax.c xas_set_err(xas, EIO); xas 509 fs/dax.c dax_lock_entry(xas, entry); xas 517 fs/dax.c xas_unlock_irq(xas); xas 519 fs/dax.c xas->xa_index & ~PG_PMD_COLOUR, xas 521 fs/dax.c xas_reset(xas); xas 522 fs/dax.c xas_lock_irq(xas); xas 526 fs/dax.c xas_store(xas, NULL); /* undo the PMD join */ xas 527 fs/dax.c dax_wake_entry(xas, entry, true); xas 530 fs/dax.c xas_set(xas, index); xas 534 fs/dax.c dax_lock_entry(xas, entry); xas 541 fs/dax.c dax_lock_entry(xas, entry); xas 542 fs/dax.c if (xas_error(xas)) xas 548 fs/dax.c xas_unlock_irq(xas); xas 549 fs/dax.c if (xas_nomem(xas, mapping_gfp_mask(mapping) & ~__GFP_HIGHMEM)) xas 551 fs/dax.c if (xas->xa_node == XA_ERROR(-ENOMEM)) xas 553 fs/dax.c if (xas_error(xas)) xas 557 fs/dax.c xas_unlock_irq(xas); xas 578 fs/dax.c XA_STATE(xas, &mapping->i_pages, 0); xas 606 fs/dax.c xas_lock_irq(&xas); xas 607 fs/dax.c xas_for_each(&xas, entry, ULONG_MAX) { xas 611 fs/dax.c entry = get_unlocked_entry(&xas, 0); xas 614 fs/dax.c put_unlocked_entry(&xas, entry); xas 620 fs/dax.c xas_pause(&xas); xas 621 fs/dax.c xas_unlock_irq(&xas); xas 623 fs/dax.c xas_lock_irq(&xas); xas 625 fs/dax.c xas_unlock_irq(&xas); xas 633 fs/dax.c XA_STATE(xas, &mapping->i_pages, index); xas 637 fs/dax.c xas_lock_irq(&xas); xas 638 fs/dax.c entry = get_unlocked_entry(&xas, 0); xas 642 fs/dax.c (xas_get_mark(&xas, PAGECACHE_TAG_DIRTY) || xas 643 fs/dax.c xas_get_mark(&xas, PAGECACHE_TAG_TOWRITE))) xas 646 fs/dax.c xas_store(&xas, NULL); xas 650 fs/dax.c put_unlocked_entry(&xas, entry); xas 651 fs/dax.c xas_unlock_irq(&xas); xas 716 fs/dax.c static void *dax_insert_entry(struct xa_state *xas, xas 726 fs/dax.c unsigned long index = xas->xa_index; xas 735 fs/dax.c xas_reset(xas); xas 736 fs/dax.c xas_lock_irq(xas); xas 750 fs/dax.c old = dax_lock_entry(xas, new_entry); xas 755 fs/dax.c xas_load(xas); /* Walk the xa_state */ xas 759 fs/dax.c xas_set_mark(xas, PAGECACHE_TAG_DIRTY); xas 761 fs/dax.c xas_unlock_irq(xas); xas 849 fs/dax.c static int dax_writeback_one(struct xa_state *xas, struct dax_device *dax_dev, xas 865 fs/dax.c entry = get_unlocked_entry(xas, 0); xas 884 fs/dax.c if (!xas_get_mark(xas, PAGECACHE_TAG_TOWRITE)) xas 889 fs/dax.c dax_lock_entry(xas, entry); xas 898 fs/dax.c xas_clear_mark(xas, PAGECACHE_TAG_TOWRITE); xas 899 fs/dax.c xas_unlock_irq(xas); xas 910 fs/dax.c index = xas->xa_index & ~(count - 1); xas 920 fs/dax.c xas_reset(xas); xas 921 fs/dax.c xas_lock_irq(xas); xas 922 fs/dax.c xas_store(xas, entry); xas 923 fs/dax.c xas_clear_mark(xas, PAGECACHE_TAG_DIRTY); xas 924 fs/dax.c dax_wake_entry(xas, entry, false); xas 930 fs/dax.c put_unlocked_entry(xas, entry); xas 942 fs/dax.c XA_STATE(xas, &mapping->i_pages, wbc->range_start >> PAGE_SHIFT); xas 960 fs/dax.c trace_dax_writeback_range(inode, xas.xa_index, end_index); xas 962 fs/dax.c tag_pages_for_writeback(mapping, xas.xa_index, end_index); xas 964 fs/dax.c xas_lock_irq(&xas); xas 965 fs/dax.c xas_for_each_marked(&xas, entry, end_index, PAGECACHE_TAG_TOWRITE) { xas 966 fs/dax.c ret = dax_writeback_one(&xas, dax_dev, mapping, entry); xas 974 fs/dax.c xas_pause(&xas); xas 975 fs/dax.c xas_unlock_irq(&xas); xas 977 fs/dax.c xas_lock_irq(&xas); xas 979 fs/dax.c xas_unlock_irq(&xas); xas 981 fs/dax.c trace_dax_writeback_range_done(inode, xas.xa_index, end_index); xas 1030 fs/dax.c static vm_fault_t dax_load_hole(struct xa_state *xas, xas 1039 fs/dax.c *entry = dax_insert_entry(xas, mapping, vmf, *entry, pfn, xas 1250 fs/dax.c XA_STATE(xas, &mapping->i_pages, vmf->pgoff); xas 1277 fs/dax.c entry = grab_mapping_entry(&xas, mapping, 0); xas 1352 fs/dax.c entry = dax_insert_entry(&xas, mapping, vmf, entry, pfn, xas 1380 fs/dax.c ret = dax_load_hole(&xas, mapping, &entry, vmf); xas 1407 fs/dax.c dax_unlock_entry(&xas, entry); xas 1414 fs/dax.c static vm_fault_t dax_pmd_load_hole(struct xa_state *xas, struct vm_fault *vmf, xas 1433 fs/dax.c *entry = dax_insert_entry(xas, mapping, vmf, *entry, pfn, xas 1471 fs/dax.c XA_STATE_ORDER(xas, &mapping->i_pages, vmf->pgoff, PMD_ORDER); xas 1514 fs/dax.c if (xas.xa_index >= max_pgoff) { xas 1520 fs/dax.c if ((xas.xa_index | PG_PMD_COLOUR) >= max_pgoff) xas 1529 fs/dax.c entry = grab_mapping_entry(&xas, mapping, PMD_ORDER); xas 1552 fs/dax.c pos = (loff_t)xas.xa_index << PAGE_SHIFT; xas 1568 fs/dax.c entry = dax_insert_entry(&xas, mapping, vmf, entry, pfn, xas 1592 fs/dax.c result = dax_pmd_load_hole(&xas, vmf, &iomap, &entry); xas 1615 fs/dax.c dax_unlock_entry(&xas, entry); xas 1673 fs/dax.c XA_STATE_ORDER(xas, &mapping->i_pages, vmf->pgoff, order); xas 1677 fs/dax.c xas_lock_irq(&xas); xas 1678 fs/dax.c entry = get_unlocked_entry(&xas, order); xas 1682 fs/dax.c put_unlocked_entry(&xas, entry); xas 1683 fs/dax.c xas_unlock_irq(&xas); xas 1688 fs/dax.c xas_set_mark(&xas, PAGECACHE_TAG_DIRTY); xas 1689 fs/dax.c dax_lock_entry(&xas, entry); xas 1690 fs/dax.c xas_unlock_irq(&xas); xas 1699 fs/dax.c dax_unlock_entry(&xas, entry); xas 360 fs/fs-writeback.c XA_STATE(xas, &mapping->i_pages, 0); xas 404 fs/fs-writeback.c xas_for_each_marked(&xas, page, ULONG_MAX, PAGECACHE_TAG_DIRTY) { xas 411 fs/fs-writeback.c xas_set(&xas, 0); xas 412 fs/fs-writeback.c xas_for_each_marked(&xas, page, ULONG_MAX, PAGECACHE_TAG_WRITEBACK) { xas 316 include/linux/swap.h #define mapping_set_update(xas, mapping) do { \ xas 318 include/linux/swap.h xas_set_update(xas, workingset_update_node); \ xas 1331 include/linux/xarray.h #define xas_marked(xas, mark) xa_marked((xas)->xa, (mark)) xas 1332 include/linux/xarray.h #define xas_trylock(xas) xa_trylock((xas)->xa) xas 1333 include/linux/xarray.h #define xas_lock(xas) xa_lock((xas)->xa) xas 1334 include/linux/xarray.h #define xas_unlock(xas) xa_unlock((xas)->xa) xas 1335 include/linux/xarray.h #define xas_lock_bh(xas) xa_lock_bh((xas)->xa) xas 1336 include/linux/xarray.h #define xas_unlock_bh(xas) xa_unlock_bh((xas)->xa) xas 1337 include/linux/xarray.h #define xas_lock_irq(xas) xa_lock_irq((xas)->xa) xas 1338 include/linux/xarray.h #define xas_unlock_irq(xas) xa_unlock_irq((xas)->xa) xas 1339 include/linux/xarray.h #define xas_lock_irqsave(xas, flags) \ xas 1340 include/linux/xarray.h xa_lock_irqsave((xas)->xa, flags) xas 1341 include/linux/xarray.h #define xas_unlock_irqrestore(xas, flags) \ xas 1342 include/linux/xarray.h xa_unlock_irqrestore((xas)->xa, flags) xas 1350 include/linux/xarray.h static inline int xas_error(const struct xa_state *xas) xas 1352 include/linux/xarray.h return xa_err(xas->xa_node); xas 1364 include/linux/xarray.h static inline void xas_set_err(struct xa_state *xas, long err) xas 1366 include/linux/xarray.h xas->xa_node = XA_ERROR(err); xas 1375 include/linux/xarray.h static inline bool xas_invalid(const struct xa_state *xas) xas 1377 include/linux/xarray.h return (unsigned long)xas->xa_node & 3; xas 1386 include/linux/xarray.h static inline bool xas_valid(const struct xa_state *xas) xas 1388 include/linux/xarray.h return !xas_invalid(xas); xas 1397 include/linux/xarray.h static inline bool xas_is_node(const struct xa_state *xas) xas 1399 include/linux/xarray.h return xas_valid(xas) && xas->xa_node; xas 1430 include/linux/xarray.h static inline void xas_reset(struct xa_state *xas) xas 1432 include/linux/xarray.h xas->xa_node = XAS_RESTART; xas 1447 include/linux/xarray.h static inline bool xas_retry(struct xa_state *xas, const void *entry) xas 1453 include/linux/xarray.h xas_reset(xas); xas 1487 include/linux/xarray.h static inline void *xas_reload(struct xa_state *xas) xas 1489 include/linux/xarray.h struct xa_node *node = xas->xa_node; xas 1492 include/linux/xarray.h return xa_entry(xas->xa, node, xas->xa_offset); xas 1493 include/linux/xarray.h return xa_head(xas->xa); xas 1505 include/linux/xarray.h static inline void xas_set(struct xa_state *xas, unsigned long index) xas 1507 include/linux/xarray.h xas->xa_index = index; xas 1508 include/linux/xarray.h xas->xa_node = XAS_RESTART; xas 1517 include/linux/xarray.h static inline void xas_set_order(struct xa_state *xas, unsigned long index, xas 1521 include/linux/xarray.h xas->xa_index = order < BITS_PER_LONG ? (index >> order) << order : 0; xas 1522 include/linux/xarray.h xas->xa_shift = order - (order % XA_CHUNK_SHIFT); xas 1523 include/linux/xarray.h xas->xa_sibs = (1 << (order % XA_CHUNK_SHIFT)) - 1; xas 1524 include/linux/xarray.h xas->xa_node = XAS_RESTART; xas 1527 include/linux/xarray.h xas_set(xas, index); xas 1539 include/linux/xarray.h static inline void xas_set_update(struct xa_state *xas, xa_update_node_t update) xas 1541 include/linux/xarray.h xas->xa_update = update; xas 1555 include/linux/xarray.h static inline void *xas_next_entry(struct xa_state *xas, unsigned long max) xas 1557 include/linux/xarray.h struct xa_node *node = xas->xa_node; xas 1561 include/linux/xarray.h xas->xa_offset != (xas->xa_index & XA_CHUNK_MASK))) xas 1562 include/linux/xarray.h return xas_find(xas, max); xas 1565 include/linux/xarray.h if (unlikely(xas->xa_index >= max)) xas 1566 include/linux/xarray.h return xas_find(xas, max); xas 1567 include/linux/xarray.h if (unlikely(xas->xa_offset == XA_CHUNK_MASK)) xas 1568 include/linux/xarray.h return xas_find(xas, max); xas 1569 include/linux/xarray.h entry = xa_entry(xas->xa, node, xas->xa_offset + 1); xas 1571 include/linux/xarray.h return xas_find(xas, max); xas 1572 include/linux/xarray.h xas->xa_offset++; xas 1573 include/linux/xarray.h xas->xa_index++; xas 1580 include/linux/xarray.h static inline unsigned int xas_find_chunk(struct xa_state *xas, bool advance, xas 1583 include/linux/xarray.h unsigned long *addr = xas->xa_node->marks[(__force unsigned)mark]; xas 1584 include/linux/xarray.h unsigned int offset = xas->xa_offset; xas 1612 include/linux/xarray.h static inline void *xas_next_marked(struct xa_state *xas, unsigned long max, xas 1615 include/linux/xarray.h struct xa_node *node = xas->xa_node; xas 1620 include/linux/xarray.h return xas_find_marked(xas, max, mark); xas 1621 include/linux/xarray.h offset = xas_find_chunk(xas, true, mark); xas 1622 include/linux/xarray.h xas->xa_offset = offset; xas 1623 include/linux/xarray.h xas->xa_index = (xas->xa_index & ~XA_CHUNK_MASK) + offset; xas 1624 include/linux/xarray.h if (xas->xa_index > max) xas 1627 include/linux/xarray.h return xas_find_marked(xas, max, mark); xas 1628 include/linux/xarray.h entry = xa_entry(xas->xa, node, offset); xas 1630 include/linux/xarray.h return xas_find_marked(xas, max, mark); xas 1655 include/linux/xarray.h #define xas_for_each(xas, entry, max) \ xas 1656 include/linux/xarray.h for (entry = xas_find(xas, max); entry; \ xas 1657 include/linux/xarray.h entry = xas_next_entry(xas, max)) xas 1673 include/linux/xarray.h #define xas_for_each_marked(xas, entry, max, mark) \ xas 1674 include/linux/xarray.h for (entry = xas_find_marked(xas, max, mark); entry; \ xas 1675 include/linux/xarray.h entry = xas_next_marked(xas, max, mark)) xas 1690 include/linux/xarray.h #define xas_for_each_conflict(xas, entry) \ xas 1691 include/linux/xarray.h while ((entry = xas_find_conflict(xas))) xas 1712 include/linux/xarray.h static inline void *xas_prev(struct xa_state *xas) xas 1714 include/linux/xarray.h struct xa_node *node = xas->xa_node; xas 1717 include/linux/xarray.h xas->xa_offset == 0)) xas 1718 include/linux/xarray.h return __xas_prev(xas); xas 1720 include/linux/xarray.h xas->xa_index--; xas 1721 include/linux/xarray.h xas->xa_offset--; xas 1722 include/linux/xarray.h return xa_entry(xas->xa, node, xas->xa_offset); xas 1741 include/linux/xarray.h static inline void *xas_next(struct xa_state *xas) xas 1743 include/linux/xarray.h struct xa_node *node = xas->xa_node; xas 1746 include/linux/xarray.h xas->xa_offset == XA_CHUNK_MASK)) xas 1747 include/linux/xarray.h return __xas_next(xas); xas 1749 include/linux/xarray.h xas->xa_index++; xas 1750 include/linux/xarray.h xas->xa_offset++; xas 1751 include/linux/xarray.h return xa_entry(xas->xa, node, xas->xa_offset); xas 382 lib/idr.c XA_STATE(xas, &ida->xa, min / IDA_BITMAP_BITS); xas 394 lib/idr.c xas_lock_irqsave(&xas, flags); xas 396 lib/idr.c bitmap = xas_find_marked(&xas, max / IDA_BITMAP_BITS, XA_FREE_MARK); xas 397 lib/idr.c if (xas.xa_index > min / IDA_BITMAP_BITS) xas 399 lib/idr.c if (xas.xa_index * IDA_BITMAP_BITS + bit > max) xas 407 lib/idr.c if (xas.xa_index * IDA_BITMAP_BITS + bit > max) xas 411 lib/idr.c xas_store(&xas, xa_mk_value(tmp)); xas 421 lib/idr.c xas_store(&xas, bitmap); xas 422 lib/idr.c if (xas_error(&xas)) { xas 430 lib/idr.c if (xas.xa_index * IDA_BITMAP_BITS + bit > max) xas 437 lib/idr.c xas_clear_mark(&xas, XA_FREE_MARK); xas 449 lib/idr.c xas_store(&xas, bitmap); xas 452 lib/idr.c xas_unlock_irqrestore(&xas, flags); xas 453 lib/idr.c if (xas_nomem(&xas, gfp)) { xas 454 lib/idr.c xas.xa_index = min / IDA_BITMAP_BITS; xas 460 lib/idr.c if (xas_error(&xas)) xas 461 lib/idr.c return xas_error(&xas); xas 462 lib/idr.c return xas.xa_index * IDA_BITMAP_BITS + bit; xas 464 lib/idr.c xas_unlock_irqrestore(&xas, flags); xas 468 lib/idr.c xas_set(&xas, min / IDA_BITMAP_BITS); xas 472 lib/idr.c xas_unlock_irqrestore(&xas, flags); xas 486 lib/idr.c XA_STATE(xas, &ida->xa, id / IDA_BITMAP_BITS); xas 493 lib/idr.c xas_lock_irqsave(&xas, flags); xas 494 lib/idr.c bitmap = xas_load(&xas); xas 505 lib/idr.c xas_store(&xas, xa_mk_value(v)); xas 510 lib/idr.c xas_set_mark(&xas, XA_FREE_MARK); xas 514 lib/idr.c xas_store(&xas, NULL); xas 517 lib/idr.c xas_unlock_irqrestore(&xas, flags); xas 520 lib/idr.c xas_unlock_irqrestore(&xas, flags); xas 538 lib/idr.c XA_STATE(xas, &ida->xa, 0); xas 542 lib/idr.c xas_lock_irqsave(&xas, flags); xas 543 lib/idr.c xas_for_each(&xas, bitmap, ULONG_MAX) { xas 546 lib/idr.c xas_store(&xas, NULL); xas 548 lib/idr.c xas_unlock_irqrestore(&xas, flags); xas 74 lib/test_xarray.c XA_STATE_ORDER(xas, xa, index, order); xas 78 lib/test_xarray.c xas_lock(&xas); xas 79 lib/test_xarray.c curr = xas_store(&xas, entry); xas 80 lib/test_xarray.c xas_unlock(&xas); xas 81 lib/test_xarray.c } while (xas_nomem(&xas, gfp)); xas 104 lib/test_xarray.c XA_STATE(xas, xa, 0); xas 111 lib/test_xarray.c XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != xa_mk_value(0)); xas 113 lib/test_xarray.c XA_BUG_ON(xa, !xa_is_retry(xas_reload(&xas))); xas 114 lib/test_xarray.c XA_BUG_ON(xa, xas_retry(&xas, NULL)); xas 115 lib/test_xarray.c XA_BUG_ON(xa, xas_retry(&xas, xa_mk_value(0))); xas 116 lib/test_xarray.c xas_reset(&xas); xas 117 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_node != XAS_RESTART); xas 118 lib/test_xarray.c XA_BUG_ON(xa, xas_next_entry(&xas, ULONG_MAX) != xa_mk_value(0)); xas 119 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_node != NULL); xas 125 lib/test_xarray.c XA_BUG_ON(xa, !xa_is_internal(xas_reload(&xas))); xas 126 lib/test_xarray.c xas.xa_node = XAS_RESTART; xas 127 lib/test_xarray.c XA_BUG_ON(xa, xas_next_entry(&xas, ULONG_MAX) != xa_mk_value(0)); xas 131 lib/test_xarray.c xas_lock(&xas); xas 132 lib/test_xarray.c xas_set(&xas, 0); xas 133 lib/test_xarray.c xas_store(&xas, XA_RETRY_ENTRY); xas 134 lib/test_xarray.c xas_set(&xas, 1); xas 135 lib/test_xarray.c xas_store(&xas, XA_RETRY_ENTRY); xas 137 lib/test_xarray.c xas_set(&xas, 0); xas 138 lib/test_xarray.c xas_for_each(&xas, entry, ULONG_MAX) { xas 139 lib/test_xarray.c xas_store(&xas, xa_mk_index(xas.xa_index)); xas 141 lib/test_xarray.c xas_unlock(&xas); xas 220 lib/test_xarray.c XA_STATE(xas, xa, i); xas 230 lib/test_xarray.c xas_for_each(&xas, entry, ULONG_MAX) xas 236 lib/test_xarray.c xas_set(&xas, 0); xas 239 lib/test_xarray.c xas_for_each_marked(&xas, entry, ULONG_MAX, XA_MARK_0) xas 256 lib/test_xarray.c XA_STATE(xas, xa, 0); xas 263 lib/test_xarray.c xas_lock(&xas); xas 264 lib/test_xarray.c xas_load(&xas); xas 265 lib/test_xarray.c xas_init_marks(&xas); xas 266 lib/test_xarray.c xas_unlock(&xas); xas 274 lib/test_xarray.c xas_reset(&xas); xas 276 lib/test_xarray.c xas_for_each_marked(&xas, entry, ULONG_MAX, XA_MARK_0) xas 281 lib/test_xarray.c xas_lock(&xas); xas 282 lib/test_xarray.c xas_for_each(&xas, entry, ULONG_MAX) { xas 283 lib/test_xarray.c xas_init_marks(&xas); xas 284 lib/test_xarray.c XA_BUG_ON(xa, !xa_get_mark(xa, xas.xa_index, XA_MARK_0)); xas 285 lib/test_xarray.c XA_BUG_ON(xa, !xas_get_mark(&xas, XA_MARK_0)); xas 287 lib/test_xarray.c xas_unlock(&xas); xas 304 lib/test_xarray.c XA_STATE(xas, xa, 1); xas 317 lib/test_xarray.c xas_lock(&xas); xas 318 lib/test_xarray.c XA_BUG_ON(xa, xas_load(&xas) != xa_mk_value(1)); xas 319 lib/test_xarray.c node = xas.xa_node; xas 321 lib/test_xarray.c XA_BUG_ON(xa, xas_store(&xas, NULL) != xa_mk_value(1)); xas 323 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_node != XAS_BOUNDS); xas 325 lib/test_xarray.c XA_BUG_ON(xa, xas_load(&xas) != NULL); xas 326 lib/test_xarray.c xas_unlock(&xas); xas 469 lib/test_xarray.c XA_STATE(xas, xa, 0); xas 475 lib/test_xarray.c xas_set(&xas, j); xas 477 lib/test_xarray.c xas_lock(&xas); xas 478 lib/test_xarray.c xas_store(&xas, xa_mk_index(j)); xas 479 lib/test_xarray.c xas_unlock(&xas); xas 480 lib/test_xarray.c } while (xas_nomem(&xas, GFP_KERNEL)); xas 483 lib/test_xarray.c xas_set(&xas, ULONG_MAX); xas 485 lib/test_xarray.c xas_lock(&xas); xas 486 lib/test_xarray.c xas_store(&xas, xa_mk_value(0)); xas 487 lib/test_xarray.c xas_unlock(&xas); xas 488 lib/test_xarray.c } while (xas_nomem(&xas, GFP_KERNEL)); xas 490 lib/test_xarray.c xas_lock(&xas); xas 491 lib/test_xarray.c xas_store(&xas, NULL); xas 493 lib/test_xarray.c xas_set(&xas, 0); xas 495 lib/test_xarray.c xas_for_each(&xas, entry, ULONG_MAX) { xas 497 lib/test_xarray.c xas_store(&xas, NULL); xas 500 lib/test_xarray.c xas_unlock(&xas); xas 509 lib/test_xarray.c XA_STATE(xas, xa, index); xas 519 lib/test_xarray.c xas_lock(&xas); xas 520 lib/test_xarray.c XA_BUG_ON(xa, xas_store(&xas, xa_mk_index(min)) != xa_mk_index(index)); xas 521 lib/test_xarray.c xas_unlock(&xas); xas 534 lib/test_xarray.c XA_STATE(xas, xa, index); xas 537 lib/test_xarray.c xas_lock(&xas); xas 538 lib/test_xarray.c XA_BUG_ON(xa, xas_store(&xas, xa_mk_value(1)) != xa_mk_value(0)); xas 539 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_index != index); xas 540 lib/test_xarray.c XA_BUG_ON(xa, xas_store(&xas, NULL) != xa_mk_value(1)); xas 541 lib/test_xarray.c xas_unlock(&xas); xas 548 lib/test_xarray.c XA_STATE(xas, xa, 0); xas 554 lib/test_xarray.c xas_lock(&xas); xas 555 lib/test_xarray.c xas_for_each(&xas, entry, ULONG_MAX) { xas 560 lib/test_xarray.c xas_set(&xas, index + 1); xas 561 lib/test_xarray.c xas_for_each(&xas, entry, ULONG_MAX) { xas 566 lib/test_xarray.c xas_unlock(&xas); xas 845 lib/test_xarray.c XA_STATE_ORDER(xas, xa, start, order); xas 850 lib/test_xarray.c xas_lock(&xas); xas 851 lib/test_xarray.c xas_for_each_conflict(&xas, entry) { xas 857 lib/test_xarray.c xas_store(&xas, xa_mk_index(start)); xas 858 lib/test_xarray.c xas_unlock(&xas); xas 859 lib/test_xarray.c if (xas_nomem(&xas, GFP_KERNEL)) { xas 863 lib/test_xarray.c XA_BUG_ON(xa, xas_error(&xas)); xas 950 lib/test_xarray.c XA_STATE(xas, xa, j + index); xas 955 lib/test_xarray.c xas_for_each(&xas, entry, ULONG_MAX) { xas 1050 lib/test_xarray.c XA_STATE(xas, xa, 0); xas 1058 lib/test_xarray.c xas_set(&xas, j); xas 1059 lib/test_xarray.c xas_for_each_marked(&xas, entry, k, XA_MARK_0) xas 1063 lib/test_xarray.c xas.xa_node != XAS_RESTART); xas 1107 lib/test_xarray.c XA_STATE(xas, xa, 0); xas 1112 lib/test_xarray.c xas_for_each(&xas, entry, ULONG_MAX) { xas 1113 lib/test_xarray.c if (xas_retry(&xas, entry)) xas 1120 lib/test_xarray.c xas_pause(&xas); xas 1124 lib/test_xarray.c return entry ? xas.xa_index : -1; xas 1161 lib/test_xarray.c XA_STATE(xas, xa, 0); xas 1174 lib/test_xarray.c xas_for_each(&xas, entry, ULONG_MAX) { xas 1182 lib/test_xarray.c xas_set(&xas, 0); xas 1184 lib/test_xarray.c xas_for_each(&xas, entry, ULONG_MAX) { xas 1187 lib/test_xarray.c xas_pause(&xas); xas 1197 lib/test_xarray.c XA_STATE(xas, xa, 0); xas 1201 lib/test_xarray.c XA_BUG_ON(xa, xas_next(&xas) != NULL); xas 1202 lib/test_xarray.c XA_BUG_ON(xa, xas_next(&xas) != NULL); xas 1206 lib/test_xarray.c xas_set(&xas, 0); xas 1207 lib/test_xarray.c XA_BUG_ON(xa, xas_next(&xas) != xa_mk_index(0)); xas 1208 lib/test_xarray.c XA_BUG_ON(xa, xas_next(&xas) != NULL); xas 1209 lib/test_xarray.c xas_set(&xas, 0); xas 1210 lib/test_xarray.c XA_BUG_ON(xa, xas_prev(&xas) != xa_mk_index(0)); xas 1211 lib/test_xarray.c XA_BUG_ON(xa, xas_prev(&xas) != NULL); xas 1219 lib/test_xarray.c XA_STATE(xas, xa, 0); xas 1223 lib/test_xarray.c XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != xa_mk_index(ULONG_MAX)); xas 1224 lib/test_xarray.c XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != NULL); xas 1227 lib/test_xarray.c xas_set(&xas, 0); xas 1229 lib/test_xarray.c XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != xa_mk_index(ULONG_MAX)); xas 1230 lib/test_xarray.c xas_pause(&xas); xas 1231 lib/test_xarray.c XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != NULL); xas 1240 lib/test_xarray.c XA_STATE(xas, xa, 0); xas 1248 lib/test_xarray.c void *entry = xas_next(&xas); xas 1250 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_node == XAS_RESTART); xas 1251 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_index != i); xas 1257 lib/test_xarray.c xas_next(&xas); xas 1258 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_index != i); xas 1261 lib/test_xarray.c void *entry = xas_prev(&xas); xas 1264 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_node == XAS_RESTART); xas 1265 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_index != i); xas 1272 lib/test_xarray.c xas_set(&xas, ULONG_MAX); xas 1273 lib/test_xarray.c XA_BUG_ON(xa, xas_next(&xas) != NULL); xas 1274 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_index != ULONG_MAX); xas 1275 lib/test_xarray.c XA_BUG_ON(xa, xas_next(&xas) != xa_mk_value(0)); xas 1276 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_index != 0); xas 1277 lib/test_xarray.c XA_BUG_ON(xa, xas_prev(&xas) != NULL); xas 1278 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_index != ULONG_MAX); xas 1288 lib/test_xarray.c XA_STATE(xas, xa, (1 << 16) - 1); xas 1296 lib/test_xarray.c void *entry = xas_prev(&xas); xas 1299 lib/test_xarray.c XA_BUG_ON(xa, i != xas.xa_index); xas 1302 lib/test_xarray.c XA_BUG_ON(xa, xas_prev(&xas) != NULL); xas 1303 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_index != ULONG_MAX); xas 1306 lib/test_xarray.c void *entry = xas_next(&xas); xas 1308 lib/test_xarray.c XA_BUG_ON(xa, i != xas.xa_index); xas 1316 lib/test_xarray.c i = xas.xa_index; xas 1320 lib/test_xarray.c void *entry = xas_prev(&xas); xas 1326 lib/test_xarray.c XA_BUG_ON(xa, i != xas.xa_index); xas 1329 lib/test_xarray.c XA_BUG_ON(xa, xas_prev(&xas) != NULL); xas 1330 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_index != ULONG_MAX); xas 1333 lib/test_xarray.c void *entry = xas_next(&xas); xas 1338 lib/test_xarray.c XA_BUG_ON(xa, i != xas.xa_index); xas 1358 lib/test_xarray.c XA_STATE_ORDER(xas, xa, index, order); xas 1362 lib/test_xarray.c xas_lock(&xas); xas 1363 lib/test_xarray.c XA_BUG_ON(xa, xas_find_conflict(&xas)); xas 1364 lib/test_xarray.c xas_create_range(&xas); xas 1365 lib/test_xarray.c if (xas_error(&xas)) xas 1368 lib/test_xarray.c XA_BUG_ON(xa, xas_store(&xas, xa_mk_index(index + i))); xas 1369 lib/test_xarray.c xas_next(&xas); xas 1372 lib/test_xarray.c xas_unlock(&xas); xas 1373 lib/test_xarray.c } while (xas_nomem(&xas, GFP_KERNEL)); xas 1375 lib/test_xarray.c XA_BUG_ON(xa, xas_error(&xas)); xas 1403 lib/test_xarray.c XA_STATE(xas, NULL, 0); xas 1404 lib/test_xarray.c xas_set_err(&xas, -EEXIST); xas 1405 lib/test_xarray.c xas_create_range(&xas); xas 1406 lib/test_xarray.c XA_BUG_ON(NULL, xas_error(&xas) != -EEXIST); xas 1412 lib/test_xarray.c XA_STATE_ORDER(xas, xa, index, order); xas 1413 lib/test_xarray.c unsigned long base = xas.xa_index; xas 1418 lib/test_xarray.c xas_lock(&xas); xas 1419 lib/test_xarray.c xas_create_range(&xas); xas 1420 lib/test_xarray.c if (xas_error(&xas)) xas 1423 lib/test_xarray.c void *old = xas_store(&xas, xa_mk_index(base + i)); xas 1424 lib/test_xarray.c if (xas.xa_index == index) xas 1428 lib/test_xarray.c xas_next(&xas); xas 1431 lib/test_xarray.c xas_unlock(&xas); xas 1432 lib/test_xarray.c } while (xas_nomem(&xas, GFP_KERNEL)); xas 1434 lib/test_xarray.c XA_BUG_ON(xa, xas_error(&xas)); xas 1578 lib/test_xarray.c XA_STATE(xas, node->array, 0); xas 1581 lib/test_xarray.c xas.xa_node = xa_parent_locked(node->array, node); xas 1582 lib/test_xarray.c xas.xa_offset = node->offset; xas 1583 lib/test_xarray.c xas.xa_shift = node->shift + XA_CHUNK_SHIFT; xas 1584 lib/test_xarray.c xas_set_update(&xas, test_update_node); xas 1585 lib/test_xarray.c xas_store(&xas, NULL); xas 1592 lib/test_xarray.c XA_STATE(xas, xa, index); xas 1593 lib/test_xarray.c xas_set_update(&xas, test_update_node); xas 1596 lib/test_xarray.c xas_lock(&xas); xas 1597 lib/test_xarray.c xas_store(&xas, xa_mk_value(0)); xas 1598 lib/test_xarray.c xas_next(&xas); xas 1599 lib/test_xarray.c xas_store(&xas, xa_mk_value(1)); xas 1600 lib/test_xarray.c xas_unlock(&xas); xas 1601 lib/test_xarray.c } while (xas_nomem(&xas, GFP_KERNEL)); xas 1605 lib/test_xarray.c xas_lock(&xas); xas 1606 lib/test_xarray.c xas_next(&xas); xas 1607 lib/test_xarray.c xas_store(&xas, &xas); xas 1610 lib/test_xarray.c xas_store(&xas, xa_mk_value(2)); xas 1611 lib/test_xarray.c xas_unlock(&xas); xas 1629 lib/test_xarray.c XA_STATE(xas, xa, 1 << order); xas 1633 lib/test_xarray.c xas_load(&xas); xas 1634 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_node->count == 0); xas 1635 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_node->count > (1 << order)); xas 1636 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_node->nr_values != 0); xas 1641 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_node->count != xas.xa_node->nr_values * 2); xas 1644 lib/test_xarray.c XA_BUG_ON(xa, xas.xa_node->nr_values != 0); xas 36 lib/xarray.c static inline void xas_lock_type(struct xa_state *xas, unsigned int lock_type) xas 39 lib/xarray.c xas_lock_irq(xas); xas 41 lib/xarray.c xas_lock_bh(xas); xas 43 lib/xarray.c xas_lock(xas); xas 46 lib/xarray.c static inline void xas_unlock_type(struct xa_state *xas, unsigned int lock_type) xas 49 lib/xarray.c xas_unlock_irq(xas); xas 51 lib/xarray.c xas_unlock_bh(xas); xas 53 lib/xarray.c xas_unlock(xas); xas 124 lib/xarray.c static void xas_squash_marks(const struct xa_state *xas) xas 127 lib/xarray.c unsigned int limit = xas->xa_offset + xas->xa_sibs + 1; xas 129 lib/xarray.c if (!xas->xa_sibs) xas 133 lib/xarray.c unsigned long *marks = xas->xa_node->marks[mark]; xas 134 lib/xarray.c if (find_next_bit(marks, limit, xas->xa_offset + 1) == limit) xas 136 lib/xarray.c __set_bit(xas->xa_offset, marks); xas 137 lib/xarray.c bitmap_clear(marks, xas->xa_offset + 1, xas->xa_sibs); xas 147 lib/xarray.c static void xas_set_offset(struct xa_state *xas) xas 149 lib/xarray.c xas->xa_offset = get_offset(xas->xa_index, xas->xa_node); xas 153 lib/xarray.c static void xas_move_index(struct xa_state *xas, unsigned long offset) xas 155 lib/xarray.c unsigned int shift = xas->xa_node->shift; xas 156 lib/xarray.c xas->xa_index &= ~XA_CHUNK_MASK << shift; xas 157 lib/xarray.c xas->xa_index += offset << shift; xas 160 lib/xarray.c static void xas_advance(struct xa_state *xas) xas 162 lib/xarray.c xas->xa_offset++; xas 163 lib/xarray.c xas_move_index(xas, xas->xa_offset); xas 166 lib/xarray.c static void *set_bounds(struct xa_state *xas) xas 168 lib/xarray.c xas->xa_node = XAS_BOUNDS; xas 179 lib/xarray.c static void *xas_start(struct xa_state *xas) xas 183 lib/xarray.c if (xas_valid(xas)) xas 184 lib/xarray.c return xas_reload(xas); xas 185 lib/xarray.c if (xas_error(xas)) xas 188 lib/xarray.c entry = xa_head(xas->xa); xas 190 lib/xarray.c if (xas->xa_index) xas 191 lib/xarray.c return set_bounds(xas); xas 193 lib/xarray.c if ((xas->xa_index >> xa_to_node(entry)->shift) > XA_CHUNK_MASK) xas 194 lib/xarray.c return set_bounds(xas); xas 197 lib/xarray.c xas->xa_node = NULL; xas 201 lib/xarray.c static void *xas_descend(struct xa_state *xas, struct xa_node *node) xas 203 lib/xarray.c unsigned int offset = get_offset(xas->xa_index, node); xas 204 lib/xarray.c void *entry = xa_entry(xas->xa, node, offset); xas 206 lib/xarray.c xas->xa_node = node; xas 209 lib/xarray.c entry = xa_entry(xas->xa, node, offset); xas 212 lib/xarray.c xas->xa_offset = offset; xas 231 lib/xarray.c void *xas_load(struct xa_state *xas) xas 233 lib/xarray.c void *entry = xas_start(xas); xas 238 lib/xarray.c if (xas->xa_shift > node->shift) xas 240 lib/xarray.c entry = xas_descend(xas, node); xas 267 lib/xarray.c static void xas_destroy(struct xa_state *xas) xas 269 lib/xarray.c struct xa_node *node = xas->xa_alloc; xas 275 lib/xarray.c xas->xa_alloc = NULL; xas 296 lib/xarray.c bool xas_nomem(struct xa_state *xas, gfp_t gfp) xas 298 lib/xarray.c if (xas->xa_node != XA_ERROR(-ENOMEM)) { xas 299 lib/xarray.c xas_destroy(xas); xas 302 lib/xarray.c if (xas->xa->xa_flags & XA_FLAGS_ACCOUNT) xas 304 lib/xarray.c xas->xa_alloc = kmem_cache_alloc(radix_tree_node_cachep, gfp); xas 305 lib/xarray.c if (!xas->xa_alloc) xas 307 lib/xarray.c XA_NODE_BUG_ON(xas->xa_alloc, !list_empty(&xas->xa_alloc->private_list)); xas 308 lib/xarray.c xas->xa_node = XAS_RESTART; xas 322 lib/xarray.c static bool __xas_nomem(struct xa_state *xas, gfp_t gfp) xas 323 lib/xarray.c __must_hold(xas->xa->xa_lock) xas 325 lib/xarray.c unsigned int lock_type = xa_lock_type(xas->xa); xas 327 lib/xarray.c if (xas->xa_node != XA_ERROR(-ENOMEM)) { xas 328 lib/xarray.c xas_destroy(xas); xas 331 lib/xarray.c if (xas->xa->xa_flags & XA_FLAGS_ACCOUNT) xas 334 lib/xarray.c xas_unlock_type(xas, lock_type); xas 335 lib/xarray.c xas->xa_alloc = kmem_cache_alloc(radix_tree_node_cachep, gfp); xas 336 lib/xarray.c xas_lock_type(xas, lock_type); xas 338 lib/xarray.c xas->xa_alloc = kmem_cache_alloc(radix_tree_node_cachep, gfp); xas 340 lib/xarray.c if (!xas->xa_alloc) xas 342 lib/xarray.c XA_NODE_BUG_ON(xas->xa_alloc, !list_empty(&xas->xa_alloc->private_list)); xas 343 lib/xarray.c xas->xa_node = XAS_RESTART; xas 347 lib/xarray.c static void xas_update(struct xa_state *xas, struct xa_node *node) xas 349 lib/xarray.c if (xas->xa_update) xas 350 lib/xarray.c xas->xa_update(node); xas 355 lib/xarray.c static void *xas_alloc(struct xa_state *xas, unsigned int shift) xas 357 lib/xarray.c struct xa_node *parent = xas->xa_node; xas 358 lib/xarray.c struct xa_node *node = xas->xa_alloc; xas 360 lib/xarray.c if (xas_invalid(xas)) xas 364 lib/xarray.c xas->xa_alloc = NULL; xas 368 lib/xarray.c if (xas->xa->xa_flags & XA_FLAGS_ACCOUNT) xas 373 lib/xarray.c xas_set_err(xas, -ENOMEM); xas 379 lib/xarray.c node->offset = xas->xa_offset; xas 382 lib/xarray.c xas_update(xas, parent); xas 389 lib/xarray.c RCU_INIT_POINTER(node->parent, xas->xa_node); xas 390 lib/xarray.c node->array = xas->xa; xas 397 lib/xarray.c static unsigned long xas_size(const struct xa_state *xas) xas 399 lib/xarray.c return (xas->xa_sibs + 1UL) << xas->xa_shift; xas 409 lib/xarray.c static unsigned long xas_max(struct xa_state *xas) xas 411 lib/xarray.c unsigned long max = xas->xa_index; xas 414 lib/xarray.c if (xas->xa_shift || xas->xa_sibs) { xas 415 lib/xarray.c unsigned long mask = xas_size(xas) - 1; xas 433 lib/xarray.c static void xas_shrink(struct xa_state *xas) xas 435 lib/xarray.c struct xarray *xa = xas->xa; xas 436 lib/xarray.c struct xa_node *node = xas->xa_node; xas 451 lib/xarray.c xas->xa_node = XAS_BOUNDS; xas 461 lib/xarray.c xas_update(xas, node); xas 477 lib/xarray.c static void xas_delete_node(struct xa_state *xas) xas 479 lib/xarray.c struct xa_node *node = xas->xa_node; xas 488 lib/xarray.c parent = xa_parent_locked(xas->xa, node); xas 489 lib/xarray.c xas->xa_node = parent; xas 490 lib/xarray.c xas->xa_offset = node->offset; xas 494 lib/xarray.c xas->xa->xa_head = NULL; xas 495 lib/xarray.c xas->xa_node = XAS_BOUNDS; xas 499 lib/xarray.c parent->slots[xas->xa_offset] = NULL; xas 503 lib/xarray.c xas_update(xas, node); xas 507 lib/xarray.c xas_shrink(xas); xas 519 lib/xarray.c static void xas_free_nodes(struct xa_state *xas, struct xa_node *top) xas 525 lib/xarray.c void *entry = xa_entry_locked(xas->xa, node, offset); xas 538 lib/xarray.c parent = xa_parent_locked(xas->xa, node); xas 542 lib/xarray.c xas_update(xas, node); xas 555 lib/xarray.c static int xas_expand(struct xa_state *xas, void *head) xas 557 lib/xarray.c struct xarray *xa = xas->xa; xas 560 lib/xarray.c unsigned long max = xas_max(xas); xas 572 lib/xarray.c xas->xa_node = NULL; xas 578 lib/xarray.c node = xas_alloc(xas, shift); xas 613 lib/xarray.c xas_update(xas, node); xas 618 lib/xarray.c xas->xa_node = node; xas 635 lib/xarray.c static void *xas_create(struct xa_state *xas, bool allow_root) xas 637 lib/xarray.c struct xarray *xa = xas->xa; xas 640 lib/xarray.c struct xa_node *node = xas->xa_node; xas 642 lib/xarray.c unsigned int order = xas->xa_shift; xas 646 lib/xarray.c xas->xa_node = NULL; xas 649 lib/xarray.c shift = xas_expand(xas, entry); xas 656 lib/xarray.c } else if (xas_error(xas)) { xas 659 lib/xarray.c unsigned int offset = xas->xa_offset; xas 673 lib/xarray.c node = xas_alloc(xas, shift); xas 684 lib/xarray.c entry = xas_descend(xas, node); xas 685 lib/xarray.c slot = &node->slots[xas->xa_offset]; xas 700 lib/xarray.c void xas_create_range(struct xa_state *xas) xas 702 lib/xarray.c unsigned long index = xas->xa_index; xas 703 lib/xarray.c unsigned char shift = xas->xa_shift; xas 704 lib/xarray.c unsigned char sibs = xas->xa_sibs; xas 706 lib/xarray.c xas->xa_index |= ((sibs + 1) << shift) - 1; xas 707 lib/xarray.c if (xas_is_node(xas) && xas->xa_node->shift == xas->xa_shift) xas 708 lib/xarray.c xas->xa_offset |= sibs; xas 709 lib/xarray.c xas->xa_shift = 0; xas 710 lib/xarray.c xas->xa_sibs = 0; xas 713 lib/xarray.c xas_create(xas, true); xas 714 lib/xarray.c if (xas_error(xas)) xas 716 lib/xarray.c if (xas->xa_index <= (index | XA_CHUNK_MASK)) xas 718 lib/xarray.c xas->xa_index -= XA_CHUNK_SIZE; xas 721 lib/xarray.c struct xa_node *node = xas->xa_node; xas 722 lib/xarray.c xas->xa_node = xa_parent_locked(xas->xa, node); xas 723 lib/xarray.c xas->xa_offset = node->offset - 1; xas 730 lib/xarray.c xas->xa_shift = shift; xas 731 lib/xarray.c xas->xa_sibs = sibs; xas 732 lib/xarray.c xas->xa_index = index; xas 735 lib/xarray.c xas->xa_index = index; xas 736 lib/xarray.c if (xas->xa_node) xas 737 lib/xarray.c xas_set_offset(xas); xas 741 lib/xarray.c static void update_node(struct xa_state *xas, struct xa_node *node, xas 751 lib/xarray.c xas_update(xas, node); xas 753 lib/xarray.c xas_delete_node(xas); xas 769 lib/xarray.c void *xas_store(struct xa_state *xas, void *entry) xas 772 lib/xarray.c void __rcu **slot = &xas->xa->xa_head; xas 781 lib/xarray.c first = xas_create(xas, allow_root); xas 783 lib/xarray.c first = xas_load(xas); xas 786 lib/xarray.c if (xas_invalid(xas)) xas 788 lib/xarray.c node = xas->xa_node; xas 789 lib/xarray.c if (node && (xas->xa_shift < node->shift)) xas 790 lib/xarray.c xas->xa_sibs = 0; xas 791 lib/xarray.c if ((first == entry) && !xas->xa_sibs) xas 795 lib/xarray.c offset = xas->xa_offset; xas 796 lib/xarray.c max = xas->xa_offset + xas->xa_sibs; xas 799 lib/xarray.c if (xas->xa_sibs) xas 800 lib/xarray.c xas_squash_marks(xas); xas 803 lib/xarray.c xas_init_marks(xas); xas 815 lib/xarray.c xas_free_nodes(xas, xa_to_node(next)); xas 824 lib/xarray.c entry = xa_mk_sibling(xas->xa_offset); xas 829 lib/xarray.c next = xa_entry_locked(xas->xa, node, ++offset); xas 838 lib/xarray.c update_node(xas, node, count, values); xas 851 lib/xarray.c bool xas_get_mark(const struct xa_state *xas, xa_mark_t mark) xas 853 lib/xarray.c if (xas_invalid(xas)) xas 855 lib/xarray.c if (!xas->xa_node) xas 856 lib/xarray.c return xa_marked(xas->xa, mark); xas 857 lib/xarray.c return node_get_mark(xas->xa_node, xas->xa_offset, mark); xas 870 lib/xarray.c void xas_set_mark(const struct xa_state *xas, xa_mark_t mark) xas 872 lib/xarray.c struct xa_node *node = xas->xa_node; xas 873 lib/xarray.c unsigned int offset = xas->xa_offset; xas 875 lib/xarray.c if (xas_invalid(xas)) xas 882 lib/xarray.c node = xa_parent_locked(xas->xa, node); xas 885 lib/xarray.c if (!xa_marked(xas->xa, mark)) xas 886 lib/xarray.c xa_mark_set(xas->xa, mark); xas 899 lib/xarray.c void xas_clear_mark(const struct xa_state *xas, xa_mark_t mark) xas 901 lib/xarray.c struct xa_node *node = xas->xa_node; xas 902 lib/xarray.c unsigned int offset = xas->xa_offset; xas 904 lib/xarray.c if (xas_invalid(xas)) xas 914 lib/xarray.c node = xa_parent_locked(xas->xa, node); xas 917 lib/xarray.c if (xa_marked(xas->xa, mark)) xas 918 lib/xarray.c xa_mark_clear(xas->xa, mark); xas 933 lib/xarray.c void xas_init_marks(const struct xa_state *xas) xas 938 lib/xarray.c if (xa_track_free(xas->xa) && mark == XA_FREE_MARK) xas 939 lib/xarray.c xas_set_mark(xas, mark); xas 941 lib/xarray.c xas_clear_mark(xas, mark); xas 964 lib/xarray.c void xas_pause(struct xa_state *xas) xas 966 lib/xarray.c struct xa_node *node = xas->xa_node; xas 968 lib/xarray.c if (xas_invalid(xas)) xas 971 lib/xarray.c xas->xa_node = XAS_RESTART; xas 973 lib/xarray.c unsigned long offset = xas->xa_offset; xas 975 lib/xarray.c if (!xa_is_sibling(xa_entry(xas->xa, node, offset))) xas 978 lib/xarray.c xas->xa_index += (offset - xas->xa_offset) << node->shift; xas 979 lib/xarray.c if (xas->xa_index == 0) xas 980 lib/xarray.c xas->xa_node = XAS_BOUNDS; xas 982 lib/xarray.c xas->xa_index++; xas 994 lib/xarray.c void *__xas_prev(struct xa_state *xas) xas 998 lib/xarray.c if (!xas_frozen(xas->xa_node)) xas 999 lib/xarray.c xas->xa_index--; xas 1000 lib/xarray.c if (!xas->xa_node) xas 1001 lib/xarray.c return set_bounds(xas); xas 1002 lib/xarray.c if (xas_not_node(xas->xa_node)) xas 1003 lib/xarray.c return xas_load(xas); xas 1005 lib/xarray.c if (xas->xa_offset != get_offset(xas->xa_index, xas->xa_node)) xas 1006 lib/xarray.c xas->xa_offset--; xas 1008 lib/xarray.c while (xas->xa_offset == 255) { xas 1009 lib/xarray.c xas->xa_offset = xas->xa_node->offset - 1; xas 1010 lib/xarray.c xas->xa_node = xa_parent(xas->xa, xas->xa_node); xas 1011 lib/xarray.c if (!xas->xa_node) xas 1012 lib/xarray.c return set_bounds(xas); xas 1016 lib/xarray.c entry = xa_entry(xas->xa, xas->xa_node, xas->xa_offset); xas 1020 lib/xarray.c xas->xa_node = xa_to_node(entry); xas 1021 lib/xarray.c xas_set_offset(xas); xas 1033 lib/xarray.c void *__xas_next(struct xa_state *xas) xas 1037 lib/xarray.c if (!xas_frozen(xas->xa_node)) xas 1038 lib/xarray.c xas->xa_index++; xas 1039 lib/xarray.c if (!xas->xa_node) xas 1040 lib/xarray.c return set_bounds(xas); xas 1041 lib/xarray.c if (xas_not_node(xas->xa_node)) xas 1042 lib/xarray.c return xas_load(xas); xas 1044 lib/xarray.c if (xas->xa_offset != get_offset(xas->xa_index, xas->xa_node)) xas 1045 lib/xarray.c xas->xa_offset++; xas 1047 lib/xarray.c while (xas->xa_offset == XA_CHUNK_SIZE) { xas 1048 lib/xarray.c xas->xa_offset = xas->xa_node->offset + 1; xas 1049 lib/xarray.c xas->xa_node = xa_parent(xas->xa, xas->xa_node); xas 1050 lib/xarray.c if (!xas->xa_node) xas 1051 lib/xarray.c return set_bounds(xas); xas 1055 lib/xarray.c entry = xa_entry(xas->xa, xas->xa_node, xas->xa_offset); xas 1059 lib/xarray.c xas->xa_node = xa_to_node(entry); xas 1060 lib/xarray.c xas_set_offset(xas); xas 1081 lib/xarray.c void *xas_find(struct xa_state *xas, unsigned long max) xas 1085 lib/xarray.c if (xas_error(xas) || xas->xa_node == XAS_BOUNDS) xas 1087 lib/xarray.c if (xas->xa_index > max) xas 1088 lib/xarray.c return set_bounds(xas); xas 1090 lib/xarray.c if (!xas->xa_node) { xas 1091 lib/xarray.c xas->xa_index = 1; xas 1092 lib/xarray.c return set_bounds(xas); xas 1093 lib/xarray.c } else if (xas->xa_node == XAS_RESTART) { xas 1094 lib/xarray.c entry = xas_load(xas); xas 1095 lib/xarray.c if (entry || xas_not_node(xas->xa_node)) xas 1097 lib/xarray.c } else if (!xas->xa_node->shift && xas 1098 lib/xarray.c xas->xa_offset != (xas->xa_index & XA_CHUNK_MASK)) { xas 1099 lib/xarray.c xas->xa_offset = ((xas->xa_index - 1) & XA_CHUNK_MASK) + 1; xas 1102 lib/xarray.c xas_advance(xas); xas 1104 lib/xarray.c while (xas->xa_node && (xas->xa_index <= max)) { xas 1105 lib/xarray.c if (unlikely(xas->xa_offset == XA_CHUNK_SIZE)) { xas 1106 lib/xarray.c xas->xa_offset = xas->xa_node->offset + 1; xas 1107 lib/xarray.c xas->xa_node = xa_parent(xas->xa, xas->xa_node); xas 1111 lib/xarray.c entry = xa_entry(xas->xa, xas->xa_node, xas->xa_offset); xas 1113 lib/xarray.c xas->xa_node = xa_to_node(entry); xas 1114 lib/xarray.c xas->xa_offset = 0; xas 1120 lib/xarray.c xas_advance(xas); xas 1123 lib/xarray.c if (!xas->xa_node) xas 1124 lib/xarray.c xas->xa_node = XAS_BOUNDS; xas 1150 lib/xarray.c void *xas_find_marked(struct xa_state *xas, unsigned long max, xa_mark_t mark) xas 1156 lib/xarray.c if (xas_error(xas)) xas 1158 lib/xarray.c if (xas->xa_index > max) xas 1161 lib/xarray.c if (!xas->xa_node) { xas 1162 lib/xarray.c xas->xa_index = 1; xas 1164 lib/xarray.c } else if (xas_top(xas->xa_node)) { xas 1166 lib/xarray.c entry = xa_head(xas->xa); xas 1167 lib/xarray.c xas->xa_node = NULL; xas 1168 lib/xarray.c if (xas->xa_index > max_index(entry)) xas 1171 lib/xarray.c if (xa_marked(xas->xa, mark)) xas 1173 lib/xarray.c xas->xa_index = 1; xas 1176 lib/xarray.c xas->xa_node = xa_to_node(entry); xas 1177 lib/xarray.c xas->xa_offset = xas->xa_index >> xas->xa_node->shift; xas 1180 lib/xarray.c while (xas->xa_index <= max) { xas 1181 lib/xarray.c if (unlikely(xas->xa_offset == XA_CHUNK_SIZE)) { xas 1182 lib/xarray.c xas->xa_offset = xas->xa_node->offset + 1; xas 1183 lib/xarray.c xas->xa_node = xa_parent(xas->xa, xas->xa_node); xas 1184 lib/xarray.c if (!xas->xa_node) xas 1191 lib/xarray.c entry = xa_entry(xas->xa, xas->xa_node, xas->xa_offset); xas 1193 lib/xarray.c xas->xa_offset = xa_to_sibling(entry); xas 1194 lib/xarray.c xas_move_index(xas, xas->xa_offset); xas 1198 lib/xarray.c offset = xas_find_chunk(xas, advance, mark); xas 1199 lib/xarray.c if (offset > xas->xa_offset) { xas 1201 lib/xarray.c xas_move_index(xas, offset); xas 1203 lib/xarray.c if ((xas->xa_index - 1) >= max) xas 1205 lib/xarray.c xas->xa_offset = offset; xas 1210 lib/xarray.c entry = xa_entry(xas->xa, xas->xa_node, xas->xa_offset); xas 1211 lib/xarray.c if (!entry && !(xa_track_free(xas->xa) && mark == XA_FREE_MARK)) xas 1215 lib/xarray.c xas->xa_node = xa_to_node(entry); xas 1216 lib/xarray.c xas_set_offset(xas); xas 1220 lib/xarray.c if (xas->xa_index > max) xas 1222 lib/xarray.c return set_bounds(xas); xas 1224 lib/xarray.c xas->xa_node = XAS_RESTART; xas 1238 lib/xarray.c void *xas_find_conflict(struct xa_state *xas) xas 1242 lib/xarray.c if (xas_error(xas)) xas 1245 lib/xarray.c if (!xas->xa_node) xas 1248 lib/xarray.c if (xas_top(xas->xa_node)) { xas 1249 lib/xarray.c curr = xas_start(xas); xas 1254 lib/xarray.c curr = xas_descend(xas, node); xas 1260 lib/xarray.c if (xas->xa_node->shift > xas->xa_shift) xas 1264 lib/xarray.c if (xas->xa_node->shift == xas->xa_shift) { xas 1265 lib/xarray.c if ((xas->xa_offset & xas->xa_sibs) == xas->xa_sibs) xas 1267 lib/xarray.c } else if (xas->xa_offset == XA_CHUNK_MASK) { xas 1268 lib/xarray.c xas->xa_offset = xas->xa_node->offset; xas 1269 lib/xarray.c xas->xa_node = xa_parent_locked(xas->xa, xas->xa_node); xas 1270 lib/xarray.c if (!xas->xa_node) xas 1274 lib/xarray.c curr = xa_entry_locked(xas->xa, xas->xa_node, ++xas->xa_offset); xas 1278 lib/xarray.c xas->xa_node = xa_to_node(curr); xas 1279 lib/xarray.c xas->xa_offset = 0; xas 1280 lib/xarray.c curr = xa_entry_locked(xas->xa, xas->xa_node, 0); xas 1285 lib/xarray.c xas->xa_offset -= xas->xa_sibs; xas 1300 lib/xarray.c XA_STATE(xas, xa, index); xas 1305 lib/xarray.c entry = xas_load(&xas); xas 1308 lib/xarray.c } while (xas_retry(&xas, entry)); xas 1315 lib/xarray.c static void *xas_result(struct xa_state *xas, void *curr) xas 1319 lib/xarray.c if (xas_error(xas)) xas 1320 lib/xarray.c curr = xas->xa_node; xas 1338 lib/xarray.c XA_STATE(xas, xa, index); xas 1339 lib/xarray.c return xas_result(&xas, xas_store(&xas, NULL)); xas 1384 lib/xarray.c XA_STATE(xas, xa, index); xas 1393 lib/xarray.c curr = xas_store(&xas, entry); xas 1395 lib/xarray.c xas_clear_mark(&xas, XA_FREE_MARK); xas 1396 lib/xarray.c } while (__xas_nomem(&xas, gfp)); xas 1398 lib/xarray.c return xas_result(&xas, curr); xas 1450 lib/xarray.c XA_STATE(xas, xa, index); xas 1457 lib/xarray.c curr = xas_load(&xas); xas 1459 lib/xarray.c xas_store(&xas, entry); xas 1461 lib/xarray.c xas_clear_mark(&xas, XA_FREE_MARK); xas 1463 lib/xarray.c } while (__xas_nomem(&xas, gfp)); xas 1465 lib/xarray.c return xas_result(&xas, curr); xas 1487 lib/xarray.c XA_STATE(xas, xa, index); xas 1496 lib/xarray.c curr = xas_load(&xas); xas 1498 lib/xarray.c xas_store(&xas, entry); xas 1500 lib/xarray.c xas_clear_mark(&xas, XA_FREE_MARK); xas 1502 lib/xarray.c xas_set_err(&xas, -EBUSY); xas 1504 lib/xarray.c } while (__xas_nomem(&xas, gfp)); xas 1506 lib/xarray.c return xas_error(&xas); xas 1511 lib/xarray.c static void xas_set_range(struct xa_state *xas, unsigned long first, xas 1518 lib/xarray.c xas_set(xas, first); xas 1538 lib/xarray.c xas->xa_shift = shift; xas 1539 lib/xarray.c xas->xa_sibs = sibs; xas 1563 lib/xarray.c XA_STATE(xas, xa, 0); xas 1571 lib/xarray.c xas_lock(&xas); xas 1576 lib/xarray.c xas_set_order(&xas, last, order); xas 1577 lib/xarray.c xas_create(&xas, true); xas 1578 lib/xarray.c if (xas_error(&xas)) xas 1582 lib/xarray.c xas_set_range(&xas, first, last); xas 1583 lib/xarray.c xas_store(&xas, entry); xas 1584 lib/xarray.c if (xas_error(&xas)) xas 1586 lib/xarray.c first += xas_size(&xas); xas 1589 lib/xarray.c xas_unlock(&xas); xas 1590 lib/xarray.c } while (xas_nomem(&xas, gfp)); xas 1592 lib/xarray.c return xas_result(&xas, NULL); xas 1617 lib/xarray.c XA_STATE(xas, xa, 0); xas 1628 lib/xarray.c xas.xa_index = limit.min; xas 1629 lib/xarray.c xas_find_marked(&xas, limit.max, XA_FREE_MARK); xas 1630 lib/xarray.c if (xas.xa_node == XAS_RESTART) xas 1631 lib/xarray.c xas_set_err(&xas, -EBUSY); xas 1633 lib/xarray.c *id = xas.xa_index; xas 1634 lib/xarray.c xas_store(&xas, entry); xas 1635 lib/xarray.c xas_clear_mark(&xas, XA_FREE_MARK); xas 1636 lib/xarray.c } while (__xas_nomem(&xas, gfp)); xas 1638 lib/xarray.c return xas_error(&xas); xas 1704 lib/xarray.c XA_STATE(xas, xa, index); xas 1705 lib/xarray.c void *entry = xas_load(&xas); xas 1708 lib/xarray.c xas_set_mark(&xas, mark); xas 1722 lib/xarray.c XA_STATE(xas, xa, index); xas 1723 lib/xarray.c void *entry = xas_load(&xas); xas 1726 lib/xarray.c xas_clear_mark(&xas, mark); xas 1744 lib/xarray.c XA_STATE(xas, xa, index); xas 1748 lib/xarray.c entry = xas_start(&xas); xas 1749 lib/xarray.c while (xas_get_mark(&xas, mark)) { xas 1752 lib/xarray.c entry = xas_descend(&xas, xa_to_node(entry)); xas 1818 lib/xarray.c XA_STATE(xas, xa, *indexp); xas 1824 lib/xarray.c entry = xas_find_marked(&xas, max, filter); xas 1826 lib/xarray.c entry = xas_find(&xas, max); xas 1827 lib/xarray.c } while (xas_retry(&xas, entry)); xas 1831 lib/xarray.c *indexp = xas.xa_index; xas 1836 lib/xarray.c static bool xas_sibling(struct xa_state *xas) xas 1838 lib/xarray.c struct xa_node *node = xas->xa_node; xas 1844 lib/xarray.c return (xas->xa_index & mask) > xas 1845 lib/xarray.c ((unsigned long)xas->xa_offset << node->shift); xas 1868 lib/xarray.c XA_STATE(xas, xa, *indexp + 1); xas 1871 lib/xarray.c if (xas.xa_index == 0) xas 1877 lib/xarray.c entry = xas_find_marked(&xas, max, filter); xas 1879 lib/xarray.c entry = xas_find(&xas, max); xas 1881 lib/xarray.c if (xas_invalid(&xas)) xas 1883 lib/xarray.c if (xas_sibling(&xas)) xas 1885 lib/xarray.c if (!xas_retry(&xas, entry)) xas 1891 lib/xarray.c *indexp = xas.xa_index; xas 1896 lib/xarray.c static unsigned int xas_extract_present(struct xa_state *xas, void **dst, xas 1903 lib/xarray.c xas_for_each(xas, entry, max) { xas 1904 lib/xarray.c if (xas_retry(xas, entry)) xas 1915 lib/xarray.c static unsigned int xas_extract_marked(struct xa_state *xas, void **dst, xas 1922 lib/xarray.c xas_for_each_marked(xas, entry, max, mark) { xas 1923 lib/xarray.c if (xas_retry(xas, entry)) xas 1965 lib/xarray.c XA_STATE(xas, xa, start); xas 1971 lib/xarray.c return xas_extract_marked(&xas, dst, max, n, filter); xas 1972 lib/xarray.c return xas_extract_present(&xas, dst, max, n); xas 1988 lib/xarray.c XA_STATE(xas, xa, 0); xas 1992 lib/xarray.c xas.xa_node = NULL; xas 1993 lib/xarray.c xas_lock_irqsave(&xas, flags); xas 1996 lib/xarray.c xas_init_marks(&xas); xas 2001 lib/xarray.c xas_free_nodes(&xas, xa_to_node(entry)); xas 2002 lib/xarray.c xas_unlock_irqrestore(&xas, flags); xas 122 mm/filemap.c XA_STATE(xas, &mapping->i_pages, page->index); xas 125 mm/filemap.c mapping_set_update(&xas, mapping); xas 129 mm/filemap.c xas_set_order(&xas, page->index, compound_order(page)); xas 137 mm/filemap.c xas_store(&xas, shadow); xas 138 mm/filemap.c xas_init_marks(&xas); xas 297 mm/filemap.c XA_STATE(xas, &mapping->i_pages, pvec->pages[0]->index); xas 302 mm/filemap.c mapping_set_update(&xas, mapping); xas 303 mm/filemap.c xas_for_each(&xas, page, ULONG_MAX) { xas 325 mm/filemap.c if (page->index == xas.xa_index) xas 334 mm/filemap.c if (page->index + compound_nr(page) - 1 == xas.xa_index) xas 336 mm/filemap.c xas_store(&xas, NULL); xas 476 mm/filemap.c XA_STATE(xas, &mapping->i_pages, start_byte >> PAGE_SHIFT); xas 484 mm/filemap.c page = xas_find(&xas, max); xas 485 mm/filemap.c if (xas_retry(&xas, page)) xas 816 mm/filemap.c XA_STATE(xas, &mapping->i_pages, offset); xas 827 mm/filemap.c xas_lock_irqsave(&xas, flags); xas 828 mm/filemap.c xas_store(&xas, new); xas 840 mm/filemap.c xas_unlock_irqrestore(&xas, flags); xas 855 mm/filemap.c XA_STATE(xas, &mapping->i_pages, offset); xas 863 mm/filemap.c mapping_set_update(&xas, mapping); xas 877 mm/filemap.c xas_lock_irq(&xas); xas 878 mm/filemap.c old = xas_load(&xas); xas 880 mm/filemap.c xas_set_err(&xas, -EEXIST); xas 881 mm/filemap.c xas_store(&xas, page); xas 882 mm/filemap.c if (xas_error(&xas)) xas 896 mm/filemap.c xas_unlock_irq(&xas); xas 897 mm/filemap.c } while (xas_nomem(&xas, gfp_mask & GFP_RECLAIM_MASK)); xas 899 mm/filemap.c if (xas_error(&xas)) xas 912 mm/filemap.c return xas_error(&xas); xas 1462 mm/filemap.c XA_STATE(xas, &mapping->i_pages, index); xas 1465 mm/filemap.c void *entry = xas_next(&xas); xas 1468 mm/filemap.c if (xas.xa_index == 0) xas 1472 mm/filemap.c return xas.xa_index; xas 1498 mm/filemap.c XA_STATE(xas, &mapping->i_pages, index); xas 1501 mm/filemap.c void *entry = xas_prev(&xas); xas 1504 mm/filemap.c if (xas.xa_index == ULONG_MAX) xas 1508 mm/filemap.c return xas.xa_index; xas 1527 mm/filemap.c XA_STATE(xas, &mapping->i_pages, offset); xas 1532 mm/filemap.c xas_reset(&xas); xas 1533 mm/filemap.c page = xas_load(&xas); xas 1534 mm/filemap.c if (xas_retry(&xas, page)) xas 1551 mm/filemap.c if (unlikely(page != xas_reload(&xas))) { xas 1728 mm/filemap.c XA_STATE(xas, &mapping->i_pages, start); xas 1736 mm/filemap.c xas_for_each(&xas, page, ULONG_MAX) { xas 1737 mm/filemap.c if (xas_retry(&xas, page)) xas 1751 mm/filemap.c if (unlikely(page != xas_reload(&xas))) xas 1753 mm/filemap.c page = find_subpage(page, xas.xa_index); xas 1756 mm/filemap.c indices[ret] = xas.xa_index; xas 1764 mm/filemap.c xas_reset(&xas); xas 1795 mm/filemap.c XA_STATE(xas, &mapping->i_pages, *start); xas 1803 mm/filemap.c xas_for_each(&xas, page, end) { xas 1804 mm/filemap.c if (xas_retry(&xas, page)) xas 1814 mm/filemap.c if (unlikely(page != xas_reload(&xas))) xas 1817 mm/filemap.c pages[ret] = find_subpage(page, xas.xa_index); xas 1819 mm/filemap.c *start = xas.xa_index + 1; xas 1826 mm/filemap.c xas_reset(&xas); xas 1860 mm/filemap.c XA_STATE(xas, &mapping->i_pages, index); xas 1868 mm/filemap.c for (page = xas_load(&xas); page; page = xas_next(&xas)) { xas 1869 mm/filemap.c if (xas_retry(&xas, page)) xas 1882 mm/filemap.c if (unlikely(page != xas_reload(&xas))) xas 1885 mm/filemap.c pages[ret] = find_subpage(page, xas.xa_index); xas 1892 mm/filemap.c xas_reset(&xas); xas 1917 mm/filemap.c XA_STATE(xas, &mapping->i_pages, *index); xas 1925 mm/filemap.c xas_for_each_marked(&xas, page, end, tag) { xas 1926 mm/filemap.c if (xas_retry(&xas, page)) xas 1940 mm/filemap.c if (unlikely(page != xas_reload(&xas))) xas 1943 mm/filemap.c pages[ret] = find_subpage(page, xas.xa_index); xas 1945 mm/filemap.c *index = xas.xa_index + 1; xas 1952 mm/filemap.c xas_reset(&xas); xas 2609 mm/filemap.c XA_STATE(xas, &mapping->i_pages, start_pgoff); xas 2613 mm/filemap.c xas_for_each(&xas, page, end_pgoff) { xas 2614 mm/filemap.c if (xas_retry(&xas, page)) xas 2629 mm/filemap.c if (unlikely(page != xas_reload(&xas))) xas 2631 mm/filemap.c page = find_subpage(page, xas.xa_index); xas 2650 mm/filemap.c vmf->address += (xas.xa_index - last_pgoff) << PAGE_SHIFT; xas 2652 mm/filemap.c vmf->pte += xas.xa_index - last_pgoff; xas 2653 mm/filemap.c last_pgoff = xas.xa_index; xas 2773 mm/huge_memory.c XA_STATE(xas, &mapping->i_pages, page_index(head)); xas 2780 mm/huge_memory.c if (xas_load(&xas) != head) xas 1502 mm/khugepaged.c XA_STATE_ORDER(xas, &mapping->i_pages, start, HPAGE_PMD_ORDER); xas 1525 mm/khugepaged.c xas_lock_irq(&xas); xas 1526 mm/khugepaged.c xas_create_range(&xas); xas 1527 mm/khugepaged.c if (!xas_error(&xas)) xas 1529 mm/khugepaged.c xas_unlock_irq(&xas); xas 1530 mm/khugepaged.c if (!xas_nomem(&xas, GFP_KERNEL)) { xas 1549 mm/khugepaged.c xas_set(&xas, start); xas 1551 mm/khugepaged.c struct page *page = xas_next(&xas); xas 1553 mm/khugepaged.c VM_BUG_ON(index != xas.xa_index); xas 1562 mm/khugepaged.c if (!xas_next_entry(&xas, end - 1)) { xas 1566 mm/khugepaged.c xas_set(&xas, index); xas 1572 mm/khugepaged.c xas_store(&xas, new_page); xas 1578 mm/khugepaged.c xas_unlock_irq(&xas); xas 1587 mm/khugepaged.c xas_unlock_irq(&xas); xas 1594 mm/khugepaged.c xas_unlock_irq(&xas); xas 1607 mm/khugepaged.c xas_unlock_irq(&xas); xas 1665 mm/khugepaged.c xas_lock_irq(&xas); xas 1666 mm/khugepaged.c xas_set(&xas, index); xas 1668 mm/khugepaged.c VM_BUG_ON_PAGE(page != xas_load(&xas), page); xas 1679 mm/khugepaged.c xas_unlock_irq(&xas); xas 1691 mm/khugepaged.c xas_store(&xas, new_page); xas 1716 mm/khugepaged.c xas_unlock_irq(&xas); xas 1771 mm/khugepaged.c xas_lock_irq(&xas); xas 1777 mm/khugepaged.c xas_set(&xas, start); xas 1778 mm/khugepaged.c xas_for_each(&xas, page, end - 1) { xas 1781 mm/khugepaged.c if (!page || xas.xa_index < page->index) { xas 1786 mm/khugepaged.c xas_store(&xas, NULL); xas 1790 mm/khugepaged.c VM_BUG_ON_PAGE(page->index != xas.xa_index, page); xas 1795 mm/khugepaged.c xas_store(&xas, page); xas 1796 mm/khugepaged.c xas_pause(&xas); xas 1797 mm/khugepaged.c xas_unlock_irq(&xas); xas 1800 mm/khugepaged.c xas_lock_irq(&xas); xas 1803 mm/khugepaged.c xas_unlock_irq(&xas); xas 1820 mm/khugepaged.c XA_STATE(xas, &mapping->i_pages, start); xas 1829 mm/khugepaged.c xas_for_each(&xas, page, start + HPAGE_PMD_NR - 1) { xas 1830 mm/khugepaged.c if (xas_retry(&xas, page)) xas 1873 mm/khugepaged.c xas_pause(&xas); xas 31 mm/memfd.c static void memfd_tag_pins(struct xa_state *xas) xas 38 mm/memfd.c xas_lock_irq(xas); xas 39 mm/memfd.c xas_for_each(xas, page, ULONG_MAX) { xas 42 mm/memfd.c page = find_subpage(page, xas->xa_index); xas 44 mm/memfd.c xas_set_mark(xas, MEMFD_TAG_PINNED); xas 49 mm/memfd.c xas_pause(xas); xas 50 mm/memfd.c xas_unlock_irq(xas); xas 52 mm/memfd.c xas_lock_irq(xas); xas 54 mm/memfd.c xas_unlock_irq(xas); xas 68 mm/memfd.c XA_STATE(xas, &mapping->i_pages, 0); xas 72 mm/memfd.c memfd_tag_pins(&xas); xas 78 mm/memfd.c if (!xas_marked(&xas, MEMFD_TAG_PINNED)) xas 86 mm/memfd.c xas_set(&xas, 0); xas 87 mm/memfd.c xas_lock_irq(&xas); xas 88 mm/memfd.c xas_for_each_marked(&xas, page, ULONG_MAX, MEMFD_TAG_PINNED) { xas 92 mm/memfd.c page = find_subpage(page, xas.xa_index); xas 105 mm/memfd.c xas_clear_mark(&xas, MEMFD_TAG_PINNED); xas 109 mm/memfd.c xas_pause(&xas); xas 110 mm/memfd.c xas_unlock_irq(&xas); xas 112 mm/memfd.c xas_lock_irq(&xas); xas 114 mm/memfd.c xas_unlock_irq(&xas); xas 400 mm/migrate.c XA_STATE(xas, &mapping->i_pages, page_index(page)); xas 422 mm/migrate.c xas_lock_irq(&xas); xas 423 mm/migrate.c if (page_count(page) != expected_count || xas_load(&xas) != page) { xas 424 mm/migrate.c xas_unlock_irq(&xas); xas 429 mm/migrate.c xas_unlock_irq(&xas); xas 457 mm/migrate.c xas_store(&xas, newpage); xas 462 mm/migrate.c xas_next(&xas); xas 463 mm/migrate.c xas_store(&xas, newpage); xas 474 mm/migrate.c xas_unlock(&xas); xas 514 mm/migrate.c XA_STATE(xas, &mapping->i_pages, page_index(page)); xas 517 mm/migrate.c xas_lock_irq(&xas); xas 519 mm/migrate.c if (page_count(page) != expected_count || xas_load(&xas) != page) { xas 520 mm/migrate.c xas_unlock_irq(&xas); xas 525 mm/migrate.c xas_unlock_irq(&xas); xas 534 mm/migrate.c xas_store(&xas, newpage); xas 538 mm/migrate.c xas_unlock_irq(&xas); xas 2108 mm/page-writeback.c XA_STATE(xas, &mapping->i_pages, start); xas 2112 mm/page-writeback.c xas_lock_irq(&xas); xas 2113 mm/page-writeback.c xas_for_each_marked(&xas, page, end, PAGECACHE_TAG_DIRTY) { xas 2114 mm/page-writeback.c xas_set_mark(&xas, PAGECACHE_TAG_TOWRITE); xas 2118 mm/page-writeback.c xas_pause(&xas); xas 2119 mm/page-writeback.c xas_unlock_irq(&xas); xas 2121 mm/page-writeback.c xas_lock_irq(&xas); xas 2123 mm/page-writeback.c xas_unlock_irq(&xas); xas 2771 mm/page-writeback.c XA_STATE(xas, &mapping->i_pages, page_index(page)); xas 2776 mm/page-writeback.c xas_lock_irqsave(&xas, flags); xas 2777 mm/page-writeback.c xas_load(&xas); xas 2785 mm/page-writeback.c xas_set_mark(&xas, PAGECACHE_TAG_WRITEBACK); xas 2798 mm/page-writeback.c xas_clear_mark(&xas, PAGECACHE_TAG_DIRTY); xas 2800 mm/page-writeback.c xas_clear_mark(&xas, PAGECACHE_TAG_TOWRITE); xas 2801 mm/page-writeback.c xas_unlock_irqrestore(&xas, flags); xas 356 mm/shmem.c XA_STATE(xas, &mapping->i_pages, index); xas 361 mm/shmem.c item = xas_load(&xas); xas 364 mm/shmem.c xas_store(&xas, replacement); xas 610 mm/shmem.c XA_STATE_ORDER(xas, &mapping->i_pages, index, compound_order(page)); xas 626 mm/shmem.c xas_lock_irq(&xas); xas 627 mm/shmem.c entry = xas_find_conflict(&xas); xas 629 mm/shmem.c xas_set_err(&xas, -EEXIST); xas 630 mm/shmem.c xas_create_range(&xas); xas 631 mm/shmem.c if (xas_error(&xas)) xas 634 mm/shmem.c xas_store(&xas, page); xas 636 mm/shmem.c xas_next(&xas); xas 647 mm/shmem.c xas_unlock_irq(&xas); xas 648 mm/shmem.c } while (xas_nomem(&xas, gfp)); xas 650 mm/shmem.c if (xas_error(&xas)) { xas 653 mm/shmem.c return xas_error(&xas); xas 705 mm/shmem.c XA_STATE(xas, &mapping->i_pages, start); xas 710 mm/shmem.c xas_for_each(&xas, page, end - 1) { xas 711 mm/shmem.c if (xas_retry(&xas, page)) xas 717 mm/shmem.c xas_pause(&xas); xas 1126 mm/shmem.c XA_STATE(xas, &mapping->i_pages, start); xas 1135 mm/shmem.c xas_for_each(&xas, page, ULONG_MAX) { xas 1136 mm/shmem.c if (xas_retry(&xas, page)) xas 1149 mm/shmem.c indices[ret] = xas.xa_index; xas 1153 mm/shmem.c xas_pause(&xas); xas 118 mm/swap_state.c XA_STATE_ORDER(xas, &address_space->i_pages, idx, compound_order(page)); xas 129 mm/swap_state.c xas_lock_irq(&xas); xas 130 mm/swap_state.c xas_create_range(&xas); xas 131 mm/swap_state.c if (xas_error(&xas)) xas 134 mm/swap_state.c VM_BUG_ON_PAGE(xas.xa_index != idx + i, page); xas 136 mm/swap_state.c xas_store(&xas, page); xas 137 mm/swap_state.c xas_next(&xas); xas 143 mm/swap_state.c xas_unlock_irq(&xas); xas 144 mm/swap_state.c } while (xas_nomem(&xas, gfp)); xas 146 mm/swap_state.c if (!xas_error(&xas)) xas 151 mm/swap_state.c return xas_error(&xas); xas 163 mm/swap_state.c XA_STATE(xas, &address_space->i_pages, idx); xas 170 mm/swap_state.c void *entry = xas_store(&xas, NULL); xas 173 mm/swap_state.c xas_next(&xas); xas 37 mm/truncate.c XA_STATE(xas, &mapping->i_pages, index); xas 39 mm/truncate.c xas_set_update(&xas, workingset_update_node); xas 40 mm/truncate.c if (xas_load(&xas) != entry) xas 42 mm/truncate.c xas_store(&xas, NULL); xas 455 mm/workingset.c XA_STATE(xas, node->array, 0); xas 495 mm/workingset.c xas.xa_node = xa_parent_locked(&mapping->i_pages, node); xas 496 mm/workingset.c xas.xa_offset = node->offset; xas 497 mm/workingset.c xas.xa_shift = node->shift + XA_CHUNK_SHIFT; xas 498 mm/workingset.c xas_set_update(&xas, workingset_update_node); xas 503 mm/workingset.c xas_store(&xas, NULL); xas 23 tools/testing/radix-tree/iteration_check.c XA_STATE(xas, xa, index); xas 28 tools/testing/radix-tree/iteration_check.c xas_lock(&xas); xas 30 tools/testing/radix-tree/iteration_check.c xas_set_order(&xas, index, order); xas 32 tools/testing/radix-tree/iteration_check.c if (xas_find_conflict(&xas)) xas 34 tools/testing/radix-tree/iteration_check.c xas_store(&xas, item); xas 35 tools/testing/radix-tree/iteration_check.c xas_set_mark(&xas, TAG); xas 38 tools/testing/radix-tree/iteration_check.c xas_unlock(&xas); xas 39 tools/testing/radix-tree/iteration_check.c if (xas_nomem(&xas, GFP_KERNEL)) xas 69 tools/testing/radix-tree/iteration_check.c XA_STATE(xas, &array, 0); xas 75 tools/testing/radix-tree/iteration_check.c xas_set(&xas, 0); xas 77 tools/testing/radix-tree/iteration_check.c xas_for_each_marked(&xas, entry, ULONG_MAX, TAG) { xas 78 tools/testing/radix-tree/iteration_check.c if (xas_retry(&xas, entry)) xas 82 tools/testing/radix-tree/iteration_check.c xas_pause(&xas); xas 102 tools/testing/radix-tree/iteration_check.c XA_STATE(xas, &array, 0); xas 108 tools/testing/radix-tree/iteration_check.c xas_set(&xas, 0); xas 110 tools/testing/radix-tree/iteration_check.c xas_for_each(&xas, entry, ULONG_MAX) { xas 111 tools/testing/radix-tree/iteration_check.c if (xas_retry(&xas, entry)) xas 115 tools/testing/radix-tree/iteration_check.c xas_pause(&xas); xas 15 tools/testing/radix-tree/iteration_check_2.c XA_STATE(xas, arg, 0); xas 21 tools/testing/radix-tree/iteration_check_2.c xas_set(&xas, 0); xas 23 tools/testing/radix-tree/iteration_check_2.c xas_for_each_marked(&xas, entry, ULONG_MAX, XA_MARK_0) xas 26 tools/testing/radix-tree/iteration_check_2.c assert(xas.xa_index >= 100); xas 18 tools/testing/radix-tree/multiorder.c XA_STATE_ORDER(xas, xa, index, order); xas 22 tools/testing/radix-tree/multiorder.c xas_lock(&xas); xas 23 tools/testing/radix-tree/multiorder.c xas_store(&xas, item); xas 24 tools/testing/radix-tree/multiorder.c xas_unlock(&xas); xas 25 tools/testing/radix-tree/multiorder.c } while (xas_nomem(&xas, GFP_KERNEL)); xas 27 tools/testing/radix-tree/multiorder.c if (!xas_error(&xas)) xas 31 tools/testing/radix-tree/multiorder.c return xas_error(&xas); xas 36 tools/testing/radix-tree/multiorder.c XA_STATE(xas, xa, 0); xas 56 tools/testing/radix-tree/multiorder.c xas_set(&xas, j); xas 57 tools/testing/radix-tree/multiorder.c xas_for_each(&xas, item, ULONG_MAX) { xas 62 tools/testing/radix-tree/multiorder.c assert((xas.xa_index | mask) == (index[i] | mask)); xas 63 tools/testing/radix-tree/multiorder.c assert(xas.xa_node->shift == shift); xas 76 tools/testing/radix-tree/multiorder.c XA_STATE(xas, xa, 0); xas 107 tools/testing/radix-tree/multiorder.c xas_set(&xas, j); xas 108 tools/testing/radix-tree/multiorder.c xas_for_each_marked(&xas, item, ULONG_MAX, XA_MARK_1) { xas 114 tools/testing/radix-tree/multiorder.c assert((xas.xa_index | mask) == (tag_index[i] | mask)); xas 135 tools/testing/radix-tree/multiorder.c xas_set(&xas, j); xas 136 tools/testing/radix-tree/multiorder.c xas_for_each_marked(&xas, item, ULONG_MAX, XA_MARK_2) { xas 141 tools/testing/radix-tree/multiorder.c assert((xas.xa_index | mask) == (tag_index[i] | mask)); xas 152 tools/testing/radix-tree/multiorder.c xas_set(&xas, 0); xas 153 tools/testing/radix-tree/multiorder.c xas_for_each_marked(&xas, item, ULONG_MAX, XA_MARK_0) { xas 154 tools/testing/radix-tree/multiorder.c assert(xas.xa_index == tag_index[i]); xas 182 tools/testing/radix-tree/multiorder.c XA_STATE(xas, ptr, 0); xas 187 tools/testing/radix-tree/multiorder.c xas_for_each(&xas, item, ULONG_MAX) { xas 188 tools/testing/radix-tree/multiorder.c if (xas_retry(&xas, item)) xas 191 tools/testing/radix-tree/multiorder.c item_sanity(item, xas.xa_index); xas 82 tools/testing/radix-tree/regression1.c XA_STATE(xas, &mt_tree, start); xas 87 tools/testing/radix-tree/regression1.c xas_for_each(&xas, page, ULONG_MAX) { xas 88 tools/testing/radix-tree/regression1.c if (xas_retry(&xas, page)) xas 99 tools/testing/radix-tree/regression1.c if (unlikely(page != xas_reload(&xas))) xas 108 tools/testing/radix-tree/regression1.c xas_reset(&xas); xas 176 tools/testing/radix-tree/test.c XA_STATE(xas, xa, start); xas 183 tools/testing/radix-tree/test.c xas_lock_irq(&xas); xas 184 tools/testing/radix-tree/test.c xas_for_each_marked(&xas, item, end, iftag) { xas 185 tools/testing/radix-tree/test.c xas_set_mark(&xas, thentag); xas 189 tools/testing/radix-tree/test.c xas_pause(&xas); xas 190 tools/testing/radix-tree/test.c xas_unlock_irq(&xas); xas 192 tools/testing/radix-tree/test.c xas_lock_irq(&xas); xas 194 tools/testing/radix-tree/test.c xas_unlock_irq(&xas); xas 257 tools/testing/radix-tree/test.c XA_STATE(xas, xa, 0); xas 260 tools/testing/radix-tree/test.c xas_for_each(&xas, entry, ULONG_MAX) { xas 262 tools/testing/radix-tree/test.c item_free(entry, xas.xa_index); xas 264 tools/testing/radix-tree/test.c xas_store(&xas, NULL);