linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Matthew Wilcox <willy@infradead.org>
To: linux-fsdevel@vger.kernel.org
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 00/25] Large pages in the page cache
Date: Thu, 30 Apr 2020 04:34:15 -0700	[thread overview]
Message-ID: <20200430113415.GW29705@bombadil.infradead.org> (raw)
In-Reply-To: <20200429133657.22632-1-willy@infradead.org>

On Wed, Apr 29, 2020 at 06:36:32AM -0700, Matthew Wilcox wrote:
> This patch set does not pass xfstests.  Test at your own risk.  It is
> based on the readahead rewrite which is in Andrew's tree.  The large
> pages somehow manage to fall off the LRU, so the test VM quickly runs
> out of memory and freezes.

Kirill was right; that was not exactly the bug.  It did lead to the
realisation that this could be avoided by simply not splitting the page
if the filesystem knows how to write back large pages.  So this is
the current diff.

I just hit the bug in clear_inode() that i_data.nrpages is not 0, so
there's clearly at least one remaining problem to fix (and I suspect
about half a dozen).

diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index 184c8b516543..d511504d07af 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -235,7 +235,7 @@ static int pmem_rw_page(struct block_device *bdev, sector_t sector,
 	blk_status_t rc;
 
 	if (op_is_write(op))
-		rc = pmem_do_write(pmem, page, 0, sector, tmp_size(page));
+		rc = pmem_do_write(pmem, page, 0, sector, thp_size(page));
 	else
 		rc = pmem_do_read(pmem, page, 0, sector, thp_size(page));
 	/*
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index 7eb54f5c403b..ce978ed4f0cd 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -116,6 +116,11 @@ static inline void mapping_set_gfp_mask(struct address_space *m, gfp_t mask)
 	m->gfp_mask = mask;
 }
 
+static inline bool mapping_large_pages(struct address_space *mapping)
+{
+	return mapping->host->i_sb->s_type->fs_flags & FS_LARGE_PAGES;
+}
+
 void release_pages(struct page **pages, int nr);
 
 /*
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index ebaf649aa28d..e78686b628ae 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -2654,7 +2654,7 @@ static void __split_huge_page(struct page *page, struct list_head *list,
 
 int total_mapcount(struct page *page)
 {
-	int i, compound, ret;
+	int i, compound, nr, ret;
 
 	VM_BUG_ON_PAGE(PageTail(page), page);
 
@@ -2662,16 +2662,17 @@ int total_mapcount(struct page *page)
 		return atomic_read(&page->_mapcount) + 1;
 
 	compound = compound_mapcount(page);
+	nr = compound_nr(page);
 	if (PageHuge(page))
 		return compound;
 	ret = compound;
-	for (i = 0; i < HPAGE_PMD_NR; i++)
+	for (i = 0; i < nr; i++)
 		ret += atomic_read(&page[i]._mapcount) + 1;
 	/* File pages has compound_mapcount included in _mapcount */
 	if (!PageAnon(page))
-		return ret - compound * HPAGE_PMD_NR;
+		return ret - compound * nr;
 	if (PageDoubleMap(page))
-		ret -= HPAGE_PMD_NR;
+		ret -= nr;
 	return ret;
 }
 
diff --git a/mm/readahead.c b/mm/readahead.c
index e2493189e832..ac16e96a8828 100644
--- a/mm/readahead.c
+++ b/mm/readahead.c
@@ -458,7 +458,7 @@ static bool page_cache_readahead_order(struct readahead_control *rac,
 	int err = 0;
 	gfp_t gfp = readahead_gfp_mask(mapping);
 
-	if (!(mapping->host->i_sb->s_type->fs_flags & FS_LARGE_PAGES))
+	if (!mapping_large_pages(mapping))
 		return false;
 
 	limit = min(limit, index + ra->size - 1);
diff --git a/mm/vmscan.c b/mm/vmscan.c
index b06868fc4926..51e6c135575d 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1271,9 +1271,10 @@ static unsigned long shrink_page_list(struct list_head *page_list,
 				/* Adding to swap updated mapping */
 				mapping = page_mapping(page);
 			}
-		} else if (unlikely(PageTransHuge(page))) {
+		} else if (PageTransHuge(page)) {
 			/* Split file THP */
-			if (split_huge_page_to_list(page, page_list))
+			if (!mapping_large_pages(mapping) &&
+			    split_huge_page_to_list(page, page_list))
 				goto keep_locked;
 		}
 


      parent reply	other threads:[~2020-04-30 11:34 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-29 13:36 [PATCH v3 00/25] Large pages in the page cache Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 01/25] mm: Allow hpages to be arbitrary order Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 02/25] mm: Introduce thp_size Matthew Wilcox
2020-05-06 17:59   ` Yang Shi
2020-04-29 13:36 ` [PATCH v3 03/25] mm: Introduce thp_order Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 04/25] mm: Introduce offset_in_thp Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 05/25] fs: Add a filesystem flag for large pages Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 06/25] fs: Introduce i_blocks_per_page Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 07/25] fs: Make page_mkwrite_check_truncate thp-aware Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 08/25] fs: Support THPs in zero_user_segments Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 09/25] bio: Add bio_for_each_thp_segment_all Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 10/25] iomap: Support arbitrarily many blocks per page Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 11/25] iomap: Support large pages in iomap_adjust_read_range Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 12/25] iomap: Support large pages in read paths Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 13/25] iomap: Support large pages in write paths Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 14/25] iomap: Inline data shouldn't see large pages Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 15/25] xfs: Support " Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 16/25] mm: Make prep_transhuge_page return its argument Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 17/25] mm: Add __page_cache_alloc_order Matthew Wilcox
2020-05-06 18:03   ` Yang Shi
2020-06-07  3:08     ` Matthew Wilcox
2020-06-09 17:38       ` Yang Shi
2020-04-29 13:36 ` [PATCH v3 18/25] mm: Allow large pages to be added to the page cache Matthew Wilcox
2020-05-04  3:10   ` Matthew Wilcox
2020-05-06 18:32     ` Yang Shi
2020-06-07  3:04     ` Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 19/25] mm: Allow large pages to be removed from " Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 20/25] mm: Remove page fault assumption of compound page size Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 21/25] mm: Add DEFINE_READAHEAD Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 22/25] mm: Make page_cache_readahead_unbounded take a readahead_control Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 23/25] mm: Make __do_page_cache_readahead " Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 24/25] mm: Add large page readahead Matthew Wilcox
2020-04-29 13:36 ` [PATCH v3 25/25] mm: Align THP mappings for non-DAX Matthew Wilcox
2020-04-29 15:40 ` [PATCH v3 00/25] Large pages in the page cache Kirill A. Shutemov
2020-04-29 15:45   ` Kirill A. Shutemov
2020-04-30 11:34 ` Matthew Wilcox [this message]

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=20200430113415.GW29705@bombadil.infradead.org \
    --to=willy@infradead.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.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;
as well as URLs for NNTP newsgroup(s).