From: Matthew Wilcox <willy@infradead.org> To: linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: Matthew Wilcox <mawilcox@microsoft.com> Subject: [PATCH 44/62] xfs: Convert m_perag_tree to XArray Date: Wed, 22 Nov 2017 13:07:21 -0800 [thread overview] Message-ID: <20171122210739.29916-45-willy@infradead.org> (raw) In-Reply-To: <20171122210739.29916-1-willy@infradead.org> From: Matthew Wilcox <mawilcox@microsoft.com> Getting rid of the m_perag_lock lets us also get rid of the call to radix_tree_preload(). This is a relatively naive conversion; we could improve performance over the radix tree implementation by passing around xa_state pointers instead of indices, possibly at the expense of extending rcu_read_lock() periods. Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com> --- fs/xfs/libxfs/xfs_sb.c | 9 ++++----- fs/xfs/xfs_icache.c | 35 +++++++++-------------------------- fs/xfs/xfs_icache.h | 6 +++--- fs/xfs/xfs_mount.c | 19 ++++--------------- fs/xfs/xfs_mount.h | 3 +-- 5 files changed, 21 insertions(+), 51 deletions(-) diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 9b5aae2bcc0b..811fa57007c9 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -59,7 +59,7 @@ xfs_perag_get( int ref = 0; rcu_read_lock(); - pag = radix_tree_lookup(&mp->m_perag_tree, agno); + pag = xa_load(&mp->m_perag_xa, agno); if (pag) { ASSERT(atomic_read(&pag->pag_ref) >= 0); ref = atomic_inc_return(&pag->pag_ref); @@ -78,14 +78,13 @@ xfs_perag_get_tag( xfs_agnumber_t first, int tag) { + XA_STATE(xas, first); struct xfs_perag *pag; - int found; int ref; rcu_read_lock(); - found = radix_tree_gang_lookup_tag(&mp->m_perag_tree, - (void **)&pag, first, 1, tag); - if (found <= 0) { + pag = xas_find_tag(&mp->m_perag_xa, &xas, ULONG_MAX, tag); + if (!pag) { rcu_read_unlock(); return NULL; } diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 43005fbe8b1e..f56e500d89e2 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -156,13 +156,10 @@ static void xfs_reclaim_work_queue( struct xfs_mount *mp) { - - rcu_read_lock(); - if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_RECLAIM_TAG)) { + if (xa_tagged(&mp->m_perag_xa, XFS_ICI_RECLAIM_TAG)) { queue_delayed_work(mp->m_reclaim_workqueue, &mp->m_reclaim_work, msecs_to_jiffies(xfs_syncd_centisecs / 6 * 10)); } - rcu_read_unlock(); } /* @@ -194,10 +191,7 @@ xfs_perag_set_reclaim_tag( return; /* propagate the reclaim tag up into the perag radix tree */ - spin_lock(&mp->m_perag_lock); - radix_tree_tag_set(&mp->m_perag_tree, pag->pag_agno, - XFS_ICI_RECLAIM_TAG); - spin_unlock(&mp->m_perag_lock); + xa_set_tag(&mp->m_perag_xa, pag->pag_agno, XFS_ICI_RECLAIM_TAG); /* schedule periodic background inode reclaim */ xfs_reclaim_work_queue(mp); @@ -216,10 +210,7 @@ xfs_perag_clear_reclaim_tag( return; /* clear the reclaim tag from the perag radix tree */ - spin_lock(&mp->m_perag_lock); - radix_tree_tag_clear(&mp->m_perag_tree, pag->pag_agno, - XFS_ICI_RECLAIM_TAG); - spin_unlock(&mp->m_perag_lock); + xa_clear_tag(&mp->m_perag_xa, pag->pag_agno, XFS_ICI_RECLAIM_TAG); trace_xfs_perag_clear_reclaim(mp, pag->pag_agno, -1, _RET_IP_); } @@ -847,12 +838,10 @@ void xfs_queue_eofblocks( struct xfs_mount *mp) { - rcu_read_lock(); - if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_EOFBLOCKS_TAG)) + if (xa_tagged(&mp->m_perag_xa, XFS_ICI_EOFBLOCKS_TAG)) queue_delayed_work(mp->m_eofblocks_workqueue, &mp->m_eofblocks_work, msecs_to_jiffies(xfs_eofb_secs * 1000)); - rcu_read_unlock(); } void @@ -874,12 +863,10 @@ STATIC void xfs_queue_cowblocks( struct xfs_mount *mp) { - rcu_read_lock(); - if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_COWBLOCKS_TAG)) + if (xa_tagged(&mp->m_perag_xa, XFS_ICI_COWBLOCKS_TAG)) queue_delayed_work(mp->m_eofblocks_workqueue, &mp->m_cowblocks_work, msecs_to_jiffies(xfs_cowb_secs * 1000)); - rcu_read_unlock(); } void @@ -1542,7 +1529,7 @@ __xfs_inode_set_eofblocks_tag( void (*execute)(struct xfs_mount *mp), void (*set_tp)(struct xfs_mount *mp, xfs_agnumber_t agno, int error, unsigned long caller_ip), - int tag) + xa_tag_t tag) { struct xfs_mount *mp = ip->i_mount; struct xfs_perag *pag; @@ -1566,11 +1553,9 @@ __xfs_inode_set_eofblocks_tag( XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), tag); if (!tagged) { /* propagate the eofblocks tag up into the perag radix tree */ - spin_lock(&ip->i_mount->m_perag_lock); - radix_tree_tag_set(&ip->i_mount->m_perag_tree, + xa_set_tag(&ip->i_mount->m_perag_xa, XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), tag); - spin_unlock(&ip->i_mount->m_perag_lock); /* kick off background trimming */ execute(ip->i_mount); @@ -1597,7 +1582,7 @@ __xfs_inode_clear_eofblocks_tag( xfs_inode_t *ip, void (*clear_tp)(struct xfs_mount *mp, xfs_agnumber_t agno, int error, unsigned long caller_ip), - int tag) + xa_tag_t tag) { struct xfs_mount *mp = ip->i_mount; struct xfs_perag *pag; @@ -1613,11 +1598,9 @@ __xfs_inode_clear_eofblocks_tag( XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), tag); if (!radix_tree_tagged(&pag->pag_ici_root, tag)) { /* clear the eofblocks tag from the perag radix tree */ - spin_lock(&ip->i_mount->m_perag_lock); - radix_tree_tag_clear(&ip->i_mount->m_perag_tree, + xa_clear_tag(&ip->i_mount->m_perag_xa, XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), tag); - spin_unlock(&ip->i_mount->m_perag_lock); clear_tp(ip->i_mount, pag->pag_agno, -1, _RET_IP_); } diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h index bff4d85e5498..bd04d5adadfe 100644 --- a/fs/xfs/xfs_icache.h +++ b/fs/xfs/xfs_icache.h @@ -37,9 +37,9 @@ struct xfs_eofblocks { */ #define XFS_ICI_NO_TAG (-1) /* special flag for an untagged lookup in xfs_inode_ag_iterator */ -#define XFS_ICI_RECLAIM_TAG 0 /* inode is to be reclaimed */ -#define XFS_ICI_EOFBLOCKS_TAG 1 /* inode has blocks beyond EOF */ -#define XFS_ICI_COWBLOCKS_TAG 2 /* inode can have cow blocks to gc */ +#define XFS_ICI_RECLAIM_TAG XA_TAG_0 /* inode is to be reclaimed */ +#define XFS_ICI_EOFBLOCKS_TAG XA_TAG_1 /* inode has blocks beyond EOF */ +#define XFS_ICI_COWBLOCKS_TAG XA_TAG_2 /* inode can have cow blocks to gc */ /* * Flags for xfs_iget() diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index c879b517cc94..ae90f6f8fa5c 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -156,9 +156,7 @@ xfs_free_perag( struct xfs_perag *pag; for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) { - spin_lock(&mp->m_perag_lock); - pag = radix_tree_delete(&mp->m_perag_tree, agno); - spin_unlock(&mp->m_perag_lock); + pag = xa_store(&mp->m_perag_xa, agno, NULL, GFP_NOWAIT); ASSERT(pag); ASSERT(atomic_read(&pag->pag_ref) == 0); xfs_buf_hash_destroy(pag); @@ -219,19 +217,11 @@ xfs_initialize_perag( goto out_free_pag; init_waitqueue_head(&pag->pagb_wait); - if (radix_tree_preload(GFP_NOFS)) - goto out_hash_destroy; - - spin_lock(&mp->m_perag_lock); - if (radix_tree_insert(&mp->m_perag_tree, index, pag)) { + if (xa_store(&mp->m_perag_xa, index, pag, GFP_NOFS)) { BUG(); - spin_unlock(&mp->m_perag_lock); - radix_tree_preload_end(); error = -EEXIST; goto out_hash_destroy; } - spin_unlock(&mp->m_perag_lock); - radix_tree_preload_end(); /* first new pag is fully initialized */ if (first_initialised == NULLAGNUMBER) first_initialised = index; @@ -252,7 +242,7 @@ xfs_initialize_perag( out_unwind_new_pags: /* unwind any prior newly initialized pags */ for (index = first_initialised; index < agcount; index++) { - pag = radix_tree_delete(&mp->m_perag_tree, index); + pag = xa_store(&mp->m_perag_xa, index, NULL, GFP_NOWAIT); if (!pag) break; xfs_buf_hash_destroy(pag); @@ -816,8 +806,7 @@ xfs_mountfs( /* * Allocate and initialize the per-ag data. */ - spin_lock_init(&mp->m_perag_lock); - INIT_RADIX_TREE(&mp->m_perag_tree, GFP_ATOMIC); + xa_init(&mp->m_perag_xa); error = xfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi); if (error) { xfs_warn(mp, "Failed per-ag init: %d", error); diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index e0792d036be2..6e5ad7b26f46 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -134,8 +134,7 @@ typedef struct xfs_mount { xfs_extlen_t m_ag_prealloc_blocks; /* reserved ag blocks */ uint m_alloc_set_aside; /* space we can't use */ uint m_ag_max_usable; /* max space per AG */ - struct radix_tree_root m_perag_tree; /* per-ag accounting info */ - spinlock_t m_perag_lock; /* lock for m_perag_tree */ + struct xarray m_perag_xa; /* per-ag accounting info */ struct mutex m_growlock; /* growfs mutex */ int m_fixedfsid[2]; /* unchanged for life of FS */ uint m_dmevmask; /* DMI events for this FS */ -- 2.15.0
WARNING: multiple messages have this Message-ID (diff)
From: Matthew Wilcox <willy@infradead.org> To: linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: Matthew Wilcox <mawilcox@microsoft.com> Subject: [PATCH 44/62] xfs: Convert m_perag_tree to XArray Date: Wed, 22 Nov 2017 13:07:21 -0800 [thread overview] Message-ID: <20171122210739.29916-45-willy@infradead.org> (raw) In-Reply-To: <20171122210739.29916-1-willy@infradead.org> From: Matthew Wilcox <mawilcox@microsoft.com> Getting rid of the m_perag_lock lets us also get rid of the call to radix_tree_preload(). This is a relatively naive conversion; we could improve performance over the radix tree implementation by passing around xa_state pointers instead of indices, possibly at the expense of extending rcu_read_lock() periods. Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com> --- fs/xfs/libxfs/xfs_sb.c | 9 ++++----- fs/xfs/xfs_icache.c | 35 +++++++++-------------------------- fs/xfs/xfs_icache.h | 6 +++--- fs/xfs/xfs_mount.c | 19 ++++--------------- fs/xfs/xfs_mount.h | 3 +-- 5 files changed, 21 insertions(+), 51 deletions(-) diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 9b5aae2bcc0b..811fa57007c9 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -59,7 +59,7 @@ xfs_perag_get( int ref = 0; rcu_read_lock(); - pag = radix_tree_lookup(&mp->m_perag_tree, agno); + pag = xa_load(&mp->m_perag_xa, agno); if (pag) { ASSERT(atomic_read(&pag->pag_ref) >= 0); ref = atomic_inc_return(&pag->pag_ref); @@ -78,14 +78,13 @@ xfs_perag_get_tag( xfs_agnumber_t first, int tag) { + XA_STATE(xas, first); struct xfs_perag *pag; - int found; int ref; rcu_read_lock(); - found = radix_tree_gang_lookup_tag(&mp->m_perag_tree, - (void **)&pag, first, 1, tag); - if (found <= 0) { + pag = xas_find_tag(&mp->m_perag_xa, &xas, ULONG_MAX, tag); + if (!pag) { rcu_read_unlock(); return NULL; } diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 43005fbe8b1e..f56e500d89e2 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -156,13 +156,10 @@ static void xfs_reclaim_work_queue( struct xfs_mount *mp) { - - rcu_read_lock(); - if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_RECLAIM_TAG)) { + if (xa_tagged(&mp->m_perag_xa, XFS_ICI_RECLAIM_TAG)) { queue_delayed_work(mp->m_reclaim_workqueue, &mp->m_reclaim_work, msecs_to_jiffies(xfs_syncd_centisecs / 6 * 10)); } - rcu_read_unlock(); } /* @@ -194,10 +191,7 @@ xfs_perag_set_reclaim_tag( return; /* propagate the reclaim tag up into the perag radix tree */ - spin_lock(&mp->m_perag_lock); - radix_tree_tag_set(&mp->m_perag_tree, pag->pag_agno, - XFS_ICI_RECLAIM_TAG); - spin_unlock(&mp->m_perag_lock); + xa_set_tag(&mp->m_perag_xa, pag->pag_agno, XFS_ICI_RECLAIM_TAG); /* schedule periodic background inode reclaim */ xfs_reclaim_work_queue(mp); @@ -216,10 +210,7 @@ xfs_perag_clear_reclaim_tag( return; /* clear the reclaim tag from the perag radix tree */ - spin_lock(&mp->m_perag_lock); - radix_tree_tag_clear(&mp->m_perag_tree, pag->pag_agno, - XFS_ICI_RECLAIM_TAG); - spin_unlock(&mp->m_perag_lock); + xa_clear_tag(&mp->m_perag_xa, pag->pag_agno, XFS_ICI_RECLAIM_TAG); trace_xfs_perag_clear_reclaim(mp, pag->pag_agno, -1, _RET_IP_); } @@ -847,12 +838,10 @@ void xfs_queue_eofblocks( struct xfs_mount *mp) { - rcu_read_lock(); - if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_EOFBLOCKS_TAG)) + if (xa_tagged(&mp->m_perag_xa, XFS_ICI_EOFBLOCKS_TAG)) queue_delayed_work(mp->m_eofblocks_workqueue, &mp->m_eofblocks_work, msecs_to_jiffies(xfs_eofb_secs * 1000)); - rcu_read_unlock(); } void @@ -874,12 +863,10 @@ STATIC void xfs_queue_cowblocks( struct xfs_mount *mp) { - rcu_read_lock(); - if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_COWBLOCKS_TAG)) + if (xa_tagged(&mp->m_perag_xa, XFS_ICI_COWBLOCKS_TAG)) queue_delayed_work(mp->m_eofblocks_workqueue, &mp->m_cowblocks_work, msecs_to_jiffies(xfs_cowb_secs * 1000)); - rcu_read_unlock(); } void @@ -1542,7 +1529,7 @@ __xfs_inode_set_eofblocks_tag( void (*execute)(struct xfs_mount *mp), void (*set_tp)(struct xfs_mount *mp, xfs_agnumber_t agno, int error, unsigned long caller_ip), - int tag) + xa_tag_t tag) { struct xfs_mount *mp = ip->i_mount; struct xfs_perag *pag; @@ -1566,11 +1553,9 @@ __xfs_inode_set_eofblocks_tag( XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), tag); if (!tagged) { /* propagate the eofblocks tag up into the perag radix tree */ - spin_lock(&ip->i_mount->m_perag_lock); - radix_tree_tag_set(&ip->i_mount->m_perag_tree, + xa_set_tag(&ip->i_mount->m_perag_xa, XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), tag); - spin_unlock(&ip->i_mount->m_perag_lock); /* kick off background trimming */ execute(ip->i_mount); @@ -1597,7 +1582,7 @@ __xfs_inode_clear_eofblocks_tag( xfs_inode_t *ip, void (*clear_tp)(struct xfs_mount *mp, xfs_agnumber_t agno, int error, unsigned long caller_ip), - int tag) + xa_tag_t tag) { struct xfs_mount *mp = ip->i_mount; struct xfs_perag *pag; @@ -1613,11 +1598,9 @@ __xfs_inode_clear_eofblocks_tag( XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), tag); if (!radix_tree_tagged(&pag->pag_ici_root, tag)) { /* clear the eofblocks tag from the perag radix tree */ - spin_lock(&ip->i_mount->m_perag_lock); - radix_tree_tag_clear(&ip->i_mount->m_perag_tree, + xa_clear_tag(&ip->i_mount->m_perag_xa, XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), tag); - spin_unlock(&ip->i_mount->m_perag_lock); clear_tp(ip->i_mount, pag->pag_agno, -1, _RET_IP_); } diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h index bff4d85e5498..bd04d5adadfe 100644 --- a/fs/xfs/xfs_icache.h +++ b/fs/xfs/xfs_icache.h @@ -37,9 +37,9 @@ struct xfs_eofblocks { */ #define XFS_ICI_NO_TAG (-1) /* special flag for an untagged lookup in xfs_inode_ag_iterator */ -#define XFS_ICI_RECLAIM_TAG 0 /* inode is to be reclaimed */ -#define XFS_ICI_EOFBLOCKS_TAG 1 /* inode has blocks beyond EOF */ -#define XFS_ICI_COWBLOCKS_TAG 2 /* inode can have cow blocks to gc */ +#define XFS_ICI_RECLAIM_TAG XA_TAG_0 /* inode is to be reclaimed */ +#define XFS_ICI_EOFBLOCKS_TAG XA_TAG_1 /* inode has blocks beyond EOF */ +#define XFS_ICI_COWBLOCKS_TAG XA_TAG_2 /* inode can have cow blocks to gc */ /* * Flags for xfs_iget() diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index c879b517cc94..ae90f6f8fa5c 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -156,9 +156,7 @@ xfs_free_perag( struct xfs_perag *pag; for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) { - spin_lock(&mp->m_perag_lock); - pag = radix_tree_delete(&mp->m_perag_tree, agno); - spin_unlock(&mp->m_perag_lock); + pag = xa_store(&mp->m_perag_xa, agno, NULL, GFP_NOWAIT); ASSERT(pag); ASSERT(atomic_read(&pag->pag_ref) == 0); xfs_buf_hash_destroy(pag); @@ -219,19 +217,11 @@ xfs_initialize_perag( goto out_free_pag; init_waitqueue_head(&pag->pagb_wait); - if (radix_tree_preload(GFP_NOFS)) - goto out_hash_destroy; - - spin_lock(&mp->m_perag_lock); - if (radix_tree_insert(&mp->m_perag_tree, index, pag)) { + if (xa_store(&mp->m_perag_xa, index, pag, GFP_NOFS)) { BUG(); - spin_unlock(&mp->m_perag_lock); - radix_tree_preload_end(); error = -EEXIST; goto out_hash_destroy; } - spin_unlock(&mp->m_perag_lock); - radix_tree_preload_end(); /* first new pag is fully initialized */ if (first_initialised == NULLAGNUMBER) first_initialised = index; @@ -252,7 +242,7 @@ xfs_initialize_perag( out_unwind_new_pags: /* unwind any prior newly initialized pags */ for (index = first_initialised; index < agcount; index++) { - pag = radix_tree_delete(&mp->m_perag_tree, index); + pag = xa_store(&mp->m_perag_xa, index, NULL, GFP_NOWAIT); if (!pag) break; xfs_buf_hash_destroy(pag); @@ -816,8 +806,7 @@ xfs_mountfs( /* * Allocate and initialize the per-ag data. */ - spin_lock_init(&mp->m_perag_lock); - INIT_RADIX_TREE(&mp->m_perag_tree, GFP_ATOMIC); + xa_init(&mp->m_perag_xa); error = xfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi); if (error) { xfs_warn(mp, "Failed per-ag init: %d", error); diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index e0792d036be2..6e5ad7b26f46 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -134,8 +134,7 @@ typedef struct xfs_mount { xfs_extlen_t m_ag_prealloc_blocks; /* reserved ag blocks */ uint m_alloc_set_aside; /* space we can't use */ uint m_ag_max_usable; /* max space per AG */ - struct radix_tree_root m_perag_tree; /* per-ag accounting info */ - spinlock_t m_perag_lock; /* lock for m_perag_tree */ + struct xarray m_perag_xa; /* per-ag accounting info */ struct mutex m_growlock; /* growfs mutex */ int m_fixedfsid[2]; /* unchanged for life of FS */ uint m_dmevmask; /* DMI events for this FS */ -- 2.15.0 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2017-11-22 21:12 UTC|newest] Thread overview: 159+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-11-22 21:06 [PATCH 00/62] XArray November 2017 Edition Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 01/62] tools: Make __test_and_clear_bit available Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 02/62] radix tree test suite: Remove ARRAY_SIZE Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 03/62] radix tree test suite: Check reclaim bit Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 04/62] idr test suite: Fix ida_test_random() Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 05/62] radix tree: Add a missing cast to gfp_t Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:28 ` Luc Van Oostenryck 2017-11-22 21:28 ` Luc Van Oostenryck 2017-11-22 22:24 ` Matthew Wilcox 2017-11-22 22:24 ` Matthew Wilcox 2017-11-22 22:35 ` Luc Van Oostenryck 2017-11-22 22:35 ` Luc Van Oostenryck 2017-11-22 21:06 ` [PATCH 06/62] idr: Make cursor explicit for cyclic allocation Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 07/62] idr: Rewrite extended IDR API Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 08/62] Explicitly include radix-tree.h Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 09/62] arm64: Turn flush_dcache_mmap_lock into a no-op Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 10/62] unicore32: " Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 11/62] Export __set_page_dirty Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 12/62] xfs: Rename xa_ elements to ail_ Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 13/62] fscache: Use appropriate radix tree accessors Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 14/62] xarray: Add the xa_lock to the radix_tree_root Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 15/62] page cache: Use xa_lock Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 16/62] xarray: Replace exceptional entries Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 17/62] xarray: Change definition of sibling entries Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 18/62] xarray: Add definition of struct xarray Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 19/62] xarray: Define struct xa_node Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 20/62] xarray: Add xa_load Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 21/62] xarray: Add xa_get_tag, xa_set_tag and xa_clear_tag Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:06 ` [PATCH 22/62] xarray: Add xa_store Matthew Wilcox 2017-11-22 21:06 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 23/62] xarray: Add xa_cmpxchg Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 24/62] xarray: Add xa_for_each Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 25/62] xarray: Add xa_init Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 26/62] xarray: Add xas_for_each_tag Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 27/62] xarray: Add xa_get_entries and xa_get_tagged Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 28/62] xarray: Add xa_destroy Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 29/62] xarray: Add xas_prev_any Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 30/62] xarray: Add xas_find_any / xas_next_any Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 31/62] Convert IDR to use xarray Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 32/62] ida: Convert to using xarray Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 33/62] page cache: Convert page_cache_next_hole to XArray Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 34/62] page cache: Use xarray for adding pages Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 35/62] page cache: Convert page_cache_tree_delete to xarray Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 36/62] page cache: Convert find_get_entry " Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 37/62] shmem: Convert replace " Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 38/62] shmem: Convert shmem_confirm_swap to XArray Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 39/62] shmem: Convert find_swap_entry " Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 40/62] shmem: Convert shmem_tag_pins " Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 41/62] shmem: Convert shmem_wait_for_pins " Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 42/62] vmalloc: Convert to xarray Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 43/62] brd: Convert to XArray Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox [this message] 2017-11-22 21:07 ` [PATCH 44/62] xfs: Convert m_perag_tree " Matthew Wilcox 2017-11-22 21:07 ` [PATCH 45/62] xfs: Convert pag_ici_root " Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 46/62] xfs: Convert xfs dquot " Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 47/62] xfs: Convert mru cache " Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 48/62] block: Remove IDR preloading Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 49/62] rxrpc: " Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 50/62] cgroup: Remove IDR wrappers Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 51/62] dca: Remove idr_preload calls Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 52/62] ipc: Remove call to idr_preload Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 53/62] irq: " Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 54/62] scsi: Remove idr_preload in st driver Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 55/62] firewire: Remove call to idr_preload Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 56/62] drm: Remove drm_minor_lock and idr_preload Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 57/62] drm: Remove drm_syncobj_fd_to_handle Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 58/62] drm: Remove qxl driver IDR locks Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 59/62] drm: Replace virtio IDRs with IDAs Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 60/62] drm: Replace vmwgfx " Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 61/62] net: Redesign act_api use of IDR Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-22 21:07 ` [PATCH 62/62] mm: Convert page-writeback to XArray Matthew Wilcox 2017-11-22 21:07 ` Matthew Wilcox 2017-11-23 1:25 ` [PATCH 00/62] XArray November 2017 Edition Dave Chinner 2017-11-23 1:25 ` Dave Chinner 2017-11-23 2:46 ` Matthew Wilcox 2017-11-23 2:46 ` Matthew Wilcox 2017-11-24 1:16 ` XArray documentation Matthew Wilcox 2017-11-24 1:16 ` Matthew Wilcox 2017-11-24 4:30 ` Andreas Dilger 2017-11-24 17:17 ` Matthew Wilcox 2017-11-24 17:17 ` Matthew Wilcox 2017-11-24 16:50 ` Martin Steigerwald 2017-11-24 16:50 ` Martin Steigerwald 2017-11-24 17:03 ` Matthew Wilcox 2017-11-24 17:03 ` Matthew Wilcox 2017-11-24 17:03 ` Matthew Wilcox 2017-11-24 18:01 ` Martin Steigerwald 2017-11-24 18:01 ` Martin Steigerwald 2017-11-24 19:48 ` Shakeel Butt 2017-11-24 19:48 ` Shakeel Butt 2017-11-24 19:56 ` Matthew Wilcox 2017-11-24 19:56 ` Matthew Wilcox 2017-11-24 21:18 ` Matthew Wilcox 2017-11-24 21:18 ` Matthew Wilcox 2017-11-24 21:18 ` Matthew Wilcox 2017-11-24 22:02 ` Martin Steigerwald 2017-11-24 22:02 ` Martin Steigerwald 2017-11-24 22:08 ` Matthew Wilcox 2017-11-24 22:08 ` Matthew Wilcox
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20171122210739.29916-45-willy@infradead.org \ --to=willy@infradead.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=mawilcox@microsoft.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.