From: Matthew Wilcox <willy@infradead.org> To: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Matthew Wilcox <willy@infradead.org>, Jan Kara <jack@suse.cz>, Jeff Layton <jlayton@redhat.com>, Lukas Czerner <lczerner@redhat.com>, Ross Zwisler <ross.zwisler@linux.intel.com>, Christoph Hellwig <hch@lst.de>, Goldwyn Rodrigues <rgoldwyn@suse.com>, Nicholas Piggin <npiggin@gmail.com>, Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>, linux-nilfs@vger.kernel.org, Jaegeuk Kim <jaegeuk@kernel.org>, Chao Yu <yuchao0@huawei.com>, linux-f2fs-devel@lists.sourceforge.net Subject: [PATCH v14 17/74] xarray: Add xas_for_each_conflict Date: Sat, 16 Jun 2018 18:59:55 -0700 [thread overview] Message-ID: <20180617020052.4759-18-willy@infradead.org> (raw) In-Reply-To: <20180617020052.4759-1-willy@infradead.org> This iterator iterates over each entry that is stored in the index or indices specified by the xa_state. This is intended for use for a conditional store of a multiindex entry, or to allow entries which are about to be removed from the xarray to be disposed of properly. Signed-off-by: Matthew Wilcox <willy@infradead.org> --- include/linux/xarray.h | 17 ++++++++++++ lib/test_xarray.c | 63 ++++++++++++++++++++++++++++++++++++++++++ lib/xarray.c | 61 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 141 insertions(+) diff --git a/include/linux/xarray.h b/include/linux/xarray.h index 921d41034d7d..0a9f66266c9a 100644 --- a/include/linux/xarray.h +++ b/include/linux/xarray.h @@ -769,6 +769,7 @@ static inline bool xas_retry(struct xa_state *xas, const void *entry) void *xas_load(struct xa_state *); void *xas_store(struct xa_state *, void *entry); void *xas_find(struct xa_state *, unsigned long max); +void *xas_next_conflict(struct xa_state *); bool xas_get_tag(const struct xa_state *, xa_tag_t); void xas_set_tag(const struct xa_state *, xa_tag_t); @@ -983,6 +984,22 @@ enum { for (entry = xas_find_tagged(xas, max, tag); entry; \ entry = xas_next_tagged(xas, max, tag)) +/** + * xas_for_each_conflict() - Iterate over a range of an XArray. + * @xas: XArray operation state. + * @entry: Entry retrieved from the array. + * + * The loop body will be executed for each entry in the XArray that lies + * within the range specified by @xas. If the loop completes successfully, + * any entries that lie in this range will be replaced by @entry. The caller + * may break out of the loop; if they do so, the contents of the XArray will + * be unchanged. The operation may fail due to an out of memory condition. + * The caller may also call xa_set_err() to exit the loop while setting an + * error to record the reason. + */ +#define xas_for_each_conflict(xas, entry) \ + while ((entry = xas_next_conflict(xas))) + void *__xas_next(struct xa_state *); void *__xas_prev(struct xa_state *); diff --git a/lib/test_xarray.c b/lib/test_xarray.c index e74ade12c663..818cfd8746ba 100644 --- a/lib/test_xarray.c +++ b/lib/test_xarray.c @@ -315,6 +315,68 @@ static void check_multi_store(struct xarray *xa) } } +static void __check_store_iter(struct xarray *xa, unsigned long start, + unsigned int order, unsigned int present) +{ + XA_STATE_ORDER(xas, xa, start, order); + void *entry; + unsigned int count = 0; + +retry: + xas_for_each_conflict(&xas, entry) { + XA_BUG_ON(xa, !xa_is_value(entry)); + XA_BUG_ON(xa, entry < xa_mk_value(start)); + XA_BUG_ON(xa, entry > xa_mk_value(start + (1UL << order) - 1)); + count++; + } + xas_store(&xas, xa_mk_value(start)); + if (xas_nomem(&xas, GFP_KERNEL)) { + count = 0; + goto retry; + } + XA_BUG_ON(xa, xas_error(&xas)); + XA_BUG_ON(xa, count != present); + XA_BUG_ON(xa, xa_load(xa, start) != xa_mk_value(start)); + XA_BUG_ON(xa, xa_load(xa, start + (1UL << order) - 1) != + xa_mk_value(start)); + xa_erase_value(xa, start); +} + +static void check_store_iter(struct xarray *xa) +{ + unsigned int i, j; + + for (i = 0; i < 20; i++) { + unsigned int min = 1 << i; + unsigned int max = (2 << i) - 1; + __check_store_iter(xa, 0, i, 0); + XA_BUG_ON(xa, !xa_empty(xa)); + __check_store_iter(xa, min, i, 0); + XA_BUG_ON(xa, !xa_empty(xa)); + + xa_store_value(xa, min, GFP_KERNEL); + __check_store_iter(xa, min, i, 1); + XA_BUG_ON(xa, !xa_empty(xa)); + xa_store_value(xa, max, GFP_KERNEL); + __check_store_iter(xa, min, i, 1); + XA_BUG_ON(xa, !xa_empty(xa)); + + for (j = 0; j < min; j++) + xa_store_value(xa, j, GFP_KERNEL); + __check_store_iter(xa, 0, i, min); + XA_BUG_ON(xa, !xa_empty(xa)); + for (j = 0; j < min; j++) + xa_store_value(xa, min + j, GFP_KERNEL); + __check_store_iter(xa, min, i, min); + XA_BUG_ON(xa, !xa_empty(xa)); + } + xa_store_value(xa, 63, GFP_KERNEL); + xa_store_value(xa, 65, GFP_KERNEL); + __check_store_iter(xa, 64, 2, 1); + xa_erase_value(xa, 63); + XA_BUG_ON(xa, !xa_empty(xa)); +} + static void check_multi_find(struct xarray *xa) { unsigned long index; @@ -506,6 +568,7 @@ static int xarray_checks(void) check_multi_store(&array); check_find(&array); check_move(&array); + check_store_iter(&array); printk("XArray: %u of %u tests passed\n", tests_passed, tests_run); return (tests_run != tests_passed) ? 0 : -EINVAL; diff --git a/lib/xarray.c b/lib/xarray.c index ab1b6786711e..31c5332c8146 100644 --- a/lib/xarray.c +++ b/lib/xarray.c @@ -1086,6 +1086,67 @@ void *xas_find_tagged(struct xa_state *xas, unsigned long max, xa_tag_t tag) } EXPORT_SYMBOL_GPL(xas_find_tagged); +/** + * xas_next_conflict() - Step for xas_for_each_conflict(). + * @xas: XArray operation state. + * + * This function does the work for xas_for_each_conflict(). + * + * Context: Any context. Expects xa_lock to be held. + * Return: The next entry in the range covered by @xas or %NULL. + */ +void *xas_next_conflict(struct xa_state *xas) +{ + void *curr; + + if (xas_error(xas)) + return NULL; + + if (!xas->xa_node) + return NULL; + + if (xas_top(xas->xa_node)) { + curr = xas_start(xas); + if (!curr) + return NULL; + while (xa_is_node(curr)) { + struct xa_node *node = xa_to_node(curr); + curr = xas_descend(xas, node); + } + if (curr) + return curr; + } + + if (xas->xa_node->shift > xas->xa_shift) + return NULL; + + for (;;) { + if (xas->xa_node->shift == xas->xa_shift) { + if ((xas->xa_offset & xas->xa_sibs) == xas->xa_sibs) + break; + } else if (xas->xa_offset == XA_CHUNK_MASK) { + xas->xa_offset = xas->xa_node->offset; + xas->xa_node = xas->xa_node->parent; + if (!xas->xa_node) + break; + continue; + } + curr = xa_entry_locked(xas->xa, xas->xa_node, ++xas->xa_offset); + if (xa_is_sibling(curr)) + continue; + while (xa_is_node(curr)) { + xas->xa_node = xa_to_node(curr); + xas->xa_offset = 0; + curr = xa_entry_locked(xas->xa, xas->xa_node, 0); + } + if (curr) + return curr; + } + xas->xa_offset -= xas->xa_sibs; + return NULL; +} +EXPORT_SYMBOL_GPL(xas_next_conflict); + /** * xa_init_flags() - Initialise an empty XArray with flags. * @xa: XArray. -- 2.17.1
WARNING: multiple messages have this Message-ID (diff)
From: Matthew Wilcox <willy@infradead.org> To: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Cc: linux-nilfs@vger.kernel.org, Jan Kara <jack@suse.cz>, Jeff Layton <jlayton@redhat.com>, Jaegeuk Kim <jaegeuk@kernel.org>, Matthew Wilcox <willy@infradead.org>, linux-f2fs-devel@lists.sourceforge.net, Nicholas Piggin <npiggin@gmail.com>, Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>, Lukas Czerner <lczerner@redhat.com>, Ross Zwisler <ross.zwisler@linux.intel.com>, Christoph Hellwig <hch@lst.de>, Goldwyn Rodrigues <rgoldwyn@suse.com> Subject: [PATCH v14 17/74] xarray: Add xas_for_each_conflict Date: Sat, 16 Jun 2018 18:59:55 -0700 [thread overview] Message-ID: <20180617020052.4759-18-willy@infradead.org> (raw) In-Reply-To: <20180617020052.4759-1-willy@infradead.org> This iterator iterates over each entry that is stored in the index or indices specified by the xa_state. This is intended for use for a conditional store of a multiindex entry, or to allow entries which are about to be removed from the xarray to be disposed of properly. Signed-off-by: Matthew Wilcox <willy@infradead.org> --- include/linux/xarray.h | 17 ++++++++++++ lib/test_xarray.c | 63 ++++++++++++++++++++++++++++++++++++++++++ lib/xarray.c | 61 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 141 insertions(+) diff --git a/include/linux/xarray.h b/include/linux/xarray.h index 921d41034d7d..0a9f66266c9a 100644 --- a/include/linux/xarray.h +++ b/include/linux/xarray.h @@ -769,6 +769,7 @@ static inline bool xas_retry(struct xa_state *xas, const void *entry) void *xas_load(struct xa_state *); void *xas_store(struct xa_state *, void *entry); void *xas_find(struct xa_state *, unsigned long max); +void *xas_next_conflict(struct xa_state *); bool xas_get_tag(const struct xa_state *, xa_tag_t); void xas_set_tag(const struct xa_state *, xa_tag_t); @@ -983,6 +984,22 @@ enum { for (entry = xas_find_tagged(xas, max, tag); entry; \ entry = xas_next_tagged(xas, max, tag)) +/** + * xas_for_each_conflict() - Iterate over a range of an XArray. + * @xas: XArray operation state. + * @entry: Entry retrieved from the array. + * + * The loop body will be executed for each entry in the XArray that lies + * within the range specified by @xas. If the loop completes successfully, + * any entries that lie in this range will be replaced by @entry. The caller + * may break out of the loop; if they do so, the contents of the XArray will + * be unchanged. The operation may fail due to an out of memory condition. + * The caller may also call xa_set_err() to exit the loop while setting an + * error to record the reason. + */ +#define xas_for_each_conflict(xas, entry) \ + while ((entry = xas_next_conflict(xas))) + void *__xas_next(struct xa_state *); void *__xas_prev(struct xa_state *); diff --git a/lib/test_xarray.c b/lib/test_xarray.c index e74ade12c663..818cfd8746ba 100644 --- a/lib/test_xarray.c +++ b/lib/test_xarray.c @@ -315,6 +315,68 @@ static void check_multi_store(struct xarray *xa) } } +static void __check_store_iter(struct xarray *xa, unsigned long start, + unsigned int order, unsigned int present) +{ + XA_STATE_ORDER(xas, xa, start, order); + void *entry; + unsigned int count = 0; + +retry: + xas_for_each_conflict(&xas, entry) { + XA_BUG_ON(xa, !xa_is_value(entry)); + XA_BUG_ON(xa, entry < xa_mk_value(start)); + XA_BUG_ON(xa, entry > xa_mk_value(start + (1UL << order) - 1)); + count++; + } + xas_store(&xas, xa_mk_value(start)); + if (xas_nomem(&xas, GFP_KERNEL)) { + count = 0; + goto retry; + } + XA_BUG_ON(xa, xas_error(&xas)); + XA_BUG_ON(xa, count != present); + XA_BUG_ON(xa, xa_load(xa, start) != xa_mk_value(start)); + XA_BUG_ON(xa, xa_load(xa, start + (1UL << order) - 1) != + xa_mk_value(start)); + xa_erase_value(xa, start); +} + +static void check_store_iter(struct xarray *xa) +{ + unsigned int i, j; + + for (i = 0; i < 20; i++) { + unsigned int min = 1 << i; + unsigned int max = (2 << i) - 1; + __check_store_iter(xa, 0, i, 0); + XA_BUG_ON(xa, !xa_empty(xa)); + __check_store_iter(xa, min, i, 0); + XA_BUG_ON(xa, !xa_empty(xa)); + + xa_store_value(xa, min, GFP_KERNEL); + __check_store_iter(xa, min, i, 1); + XA_BUG_ON(xa, !xa_empty(xa)); + xa_store_value(xa, max, GFP_KERNEL); + __check_store_iter(xa, min, i, 1); + XA_BUG_ON(xa, !xa_empty(xa)); + + for (j = 0; j < min; j++) + xa_store_value(xa, j, GFP_KERNEL); + __check_store_iter(xa, 0, i, min); + XA_BUG_ON(xa, !xa_empty(xa)); + for (j = 0; j < min; j++) + xa_store_value(xa, min + j, GFP_KERNEL); + __check_store_iter(xa, min, i, min); + XA_BUG_ON(xa, !xa_empty(xa)); + } + xa_store_value(xa, 63, GFP_KERNEL); + xa_store_value(xa, 65, GFP_KERNEL); + __check_store_iter(xa, 64, 2, 1); + xa_erase_value(xa, 63); + XA_BUG_ON(xa, !xa_empty(xa)); +} + static void check_multi_find(struct xarray *xa) { unsigned long index; @@ -506,6 +568,7 @@ static int xarray_checks(void) check_multi_store(&array); check_find(&array); check_move(&array); + check_store_iter(&array); printk("XArray: %u of %u tests passed\n", tests_passed, tests_run); return (tests_run != tests_passed) ? 0 : -EINVAL; diff --git a/lib/xarray.c b/lib/xarray.c index ab1b6786711e..31c5332c8146 100644 --- a/lib/xarray.c +++ b/lib/xarray.c @@ -1086,6 +1086,67 @@ void *xas_find_tagged(struct xa_state *xas, unsigned long max, xa_tag_t tag) } EXPORT_SYMBOL_GPL(xas_find_tagged); +/** + * xas_next_conflict() - Step for xas_for_each_conflict(). + * @xas: XArray operation state. + * + * This function does the work for xas_for_each_conflict(). + * + * Context: Any context. Expects xa_lock to be held. + * Return: The next entry in the range covered by @xas or %NULL. + */ +void *xas_next_conflict(struct xa_state *xas) +{ + void *curr; + + if (xas_error(xas)) + return NULL; + + if (!xas->xa_node) + return NULL; + + if (xas_top(xas->xa_node)) { + curr = xas_start(xas); + if (!curr) + return NULL; + while (xa_is_node(curr)) { + struct xa_node *node = xa_to_node(curr); + curr = xas_descend(xas, node); + } + if (curr) + return curr; + } + + if (xas->xa_node->shift > xas->xa_shift) + return NULL; + + for (;;) { + if (xas->xa_node->shift == xas->xa_shift) { + if ((xas->xa_offset & xas->xa_sibs) == xas->xa_sibs) + break; + } else if (xas->xa_offset == XA_CHUNK_MASK) { + xas->xa_offset = xas->xa_node->offset; + xas->xa_node = xas->xa_node->parent; + if (!xas->xa_node) + break; + continue; + } + curr = xa_entry_locked(xas->xa, xas->xa_node, ++xas->xa_offset); + if (xa_is_sibling(curr)) + continue; + while (xa_is_node(curr)) { + xas->xa_node = xa_to_node(curr); + xas->xa_offset = 0; + curr = xa_entry_locked(xas->xa, xas->xa_node, 0); + } + if (curr) + return curr; + } + xas->xa_offset -= xas->xa_sibs; + return NULL; +} +EXPORT_SYMBOL_GPL(xas_next_conflict); + /** * xa_init_flags() - Initialise an empty XArray with flags. * @xa: XArray. -- 2.17.1 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
next prev parent reply other threads:[~2018-06-17 2:17 UTC|newest] Thread overview: 162+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-06-17 1:59 [PATCH v14 00/74] Convert page cache to XArray Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 01/74] Update email address Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 02/74] radix tree test suite: Enable ubsan Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 03/74] dax: Fix use of zero page Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 04/74] xarray: Replace exceptional entries Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 05/74] xarray: Change definition of sibling entries Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 06/74] xarray: Add definition of struct xarray Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 07/74] xarray: Define struct xa_node Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 08/74] xarray: Add documentation Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 09/74] xarray: Add XArray load operation Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 10/74] xarray: Add XArray tags Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 11/74] xarray: Add XArray unconditional store operations Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 12/74] xarray: Add XArray conditional " Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 13/74] xarray: Add XArray iterators Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 14/74] xarray: Extract entries from an XArray Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 15/74] xarray: Destroy " Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 16/74] xarray: Step through " Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox [this message] 2018-06-17 1:59 ` [PATCH v14 17/74] xarray: Add xas_for_each_conflict Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 18/74] xarray: Add xas_create_range Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 19/74] xarray: Add MAINTAINERS entry Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 20/74] page cache: Rearrange address_space Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox 2018-06-17 1:59 ` [PATCH v14 21/74] page cache: Convert hole search to XArray Matthew Wilcox 2018-06-17 1:59 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 22/74] page cache: Add and replace pages using the XArray Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 23/74] page cache: Convert page deletion to XArray Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 24/74] page cache: Convert find_get_entry " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 25/74] page cache: Convert find_get_entries " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 26/74] page cache: Convert find_get_pages_range " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 27/74] page cache: Convert find_get_pages_contig " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 28/74] page cache; Convert find_get_pages_range_tag " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 29/74] page cache: Convert find_get_entries_tag " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 30/74] page cache: Convert filemap_map_pages " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 31/74] radix tree test suite: Convert regression1 " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 32/74] page cache: Convert delete_batch " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 33/74] page cache: Remove stray radix comment Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 34/74] page cache: Convert filemap_range_has_page to XArray Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 35/74] mm: Convert page-writeback " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 36/74] mm: Convert workingset " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 37/74] mm: Convert truncate " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 38/74] mm: Convert add_to_swap_cache " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 39/74] mm: Convert delete_from_swap_cache " Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 40/74] mm: Convert __do_page_cache_readahead " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 41/74] mm: Convert page migration " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 42/74] mm: Convert huge_memory " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 43/74] mm: Convert collapse_shmem " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 44/74] mm: Convert khugepaged_scan_shmem " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 45/74] mm: Convert is_page_cache_freeable " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 46/74] pagevec: Use xa_tag_t Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 47/74] shmem: Convert shmem_radix_tree_replace to XArray Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 48/74] shmem: Convert shmem_confirm_swap " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 49/74] shmem: Convert find_swap_entry " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 50/74] shmem: Convert shmem_add_to_page_cache " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 51/74] shmem: Convert shmem_alloc_hugepage " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 52/74] shmem: Convert shmem_free_swap " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 53/74] shmem: Convert shmem_partial_swap_usage " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 54/74] memfd: Convert memfd_wait_for_pins " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 55/74] memfd: Convert memfd_tag_pins " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 56/74] shmem: Comment fixups Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 57/74] btrfs: Convert page cache to XArray Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 58/74] fs: Convert buffer " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 59/74] fs: Convert writeback " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 60/74] nilfs2: Convert " Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 61/74] f2fs: " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 62/74] dax: Rename some functions Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 63/74] dax: Hash on XArray instead of mapping Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 64/74] dax: Convert dax_insert_pfn_mkwrite to XArray Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 65/74] dax: Convert dax_layout_busy_page " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 66/74] dax: Convert __dax_invalidate_entry " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 67/74] dax: Convert dax writeback " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 68/74] dax: Convert dax_lock_page " Matthew Wilcox 2018-06-29 17:30 ` Ross Zwisler 2018-06-29 17:30 ` Ross Zwisler 2018-07-06 11:54 ` [PATCH] fs/dax: remove unused function Anders Roxell 2018-07-06 13:04 ` [PATCH v14 68/74] dax: Convert dax_lock_page to XArray Matthew Wilcox 2018-07-06 13:04 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 69/74] dax: Convert page fault handlers " Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 70/74] page cache: Finish XArray conversion Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 71/74] radix tree: Remove radix_tree_update_node_t Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 72/74] radix tree: Remove split/join code Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 73/74] radix tree: Remove radix_tree_maybe_preload_order Matthew Wilcox 2018-06-17 2:00 ` [PATCH v14 74/74] radix tree: Remove radix_tree_clear_tags Matthew Wilcox 2018-06-17 2:00 ` Matthew Wilcox 2018-06-19 3:12 ` [PATCH v14 00/74] Convert page cache to XArray Ross Zwisler 2018-06-19 9:22 ` Matthew Wilcox 2018-06-19 16:40 ` Ross Zwisler 2018-06-19 17:16 ` Matthew Wilcox 2018-06-27 11:05 ` Matthew Wilcox 2018-06-27 11:05 ` Matthew Wilcox 2018-06-27 19:44 ` Ross Zwisler 2018-06-28 8:39 ` Matthew Wilcox 2018-06-28 16:30 ` Ross Zwisler 2018-07-25 21:03 ` Matthew Wilcox 2018-07-25 21:12 ` Ross Zwisler 2018-07-27 17:20 ` Ross Zwisler 2018-07-27 17:20 ` Ross Zwisler 2018-07-30 15:43 ` 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=20180617020052.4759-18-willy@infradead.org \ --to=willy@infradead.org \ --cc=hch@lst.de \ --cc=jack@suse.cz \ --cc=jaegeuk@kernel.org \ --cc=jlayton@redhat.com \ --cc=konishi.ryusuke@lab.ntt.co.jp \ --cc=lczerner@redhat.com \ --cc=linux-f2fs-devel@lists.sourceforge.net \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=linux-nilfs@vger.kernel.org \ --cc=npiggin@gmail.com \ --cc=rgoldwyn@suse.com \ --cc=ross.zwisler@linux.intel.com \ --cc=yuchao0@huawei.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.