All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@lst.de>
To: "Matthew Wilcox (Oracle)" <willy@infradead.org>
Cc: linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, hch@lst.de,
	kent.overstreet@gmail.com
Subject: Re: [PATCH 14/17] mm/filemap: Restructure filemap_get_pages
Date: Tue, 3 Nov 2020 08:57:36 +0100	[thread overview]
Message-ID: <20201103075736.GM8389@lst.de> (raw)
In-Reply-To: <20201102184312.25926-15-willy@infradead.org>

On Mon, Nov 02, 2020 at 06:43:09PM +0000, Matthew Wilcox (Oracle) wrote:
> Avoid a goto, and by the time we get to calling filemap_update_page(),
> we definitely have at least one page.

I find the error handling flow hard to follow and the existing but
heavily touched naming of the nr_got variable and the find_pages label
not helpful.  I'd do the following on top of this patch:

diff --git a/mm/filemap.c b/mm/filemap.c
index f16b1eb03bcad0..3ef73a58ce9456 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -2344,51 +2344,54 @@ static int filemap_get_pages(struct kiocb *iocb, struct iov_iter *iter,
 	pgoff_t index = iocb->ki_pos >> PAGE_SHIFT;
 	pgoff_t last_index = (iocb->ki_pos + iter->count + PAGE_SIZE-1) >> PAGE_SHIFT;
 	struct page *page;
-	int nr_got, err = 0;
+	int nr_pages, err = 0;
 
 	nr = min_t(unsigned long, last_index - index, nr);
-find_page:
+retry:
 	if (fatal_signal_pending(current))
 		return -EINTR;
 
-	nr_got = mapping_get_read_thps(mapping, index, nr, pages);
-	if (!nr_got) {
+	nr_pages = mapping_get_read_thps(mapping, index, nr, pages);
+	if (!nr_pages) {
 		if (iocb->ki_flags & IOCB_NOIO)
 			return -EAGAIN;
 		page_cache_sync_readahead(mapping, ra, filp, index,
 				last_index - index);
-		nr_got = mapping_get_read_thps(mapping, index, nr, pages);
+		nr_pages = mapping_get_read_thps(mapping, index, nr, pages);
 	}
-	if (!nr_got) {
+	if (!nr_pages) {
 		if (iocb->ki_flags & (IOCB_NOWAIT | IOCB_WAITQ))
 			return -EAGAIN;
 		pages[0] = filemap_create_page(filp, mapping,
 				iocb->ki_pos >> PAGE_SHIFT);
 		if (!pages[0])
-			goto find_page;
+			goto retry;
 		if (IS_ERR(pages[0]))
 			return PTR_ERR(pages[0]);
 		return 1;
 	}
 
-	page = pages[nr_got - 1];
-	if (PageReadahead(page))
+	page = pages[nr_pages - 1];
+	if (PageReadahead(page)) {
 		err = filemap_readahead(iocb, filp, mapping, page, last_index);
-	if (!err && !PageUptodate(page))
+		if (err)
+			goto error;
+	}
+	if (!PageUptodate(page)) {
 		err = filemap_update_page(iocb, mapping, iter, page,
-				nr_got == 1);
+				nr_pages == 1);
+		if (err)
+			goto error;
+	}
 
-	if (err)
-		nr_got--;
-	if (likely(nr_got))
-		return nr_got;
-	if (err < 0)
-		return err;
-	err = 0;
-	/*
-	 * No pages and no error means we raced and should retry:
-	 */
-	goto find_page;
+	return nr_pages;
+
+error:
+	if (nr_pages > 1)
+		return nr_pages - 1;
+	if (err == AOP_TRUNCATED_PAGE)
+		goto retry;
+	return err;
 }
 
 /**

  parent reply	other threads:[~2020-11-03  7:57 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-02 18:42 [PATCH 00/17] Refactor generic_file_buffered_read Matthew Wilcox (Oracle)
2020-11-02 18:42 ` [PATCH 01/17] mm/filemap: Rename generic_file_buffered_read subfunctions Matthew Wilcox (Oracle)
2020-11-02 18:53   ` Kent Overstreet
2020-11-03  7:27   ` Christoph Hellwig
2020-11-03 14:52     ` Matthew Wilcox
2020-11-03 15:02       ` Amy Parker
2020-11-02 18:42 ` [PATCH 02/17] mm/filemap: Use THPs in generic_file_buffered_read Matthew Wilcox (Oracle)
2020-11-02 18:55   ` Kent Overstreet
2020-11-03  7:28   ` Christoph Hellwig
2020-11-02 18:42 ` [PATCH 03/17] mm/filemap: Pass a sleep state to put_and_wait_on_page_locked Matthew Wilcox (Oracle)
2020-11-02 18:56   ` Kent Overstreet
2020-11-03  7:28   ` Christoph Hellwig
2020-11-02 18:42 ` [PATCH 04/17] mm/filemap: Support readpage splitting a page Matthew Wilcox (Oracle)
2020-11-02 19:00   ` Kent Overstreet
2020-11-02 19:03     ` Matthew Wilcox
2020-11-02 19:12   ` Kent Overstreet
2020-11-03  7:31   ` Christoph Hellwig
2020-11-02 18:43 ` [PATCH 05/17] mm/filemap: Inline __wait_on_page_locked_async into caller Matthew Wilcox (Oracle)
2020-11-02 19:00   ` Kent Overstreet
2020-11-03  7:31   ` Christoph Hellwig
2020-11-02 18:43 ` [PATCH 06/17] mm/filemap: Don't call ->readpage if IOCB_WAITQ is set Matthew Wilcox (Oracle)
2020-11-02 19:17   ` Kent Overstreet
2020-11-03  7:31   ` Christoph Hellwig
2020-11-05  7:22   ` Nikolay Borisov
2020-11-02 18:43 ` [PATCH 07/17] mm/filemap: Change filemap_read_page calling conventions Matthew Wilcox (Oracle)
2020-11-02 19:37   ` Kent Overstreet
2020-11-03  7:34   ` Christoph Hellwig
2020-11-03 15:11     ` Matthew Wilcox
2020-11-02 18:43 ` [PATCH 08/17] mm/filemap: Change filemap_create_page arguments Matthew Wilcox (Oracle)
2020-11-02 19:38   ` Kent Overstreet
2020-11-03  7:35   ` Christoph Hellwig
2020-11-02 18:43 ` [PATCH 09/17] mm/filemap: Convert filemap_update_page to return an errno Matthew Wilcox (Oracle)
2020-11-02 19:39   ` Kent Overstreet
2020-11-03  7:36   ` Christoph Hellwig
2020-11-02 18:43 ` [PATCH 10/17] mm/filemap: Move the iocb checks into filemap_update_page Matthew Wilcox (Oracle)
2020-11-02 19:45   ` Kent Overstreet
2020-11-03  7:41   ` Christoph Hellwig
2020-11-02 18:43 ` [PATCH 11/17] mm/filemap: Add filemap_range_uptodate Matthew Wilcox (Oracle)
2020-11-02 19:50   ` Kent Overstreet
2020-11-02 20:09     ` Matthew Wilcox
2020-11-03  7:49   ` Christoph Hellwig
2020-11-03 15:18     ` Matthew Wilcox
2020-11-03 15:31       ` Christoph Hellwig
2020-11-03 15:42         ` Matthew Wilcox
2020-11-02 18:43 ` [PATCH 12/17] mm/filemap: Split filemap_readahead out of filemap_get_pages Matthew Wilcox (Oracle)
2020-11-02 19:52   ` Kent Overstreet
2020-11-02 18:43 ` [PATCH 13/17] mm/filemap: Remove parameters from filemap_update_page() Matthew Wilcox (Oracle)
2020-11-02 19:52   ` Kent Overstreet
2020-11-03  7:50   ` Christoph Hellwig
2020-11-02 18:43 ` [PATCH 14/17] mm/filemap: Restructure filemap_get_pages Matthew Wilcox (Oracle)
2020-11-02 20:05   ` Kent Overstreet
2020-11-03  7:57   ` Christoph Hellwig [this message]
2020-11-03 14:46     ` Matthew Wilcox
2020-11-03 15:29       ` Christoph Hellwig
2020-11-02 18:43 ` [PATCH 15/17] mm/filemap: Don't relock the page after calling readpage Matthew Wilcox (Oracle)
2020-11-02 20:06   ` Kent Overstreet
2020-11-03  8:00   ` Christoph Hellwig
2020-11-03 15:24     ` Matthew Wilcox
2020-11-03 17:13       ` Christoph Hellwig
2020-11-03 18:55         ` Matthew Wilcox
2020-11-02 18:43 ` [PATCH 16/17] mm/filemap: rename generic_file_buffered_read to filemap_read Matthew Wilcox (Oracle)
2020-11-02 20:06   ` Kent Overstreet
2020-11-02 18:43 ` [PATCH 17/17] mm: simplify generic_file_read_iter Matthew Wilcox (Oracle)
2020-11-02 20:07   ` Kent Overstreet
2020-11-02 20:14 ` [PATCH 00/17] Refactor generic_file_buffered_read Kent Overstreet

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=20201103075736.GM8389@lst.de \
    --to=hch@lst.de \
    --cc=kent.overstreet@gmail.com \
    --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 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.