From: Jan Kara <jack@suse.cz>
To: Matthew Wilcox <willy@infradead.org>
Cc: <linux-fsdevel@vger.kernel.org>, <linux-mm@kvack.org>,
Jan Kara <jack@suse.cz>
Subject: [PATCH 2/8] xarray: Provide xas_erase() helper
Date: Tue, 4 Feb 2020 15:25:08 +0100 [thread overview]
Message-ID: <20200204142514.15826-3-jack@suse.cz> (raw)
In-Reply-To: <20200204142514.15826-1-jack@suse.cz>
Currently xas_store() clears marks when stored value is NULL. This is
somewhat counter-intuitive and also causes measurable performance impact
when mark clearing is not needed (e.g. because marks are already clear).
So provide xas_erase() helper (similarly to existing xa_erase()) which
stores NULL at given index and also takes care of clearing marks. Use
this helper from __xa_erase() and item_kill_tree() in tools/testing. In
the following patches, callers that use the mark-clearing property of
xas_store() will be converted to xas_erase() and remaining users can
enjoy better performance.
Signed-off-by: Jan Kara <jack@suse.cz>
---
include/linux/xarray.h | 1 +
lib/xarray.c | 24 +++++++++++++++++++++++-
tools/testing/radix-tree/test.c | 2 +-
3 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/include/linux/xarray.h b/include/linux/xarray.h
index 5370716d7010..be6c6950837e 100644
--- a/include/linux/xarray.h
+++ b/include/linux/xarray.h
@@ -1491,6 +1491,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_erase(struct xa_state *);
void *xas_find(struct xa_state *, unsigned long max);
void *xas_find_conflict(struct xa_state *);
diff --git a/lib/xarray.c b/lib/xarray.c
index 1d9fab7db8da..ae8b7070e82c 100644
--- a/lib/xarray.c
+++ b/lib/xarray.c
@@ -1319,6 +1319,28 @@ static void *xas_result(struct xa_state *xas, void *curr)
return curr;
}
+/**
+ * xas_erase() - Erase this entry from the XArray
+ * @xas: XArray operation state.
+ *
+ * After this function returns, loading from @index will return %NULL. The
+ * function also clears all marks associated with the @index. If the index is
+ * part of a multi-index entry, all indices will be erased and none of the
+ * entries will be part of a multi-index entry.
+ *
+ * Return: The entry which used to be at this index.
+ */
+void *xas_erase(struct xa_state *xas)
+{
+ void *entry;
+
+ entry = xas_store(xas, NULL);
+ xas_init_marks(xas);
+
+ return entry;
+}
+EXPORT_SYMBOL(xas_erase);
+
/**
* __xa_erase() - Erase this entry from the XArray while locked.
* @xa: XArray.
@@ -1334,7 +1356,7 @@ static void *xas_result(struct xa_state *xas, void *curr)
void *__xa_erase(struct xarray *xa, unsigned long index)
{
XA_STATE(xas, xa, index);
- return xas_result(&xas, xas_store(&xas, NULL));
+ return xas_result(&xas, xas_erase(&xas));
}
EXPORT_SYMBOL(__xa_erase);
diff --git a/tools/testing/radix-tree/test.c b/tools/testing/radix-tree/test.c
index a15d0512e633..07dc2b4dc587 100644
--- a/tools/testing/radix-tree/test.c
+++ b/tools/testing/radix-tree/test.c
@@ -261,7 +261,7 @@ void item_kill_tree(struct xarray *xa)
if (!xa_is_value(entry)) {
item_free(entry, xas.xa_index);
}
- xas_store(&xas, NULL);
+ xas_erase(&xas);
}
assert(xa_empty(xa));
--
2.16.4
next prev parent reply other threads:[~2020-02-04 14:25 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-04 14:25 [PATCH 0/8] mm: Speedup page cache truncation Jan Kara
2020-02-04 14:25 ` [PATCH 1/8] xarray: Fix premature termination of xas_for_each_marked() Jan Kara
2020-03-12 21:45 ` Matthew Wilcox
2020-03-16 9:16 ` Jan Kara
2020-02-04 14:25 ` Jan Kara [this message]
2020-03-14 19:54 ` [PATCH 2/8] xarray: Provide xas_erase() helper Matthew Wilcox
2020-03-16 9:21 ` Jan Kara
2020-03-17 15:28 ` Matthew Wilcox
2020-04-15 16:12 ` Jan Kara
2020-02-04 14:25 ` [PATCH 3/8] xarray: Explicitely set XA_FREE_MARK in __xa_cmpxchg() Jan Kara
2020-02-05 18:45 ` Jason Gunthorpe
2020-02-06 8:03 ` Jan Kara
2020-03-17 15:12 ` Matthew Wilcox
2020-02-04 14:25 ` [PATCH 4/8] mm: Use xas_erase() in page_cache_delete_batch() Jan Kara
2020-02-04 14:25 ` [PATCH 5/8] dax: Use xas_erase() in __dax_invalidate_entry() Jan Kara
2020-02-04 14:25 ` [PATCH 6/8] idr: Use xas_erase() in ida_destroy() Jan Kara
2020-02-04 14:25 ` [PATCH 7/8] mm: Use xas_erase() in collapse_file() Jan Kara
2020-02-04 14:25 ` [PATCH 8/8] xarray: Don't clear marks in xas_store() Jan Kara
2020-02-05 18:43 ` Jason Gunthorpe
2020-02-05 21:59 ` Matthew Wilcox
2020-02-06 13:49 ` Jason Gunthorpe
2020-02-06 14:36 ` Jan Kara
2020-02-06 14:49 ` Jason Gunthorpe
2020-02-05 22:19 ` John Hubbard
2020-02-06 2:21 ` Matthew Wilcox
2020-02-06 3:48 ` John Hubbard
2020-02-06 4:28 ` Matthew Wilcox
2020-02-06 4:37 ` John Hubbard
2020-02-06 8:36 ` Jan Kara
2020-02-06 8:04 ` Jan Kara
2020-02-06 14:40 ` [PATCH 0/8] mm: Speedup page cache truncation David Sterba
2020-02-18 9:25 ` Jan Kara
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=20200204142514.15826-3-jack@suse.cz \
--to=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=willy@infradead.org \
/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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox