linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Matthew Wilcox <willy@infradead.org>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Matthew Wilcox <mawilcox@microsoft.com>,
	linux-kernel@vger.kernel.org, linux-mm@kvack.org,
	linux-fsdevel@vger.kernel.org,
	Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>,
	linux-nilfs@vger.kernel.org, linux-btrfs@vger.kernel.org
Subject: [PATCH v8 52/63] memfd: Convert shmem_tag_pins to XArray
Date: Tue,  6 Mar 2018 11:24:02 -0800	[thread overview]
Message-ID: <20180306192413.5499-53-willy@infradead.org> (raw)
In-Reply-To: <20180306192413.5499-1-willy@infradead.org>

From: Matthew Wilcox <mawilcox@microsoft.com>

Simplify the locking by taking the spinlock while we walk the tree on
the assumption that many acquires and releases of the lock will be
worse than holding the lock for a (potentially) long time.

We could replicate the same locking behaviour with the xarray, but would
have to be careful that the xa_node wasn't RCU-freed under us before we
took the lock.

Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com>
---
 mm/memfd.c | 43 ++++++++++++++++++-------------------------
 1 file changed, 18 insertions(+), 25 deletions(-)

diff --git a/mm/memfd.c b/mm/memfd.c
index 4cf7401cb09c..3b299d72df78 100644
--- a/mm/memfd.c
+++ b/mm/memfd.c
@@ -21,7 +21,7 @@
 #include <uapi/linux/memfd.h>
 
 /*
- * We need a tag: a new tag would expand every radix_tree_node by 8 bytes,
+ * We need a tag: a new tag would expand every xa_node by 8 bytes,
  * so reuse a tag which we firmly believe is never set or cleared on shmem.
  */
 #define SHMEM_TAG_PINNED        PAGECACHE_TAG_TOWRITE
@@ -29,35 +29,28 @@
 
 static void shmem_tag_pins(struct address_space *mapping)
 {
-	struct radix_tree_iter iter;
-	void __rcu **slot;
-	pgoff_t start;
+	XA_STATE(xas, &mapping->i_pages, 0);
 	struct page *page;
+	unsigned int tagged = 0;
 
 	lru_add_drain();
-	start = 0;
-	rcu_read_lock();
-
-	radix_tree_for_each_slot(slot, &mapping->i_pages, &iter, start) {
-		page = radix_tree_deref_slot(slot);
-		if (!page || radix_tree_exception(page)) {
-			if (radix_tree_deref_retry(page)) {
-				slot = radix_tree_iter_retry(&iter);
-				continue;
-			}
-		} else if (page_count(page) - page_mapcount(page) > 1) {
-			xa_lock_irq(&mapping->i_pages);
-			radix_tree_tag_set(&mapping->i_pages, iter.index,
-					   SHMEM_TAG_PINNED);
-			xa_unlock_irq(&mapping->i_pages);
-		}
 
-		if (need_resched()) {
-			slot = radix_tree_iter_resume(slot, &iter);
-			cond_resched_rcu();
-		}
+	xas_lock_irq(&xas);
+	xas_for_each(&xas, page, ULONG_MAX) {
+		if (xa_is_value(page))
+			continue;
+		if (page_count(page) - page_mapcount(page) > 1)
+			xas_set_tag(&xas, SHMEM_TAG_PINNED);
+
+		if (++tagged % XA_CHECK_SCHED)
+			continue;
+
+		xas_pause(&xas);
+		xas_unlock_irq(&xas);
+		cond_resched();
+		xas_lock_irq(&xas);
 	}
-	rcu_read_unlock();
+	xas_unlock_irq(&xas);
 }
 
 /*
-- 
2.16.1

--
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>

  parent reply	other threads:[~2018-03-06 19:24 UTC|newest]

Thread overview: 66+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-06 19:23 [PATCH v8 00/63] XArray v8 Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 01/63] mac80211_hwsim: Use DEFINE_IDA Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 02/63] radix tree: Use GFP_ZONEMASK bits of gfp_t for flags Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 03/63] arm64: Turn flush_dcache_mmap_lock into a no-op Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 04/63] unicore32: " Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 05/63] Export __set_page_dirty Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 06/63] btrfs: Use filemap_range_has_page() Matthew Wilcox
2018-03-07 14:17   ` David Sterba
2018-03-06 19:23 ` [PATCH v8 07/63] xfs: Rename xa_ elements to ail_ Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 08/63] fscache: Use appropriate radix tree accessors Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 09/63] xarray: Add the xa_lock to the radix_tree_root Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 10/63] page cache: Use xa_lock Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 11/63] xarray: Replace exceptional entries Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 12/63] xarray: Change definition of sibling entries Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 13/63] xarray: Add definition of struct xarray Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 14/63] xarray: Define struct xa_node Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 15/63] xarray: Add documentation Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 16/63] xarray: Add xa_load Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 17/63] xarray: Add xa_get_tag, xa_set_tag and xa_clear_tag Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 18/63] xarray: Add xa_store Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 19/63] xarray: Add xa_cmpxchg and xa_insert Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 20/63] xarray: Add xa_for_each Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 21/63] xarray: Add xa_extract Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 22/63] xarray: Add xa_destroy Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 23/63] xarray: Add xas_next and xas_prev Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 24/63] xarray: Add xas_create_range Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 25/63] xarray: Add MAINTAINERS entry Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 26/63] page cache: Rearrange address_space Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 27/63] page cache: Convert hole search to XArray Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 28/63] page cache: Add and replace pages using the XArray Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 29/63] page cache: Convert page deletion to XArray Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 30/63] page cache: Convert page cache lookups " Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 31/63] page cache: Convert delete_batch " Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 32/63] page cache: Remove stray radix comment Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 33/63] page cache: Convert filemap_range_has_page to XArray Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 34/63] mm: Convert page-writeback " Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 35/63] mm: Convert workingset " Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 36/63] mm: Convert truncate " Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 37/63] mm: Convert add_to_swap_cache " Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 38/63] mm: Convert delete_from_swap_cache " Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 39/63] mm: Convert __do_page_cache_readahead " Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 40/63] mm: Convert page migration " Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 41/63] mm: Convert huge_memory " Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 42/63] mm: Convert collapse_shmem " Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 43/63] mm: Convert khugepaged_scan_shmem " Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 44/63] pagevec: Use xa_tag_t Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 45/63] shmem: Convert replace to XArray Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 46/63] shmem: Convert shmem_confirm_swap " Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 47/63] shmem: Convert find_swap_entry " Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 48/63] shmem: Convert shmem_add_to_page_cache " Matthew Wilcox
2018-03-06 19:23 ` [PATCH v8 49/63] shmem: Convert shmem_alloc_hugepage " Matthew Wilcox
2018-03-06 19:24 ` [PATCH v8 50/63] shmem: Convert shmem_free_swap " Matthew Wilcox
2018-03-06 19:24 ` [PATCH v8 51/63] shmem: Convert shmem_partial_swap_usage " Matthew Wilcox
2018-03-06 19:24 ` Matthew Wilcox [this message]
2018-03-06 19:24 ` [PATCH v8 53/63] memfd: Convert shmem_wait_for_pins " Matthew Wilcox
2018-03-06 19:24 ` [PATCH v8 54/63] shmem: Comment fixups Matthew Wilcox
2018-03-06 19:24 ` [PATCH v8 55/63] btrfs: Convert page cache to XArray Matthew Wilcox
2018-03-07 14:25   ` David Sterba
2018-03-06 19:24 ` [PATCH v8 56/63] fs: Convert buffer " Matthew Wilcox
2018-03-06 19:24 ` [PATCH v8 57/63] fs: Convert writeback " Matthew Wilcox
2018-03-06 19:24 ` [PATCH v8 58/63] nilfs2: Convert " Matthew Wilcox
2018-03-06 19:24 ` [PATCH v8 59/63] f2fs: " Matthew Wilcox
2018-03-06 19:24 ` [PATCH v8 60/63] lustre: " Matthew Wilcox
2018-03-06 19:24 ` [PATCH v8 61/63] dax: " Matthew Wilcox
2018-03-06 19:24 ` [PATCH v8 62/63] page cache: Finish XArray conversion Matthew Wilcox
2018-03-06 19:24 ` [PATCH v8 63/63] radix tree: Remove unused functions 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=20180306192413.5499-53-willy@infradead.org \
    --to=willy@infradead.org \
    --cc=akpm@linux-foundation.org \
    --cc=konishi.ryusuke@lab.ntt.co.jp \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-nilfs@vger.kernel.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: 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;
as well as URLs for NNTP newsgroup(s).