[PATCH v6 00/99] XArray version 6

From: Matthew Wilcox
Date: Wed Jan 17 2018 - 16:11:58 EST


From: Matthew Wilcox <mawilcox@xxxxxxxxxxxxx>

This version of the XArray has no known bugs. I have converted the
radix tree test suite entirely over to the XArray and fixed all bugs
that it has uncovered. There are additional tests in the test suite for
the XArray, so I now claim the XArray has better test coverage than the
Radix Tree did. Of course, that is not the same thing as fewer bugs,
but it now stands up to the tender embraces of Trinity without crashing.

You can get this version from my git tree here:
http://git.infradead.org/users/willy/linux-dax.git/shortlog/refs/heads/xarray-2018-01-09
which includes a number of other patches that are at least tangentially
related to this patch set.

Most of the work I've done recently has been converting additional users
from the radix tree to the XArray. That's going pretty well; still 24
radix tree users left to convert. It's been worth doing because I've
spotted several common patterns that have led to changes (the lock_type,
reserve/release) and some common patterns that I'll add support for
later (chaining multiple entries from a single index, wanting to use
64-bit indices on 32-bit machines, having an array of XArrays, various
workarounds for not having range entries yet).

As far as line count goes, for the whole git tree, we're at:
212 files changed, 7764 insertions(+), 7002 deletions(-)
with another 1376 lines to delete from radix-tree.[ch]. That doesn't take
into account the 371 lines of xarray.rst, the 587 lines of xarray-test.c,
and the fact that almost half of lib/xarray.c and include/linux/xarray.h
is documentation.

Changes since version 5:

- Rebased to 4.15-rc8

API changes:
- Renamed __xa_init() to xa_init_flags().
- Added DEFINE_XARRAY_FLAGS().
- Renamed xa_ctx to xa_lock_type; store it in the XA_FLAGS and use separate
locking classes for each type so that lockdep doesn't emit spurious
warnings. It also reduces the amount of boilerplate.
- Combined __xa_store_bh, __xa_store_irq and __xa_store into __xa_store().
- Ditto for __xa_cmpxchg().
- Renamed xa_store_empty() to xa_insert().
- Added __xa_insert().
- Added xa_reserve() and xa_release().
- Renamed XA_NO_TAG to XA_PRESENT.
- Combined xa_get_entries(), xa_get_tagged() and xa_get_maybe_tag()
into xa_extract().
- Added 'filter' argument to xa_find(), xa_find_after() and xa_for_each()
to match xa_extract() and provide the functionality that would
have otherwise had to be added in the form of xa_find_tag(),
xa_find_tag_after() and xa_for_each_tag().
- Replaced workingset_lookup_update() with mapping_set_update().
- Renamed page_cache_tree_delete() to page_cache_delete().

New xarray users:
- Converted SuperH interrupt controller radix tree to XArray.
- Converted blk-cgroup radix tree to XArray.
- Converted blk-ioc radix tree to XArray.
- Converted i915 handles_vma radix tree to XArray.
- Converted s390 gmap radix trees to XArray.
- Converted hwspinlock to XArray.
- Converted btrfs fs_roots to XArray.
- Converted btrfs reada_zones to XArray.
- Converted btrfs reada_extents to XArray.
- Converted btrfs reada_tree to XArray.
- Converted btrfs buffer_radix to XArray.
- Converted btrfs delayed_nodes to XArray.
- Converted btrfs name_cache to XArray.
- Converted f2fs pids radix tree to XArray.
- Converted f2fs ino_root radix tree to XArray.
- Converted f2fs extent_tree to XArray.
- Converted f2fs gclist radix tree to XArray.
- Converted dma-debug active cacheline radix tree to XArray.
- Converted Xen pvcalls-back socketpass_mappings to XArray.
- Converted net/qrtr radix tree to XArray.
- Converted null_blk radix trees to XArray.

Documentation:
- Added a bit more internals documentation.
- Rewrote xa_init_flags documentation.
- Added the __xa_ functions to the locking table.
- Rewrote the section on using the __xa_ functions.

Internal changes:
- Free up the bottom four bits of the xa_flags, since these are not
valid GFP flags to pass to kmem_cache_alloc().
- Moved the XA_FLAGS_TRACK_FREE bit to the bottom bits of the flags to leave
space for more tags (later).
- Fixed multiple bugs in xas_find() and xas_find_tag().
- Fixed bug in shrinking XArray (and add a test case that exercises it).
- Fixed bug in erasing multi-index entries.
- Fixed a compile warning with CONFIG_RADIX_TREE_MULTIORDER=n.
- Added an xas_update() helper.
- Use ->array to track an xa_node's state through its lifecycle
(allocated -> rcu_free -> actually free).
- Made XA_BUG_ON dump the entire tree while XA_NODE_BUG_ON dumps only the
node that appears suspect.
- Fixed debugging printks to use %px and pr_cont/pr_info etc.
- Renamed some internal tag functions.
- Moved xa_track_free() from xarray.h to xarray.c.

Test suite:
- Added new tests for xas_find() and xas_find_tag().
- Added new tests for the update_node functionality.
- Converted the radix tree test suite to the xarray API.

Matthew Wilcox (99):
xarray: Add the xa_lock to the radix_tree_root
page cache: Use xa_lock
xarray: Replace exceptional entries
xarray: Change definition of sibling entries
xarray: Add definition of struct xarray
xarray: Define struct xa_node
xarray: Add documentation
xarray: Add xa_load
xarray: Add xa_get_tag, xa_set_tag and xa_clear_tag
xarray: Add xa_store
xarray: Add xa_cmpxchg and xa_insert
xarray: Add xa_for_each
xarray: Add xa_extract
xarray: Add xa_destroy
xarray: Add xas_next and xas_prev
xarray: Add xas_create_range
xarray: Add MAINTAINERS entry
xarray: Add ability to store errno values
idr: Convert to XArray
ida: Convert to XArray
xarray: Add xa_reserve and xa_release
page cache: Convert hole search to XArray
page cache: Add page_cache_range_empty function
page cache: Add and replace pages using the XArray
page cache: Convert page deletion to XArray
page cache: Convert page cache lookups to XArray
page cache: Convert delete_batch to XArray
page cache: Remove stray radix comment
page cache: Convert filemap_range_has_page to XArray
mm: Convert page-writeback to XArray
mm: Convert workingset to XArray
mm: Convert truncate to XArray
mm: Convert add_to_swap_cache to XArray
mm: Convert delete_from_swap_cache to XArray
mm: Convert __do_page_cache_readahead to XArray
mm: Convert page migration to XArray
mm: Convert huge_memory to XArray
mm: Convert collapse_shmem to XArray
mm: Convert khugepaged_scan_shmem to XArray
pagevec: Use xa_tag_t
shmem: Convert replace to XArray
shmem: Convert shmem_confirm_swap to XArray
shmem: Convert find_swap_entry to XArray
shmem: Convert shmem_tag_pins to XArray
shmem: Convert shmem_wait_for_pins to XArray
shmem: Convert shmem_add_to_page_cache to XArray
shmem: Convert shmem_alloc_hugepage to XArray
shmem: Convert shmem_free_swap to XArray
shmem: Convert shmem_partial_swap_usage to XArray
shmem: Comment fixups
btrfs: Convert page cache to XArray
fs: Convert buffer to XArray
fs: Convert writeback to XArray
nilfs2: Convert to XArray
f2fs: Convert to XArray
lustre: Convert to XArray
dax: Convert dax_unlock_mapping_entry to XArray
dax: Convert lock_slot to XArray
dax: More XArray conversion
dax: Convert __dax_invalidate_mapping_entry to XArray
dax: Convert dax_writeback_one to XArray
dax: Convert dax_insert_pfn_mkwrite to XArray
dax: Convert dax_insert_mapping_entry to XArray
dax: Convert grab_mapping_entry to XArray
dax: Fix sparse warning
page cache: Finish XArray conversion
mm: Convert cgroup writeback to XArray
vmalloc: Convert to XArray
brd: Convert to XArray
xfs: Convert m_perag_tree to XArray
xfs: Convert pag_ici_root to XArray
xfs: Convert xfs dquot to XArray
xfs: Convert mru cache to XArray
usb: Convert xhci-mem to XArray
md: Convert raid5-cache to XArray
irqdomain: Convert to XArray
fscache: Convert to XArray
sh: intc: Convert to XArray
blk-cgroup: Convert to XArray
blk-ioc: Convert to XArray
i915: Convert handles_vma to XArray
s390: Convert gmap to XArray
hwspinlock: Convert to XArray
btrfs: Convert fs_roots_radix to XArray
btrfs: Remove unused spinlock
btrfs: Convert reada_zones to XArray
btrfs: Convert reada_extents to XArray
btrfs: Convert reada_tree to XArray
btrfs: Convert buffer_radix to XArray
btrfs: Convert delayed_nodes_tree to XArray
btrfs: Convert name_cache to XArray
f2fs: Convert pids radix tree to XArray
f2fs: Convert ino_root to XArray
f2fs: Convert extent_tree_root to XArray
f2fs: Convert gclist.iroot to XArray
dma-debug: Convert to XArray
xen: Convert pvcalls-back to XArray
qrtr: Convert to XArray
null_blk: Convert to XArray

