All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Chinner <david@fromorbit.com>
To: Matthew Wilcox <willy@infradead.org>
Cc: linux-fsdevel@vger.kernel.org, linux-mm@kvack.org,
	linux-kernel@vger.kernel.org, linux-xfs@vger.kernel.org
Subject: Re: [PATCH 12/12] iomap: Convert from readpages to readahead
Date: Wed, 29 Jan 2020 12:38:39 +1100	[thread overview]
Message-ID: <20200129013839.GL18610@dread.disaster.area> (raw)
In-Reply-To: <20200125013553.24899-13-willy@infradead.org>

On Fri, Jan 24, 2020 at 05:35:53PM -0800, Matthew Wilcox wrote:
> From: "Matthew Wilcox (Oracle)" <willy@infradead.org>
> 
> Use the new readahead operation in XFS and iomap.
> 
> Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
> Cc: linux-xfs@vger.kernel.org

....
> +unsigned
> +iomap_readahead(struct address_space *mapping, pgoff_t start,
>  		unsigned nr_pages, const struct iomap_ops *ops)
>  {
>  	struct iomap_readpage_ctx ctx = {
> -		.pages		= pages,
>  		.is_readahead	= true,
>  	};
> -	loff_t pos = page_offset(list_entry(pages->prev, struct page, lru));
> -	loff_t last = page_offset(list_entry(pages->next, struct page, lru));
> -	loff_t length = last - pos + PAGE_SIZE, ret = 0;
> +	loff_t pos = start * PAGE_SIZE;
> +	loff_t length = nr_pages * PAGE_SIZE;
>  
> -	trace_iomap_readpages(mapping->host, nr_pages);
> +	trace_iomap_readahead(mapping->host, nr_pages);
>  
>  	while (length > 0) {
> -		ret = iomap_apply(mapping->host, pos, length, 0, ops,
> -				&ctx, iomap_readpages_actor);
> +		loff_t ret = iomap_apply(mapping->host, pos, length, 0, ops,
> +				&ctx, iomap_readahead_actor);
>  		if (ret <= 0) {
>  			WARN_ON_ONCE(ret == 0);
> -			goto done;
> +			break;
>  		}
>  		pos += ret;
>  		length -= ret;
>  	}
> -	ret = 0;
> -done:
> +
>  	if (ctx.bio)
>  		submit_bio(ctx.bio);
> -	if (ctx.cur_page) {
> -		if (!ctx.cur_page_in_bio)
> -			unlock_page(ctx.cur_page);
> +	if (ctx.cur_page && ctx.cur_page_in_bio)
>  		put_page(ctx.cur_page);
> -	}
>  
> -	/*
> -	 * Check that we didn't lose a page due to the arcance calling
> -	 * conventions..
> -	 */
> -	WARN_ON_ONCE(!ret && !list_empty(ctx.pages));
> -	return ret;
> +	return length / PAGE_SIZE;

Took me quite some time to get my head around whether this was
correct or not.

I'm still not certain in the cases where block size != page size and
we've got an extent boundary in the middle of the page and had a
read error on the second extent in the page. In this case,
ctx.cur_page_in_bio is true so we drop the readahead reference to
the page. Also, length is not a multiple of page size, and so the
nr_pages value returned includes the partial page that we have IO
underway on.

That, I think, leads to both a double unlock and a double put_page()
of the partial page in question.

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

  reply	other threads:[~2020-01-29  1:38 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-25  1:35 [PATCH 00/12] Change readahead API Matthew Wilcox
2020-01-25  1:35 ` [Cluster-devel] " Matthew Wilcox
2020-01-25  1:35 ` Matthew Wilcox
2020-01-25  1:35 ` [f2fs-dev] " Matthew Wilcox
2020-01-25  1:35 ` [PATCH 01/12] mm: Fix the return type of __do_page_cache_readahead Matthew Wilcox
2020-01-25  1:35 ` [PATCH 02/12] readahead: Ignore return value of ->readpages Matthew Wilcox
2020-01-25  1:35 ` [PATCH 03/12] readahead: Put pages in cache earlier Matthew Wilcox
2020-01-25  1:35   ` [Cluster-devel] " Matthew Wilcox
2020-01-25  1:35   ` Matthew Wilcox
2020-01-25  1:35   ` [f2fs-dev] " Matthew Wilcox
2020-01-25 19:44   ` Matthew Wilcox
2020-01-25 19:44     ` [Cluster-devel] " Matthew Wilcox
2020-01-25 19:44     ` Matthew Wilcox
2020-01-25 19:44     ` [f2fs-dev] " Matthew Wilcox
2020-01-25  1:35 ` [PATCH 04/12] mm: Add readahead address space operation Matthew Wilcox
2020-01-25  1:35   ` [Cluster-devel] " Matthew Wilcox
2020-01-25  1:35   ` Matthew Wilcox
2020-01-25  1:35   ` [f2fs-dev] " Matthew Wilcox
2020-01-25  3:57   ` Randy Dunlap
2020-01-25  3:57     ` [Cluster-devel] " Randy Dunlap
2020-01-25  3:57     ` Randy Dunlap
2020-01-25  3:57     ` [f2fs-dev] " Randy Dunlap
2020-02-01  0:25     ` Matthew Wilcox
2020-02-01  0:25       ` [Cluster-devel] " Matthew Wilcox
2020-02-01  0:25       ` Matthew Wilcox
2020-02-01  0:25       ` [f2fs-dev] " Matthew Wilcox
2020-01-29  0:24   ` Dave Chinner
2020-01-29  0:24     ` [Cluster-devel] " Dave Chinner
2020-01-29  0:24     ` Dave Chinner
2020-01-29  0:24     ` [f2fs-dev] " Dave Chinner
2020-01-29  0:24     ` [Ocfs2-devel] " Dave Chinner
2020-01-30  8:00     ` Matthew Wilcox
2020-01-30  8:00       ` [Cluster-devel] " Matthew Wilcox
2020-01-30  8:00       ` Matthew Wilcox
2020-01-30  8:00       ` [f2fs-dev] " Matthew Wilcox
2020-01-25  1:35 ` [PATCH 05/12] fs: Convert mpage_readpages to mpage_readahead Matthew Wilcox
2020-01-25  1:35   ` [Cluster-devel] " Matthew Wilcox
2020-01-25  1:35 ` [PATCH 06/12] btrfs: Convert from readpages to readahead Matthew Wilcox
2020-01-29  0:46   ` Dave Chinner
2020-01-30  8:09     ` Matthew Wilcox
2020-01-31  2:17       ` Dave Chinner
2020-01-25  1:35 ` [PATCH 07/12] erofs: Convert uncompressed files " Matthew Wilcox
2020-01-25  1:35   ` Matthew Wilcox
2020-01-25  1:53   ` Gao Xiang
2020-01-25  1:53     ` Gao Xiang via Linux-erofs
2020-01-25 19:09     ` Matthew Wilcox
2020-01-29  0:57   ` Dave Chinner
2020-01-29  0:57     ` Dave Chinner
2020-01-30  8:10     ` Matthew Wilcox
2020-01-30  8:10       ` Matthew Wilcox
2020-01-25  1:35 ` [PATCH 08/12] erofs: Convert compressed " Matthew Wilcox
2020-01-25  1:35   ` Matthew Wilcox
2020-01-25  1:35 ` [PATCH 09/12] ext4: Convert " Matthew Wilcox
2020-01-25  1:35 ` [PATCH 10/12] f2fs: " Matthew Wilcox
2020-01-25  1:35   ` [f2fs-dev] " Matthew Wilcox
2020-01-25  1:35 ` [PATCH 11/12] fuse: " Matthew Wilcox
2020-01-29  1:08   ` Dave Chinner
2020-01-30 21:35     ` Matthew Wilcox
2020-01-31  2:19       ` Dave Chinner
2020-01-29 10:50   ` Miklos Szeredi
2020-01-29 10:50     ` Miklos Szeredi
2020-01-30  7:26     ` Matthew Wilcox
2020-01-25  1:35 ` [PATCH 12/12] iomap: " Matthew Wilcox
2020-01-29  1:38   ` Dave Chinner [this message]
2020-01-31  9:44     ` Matthew Wilcox
2020-02-13  4:38 ` [PATCH 00/12] Change readahead API Andrew Morton
2020-02-13  4:38   ` [Cluster-devel] " Andrew Morton
2020-02-13  4:38   ` Andrew Morton
2020-02-13  4:38   ` [f2fs-dev] " Andrew Morton
2020-02-13  4:38   ` [Ocfs2-devel] " Andrew Morton
2020-02-13 13:43   ` Matthew Wilcox
2020-02-13 13:43     ` [Cluster-devel] " Matthew Wilcox
2020-02-13 13:43     ` Matthew Wilcox
2020-02-13 13:43     ` [f2fs-dev] " 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=20200129013839.GL18610@dread.disaster.area \
    --to=david@fromorbit.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-xfs@vger.kernel.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.