Documentation/cgroup-v1/memory.txt | 2 +-
Documentation/core-api/index.rst | 1 +
Documentation/core-api/xarray.rst | 371 +++++
Documentation/vm/page_migration | 14 +-
MAINTAINERS | 12 +
arch/arm/include/asm/cacheflush.h | 6 +-
arch/nios2/include/asm/cacheflush.h | 6 +-
arch/parisc/include/asm/cacheflush.h | 6 +-
arch/powerpc/include/asm/book3s/64/pgtable.h | 4 +-
arch/powerpc/include/asm/nohash/64/pgtable.h | 4 +-
arch/s390/include/asm/gmap.h | 12 +-
arch/s390/mm/gmap.c | 133 +-
block/bfq-cgroup.c | 4 +-
block/blk-cgroup.c | 52 +-
block/blk-ioc.c | 13 +-
block/cfq-iosched.c | 4 +-
drivers/block/brd.c | 93 +-
drivers/block/null_blk.c | 87 +-
drivers/gpu/drm/i915/i915_gem.c | 19 +-
drivers/gpu/drm/i915/i915_gem_context.c | 12 +-
drivers/gpu/drm/i915/i915_gem_context.h | 4 +-
drivers/gpu/drm/i915/i915_gem_execbuffer.c | 6 +-
drivers/gpu/drm/i915/selftests/mock_context.c | 2 +-
drivers/hwspinlock/hwspinlock_core.c | 151 +-
drivers/md/raid5-cache.c | 119 +-
drivers/sh/intc/core.c | 9 +-
drivers/sh/intc/internals.h | 5 +-
drivers/sh/intc/virq.c | 72 +-
drivers/staging/lustre/lustre/llite/glimpse.c | 12 +-
drivers/staging/lustre/lustre/mdc/mdc_request.c | 16 +-
drivers/usb/host/xhci-mem.c | 68 +-
drivers/usb/host/xhci.h | 6 +-
drivers/xen/pvcalls-back.c | 51 +-
fs/afs/write.c | 9 +-
fs/btrfs/btrfs_inode.h | 7 +-
fs/btrfs/compression.c | 6 +-
fs/btrfs/ctree.h | 31 +-
fs/btrfs/delayed-inode.c | 65 +-
fs/btrfs/disk-io.c | 73 +-
fs/btrfs/extent_io.c | 106 +-
fs/btrfs/inode.c | 72 +-
fs/btrfs/reada.c | 205 ++-
fs/btrfs/send.c | 19 +-
fs/btrfs/tests/btrfs-tests.c | 29 +-
fs/btrfs/transaction.c | 87 +-
fs/btrfs/volumes.c | 5 +-
fs/btrfs/volumes.h | 5 +-
fs/buffer.c | 25 +-
fs/cifs/file.c | 9 +-
fs/dax.c | 383 ++---
fs/ext4/inode.c | 2 +-
fs/f2fs/checkpoint.c | 85 +-
fs/f2fs/data.c | 9 +-
fs/f2fs/dir.c | 5 +-
fs/f2fs/extent_cache.c | 59 +-
fs/f2fs/f2fs.h | 6 +-
fs/f2fs/gc.c | 14 +-
fs/f2fs/gc.h | 2 +-
fs/f2fs/inline.c | 6 +-
fs/f2fs/node.c | 10 +-
fs/f2fs/super.c | 2 -
fs/f2fs/trace.c | 60 +-
fs/f2fs/trace.h | 2 -
fs/fs-writeback.c | 37 +-
fs/fscache/cookie.c | 6 +-
fs/fscache/internal.h | 2 +-
fs/fscache/object.c | 2 +-
fs/fscache/page.c | 152 +-
fs/fscache/stats.c | 6 +-
fs/gfs2/aops.c | 2 +-
fs/inode.c | 11 +-
fs/nfs/blocklayout/blocklayout.c | 2 +-
fs/nilfs2/btnode.c | 41 +-
fs/nilfs2/page.c | 78 +-
fs/proc/task_mmu.c | 2 +-
fs/xfs/libxfs/xfs_sb.c | 11 +-
fs/xfs/libxfs/xfs_sb.h | 2 +-
fs/xfs/xfs_dquot.c | 38 +-
fs/xfs/xfs_icache.c | 146 +-
fs/xfs/xfs_icache.h | 11 +-
fs/xfs/xfs_inode.c | 24 +-
fs/xfs/xfs_mount.c | 22 +-
fs/xfs/xfs_mount.h | 6 +-
fs/xfs/xfs_mru_cache.c | 72 +-
fs/xfs/xfs_qm.c | 36 +-
fs/xfs/xfs_qm.h | 18 +-
include/linux/backing-dev-defs.h | 2 +-
include/linux/backing-dev.h | 14 +-
include/linux/blk-cgroup.h | 5 +-
include/linux/fs.h | 68 +-
include/linux/fscache.h | 8 +-
include/linux/idr.h | 168 ++-
include/linux/iocontext.h | 6 +-
include/linux/irqdomain.h | 10 +-
include/linux/mm.h | 17 +-
include/linux/pagemap.h | 16 +-
include/linux/pagevec.h | 8 +-
include/linux/radix-tree.h | 97 +-
include/linux/swap.h | 22 +-
include/linux/swapops.h | 19 +-
include/linux/xarray.h | 1052 ++++++++++++++
kernel/irq/irqdomain.c | 39 +-
kernel/pid.c | 2 +-
lib/Makefile | 2 +-
lib/dma-debug.c | 105 +-
lib/idr.c | 633 ++++----
lib/radix-tree.c | 399 ++----
lib/xarray.c | 1753 +++++++++++++++++++++++
mm/backing-dev.c | 22 +-
mm/filemap.c | 766 ++++------
mm/huge_memory.c | 23 +-
mm/khugepaged.c | 182 +--
mm/madvise.c | 2 +-
mm/memcontrol.c | 6 +-
mm/memory.c | 16 +-
mm/migrate.c | 41 +-
mm/mincore.c | 2 +-
mm/page-writeback.c | 78 +-
mm/readahead.c | 10 +-
mm/rmap.c | 4 +-
mm/shmem.c | 312 ++--
mm/swap.c | 6 +-
mm/swap_state.c | 124 +-
mm/truncate.c | 45 +-
mm/vmalloc.c | 39 +-
mm/vmscan.c | 14 +-
mm/workingset.c | 89 +-
net/qrtr/qrtr.c | 21 +-
tools/include/linux/spinlock.h | 12 +-
tools/testing/radix-tree/.gitignore | 2 +
tools/testing/radix-tree/Makefile | 15 +-
tools/testing/radix-tree/idr-test.c | 40 +-
tools/testing/radix-tree/linux/bug.h | 1 +
tools/testing/radix-tree/linux/kconfig.h | 1 +
tools/testing/radix-tree/linux/kernel.h | 5 +
tools/testing/radix-tree/linux/lockdep.h | 11 +
tools/testing/radix-tree/linux/rcupdate.h | 2 +
tools/testing/radix-tree/linux/xarray.h | 3 +
tools/testing/radix-tree/multiorder.c | 83 +-
tools/testing/radix-tree/regression1.c | 68 +-
tools/testing/radix-tree/test.c | 53 +-
tools/testing/radix-tree/test.h | 6 +
tools/testing/radix-tree/xarray-test.c | 587 ++++++++
143 files changed, 6647 insertions(+), 3990 deletions(-)
create mode 100644 Documentation/core-api/xarray.rst
create mode 100644 include/linux/xarray.h
create mode 100644 lib/xarray.c
create mode 100644 tools/testing/radix-tree/linux/kconfig.h
create mode 100644 tools/testing/radix-tree/linux/lockdep.h
create mode 100644 tools/testing/radix-tree/linux/xarray.h
create mode 100644 tools/testing/radix-tree/xarray-test.c

--
2.15.1