linux-f2fs-devel.lists.sourceforge.net archive mirror
 help / color / mirror / Atom feed
From: Matthew Wilcox <willy@infradead.org>
To: Dave Chinner <david@fromorbit.com>
Cc: linux-xfs@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-f2fs-devel@lists.sourceforge.net, cluster-devel@redhat.com,
	linux-mm@kvack.org, ocfs2-devel@oss.oracle.com,
	linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org,
	linux-erofs@lists.ozlabs.org, Christoph Hellwig <hch@lst.de>,
	linux-btrfs@vger.kernel.org
Subject: Re: [f2fs-dev] [PATCH v6 03/19] mm: Use readahead_control to pass arguments
Date: Tue, 18 Feb 2020 14:52:35 -0800	[thread overview]
Message-ID: <20200218225235.GH24185@bombadil.infradead.org> (raw)
In-Reply-To: <20200218224610.GT10776@dread.disaster.area>

On Wed, Feb 19, 2020 at 09:46:10AM +1100, Dave Chinner wrote:
> On Tue, Feb 18, 2020 at 05:56:18AM -0800, Matthew Wilcox wrote:
> > On Tue, Feb 18, 2020 at 04:03:00PM +1100, Dave Chinner wrote:
> > > On Mon, Feb 17, 2020 at 10:45:44AM -0800, Matthew Wilcox wrote:
> > > > +static void read_pages(struct readahead_control *rac, struct list_head *pages,
> > > > +		gfp_t gfp)
> > > >  {
> > > > +	const struct address_space_operations *aops = rac->mapping->a_ops;
> > > >  	struct blk_plug plug;
> > > >  	unsigned page_idx;
> > > 
> > > Splitting out the aops rather than the mapping here just looks
> > > weird, especially as you need the mapping later in the function.
> > > Using aops doesn't even reduce the code side....
> > 
> > It does in subsequent patches ... I agree it looks a little weird here,
> > but I think in the final form, it makes sense:
> 
> Ok. Perhaps just an additional commit comment to say "read_pages() is
> changed to be aops centric as @rac abstracts away all other
> implementation details by the end of the patchset."

ACK, will add.

> > > > +			if (readahead_count(&rac))
> > > > +				read_pages(&rac, &page_pool, gfp_mask);
> > > > +			rac._nr_pages = 0;
> > > 
> > > Hmmm. Wondering ig it make sense to move the gfp_mask to the readahead
> > > control structure - if we have to pass the gfp_mask down all the
> > > way along side the rac, then I think it makes sense to do that...
> > 
> > So we end up removing it later on in this series, but I do wonder if
> > it would make sense anyway.  By the end of the series, we still have
> > this in iomap:
> > 
> >                 if (ctx->rac) /* same as readahead_gfp_mask */
> >                         gfp |= __GFP_NORETRY | __GFP_NOWARN;
> > 
> > and we could get rid of that by passing gfp flags down in the rac.  On the
> > other hand, I don't know why it doesn't just use readahead_gfp_mask()
> > here anyway ... Christoph?
> 
> mapping->gfp_mask is awful. Is it a mask, or is it a valid set of
> allocation flags? Or both?  Some callers to mapping_gfp_constraint()
> uses it as a mask, some callers to mapping_gfp_constraint() use it
> as base flags that context specific flags get masked out of,
> readahead_gfp_mask() callers use it as the entire set of gfp flags
> for allocation.
> 
> That whole API sucks - undocumented as to what it's suposed to do
> and how it's supposed to be used. Hence it's difficult to use
> correctly or understand whether it's being used correctly. And
> reading callers only leads to more confusion and crazy code like in
> do_mpage_readpage() where readahead returns a mask that are used as
> base flags and normal reads return a masked set of base flags...
> 
> The iomap code is obviously correct when it comes to gfp flag
> manipulation. We start with GFP_KERNEL context, then constrain it
> via the mask held in mapping->gfp_mask, then if it's readahead we
> allow the allocation to silently fail.
> 
> Simple to read and understand code, versus having weird code that
> requires the reader to decipher an undocumented and inconsistent API
> to understand how the gfp flags have been calculated and are valid.

I think a lot of this is not so much a criticism of mapping->gfp_mask
as a criticism of the whole GFP flags concept.  Some of the flags make
allocations more likely to succeed, others make them more likely to
fail.  Some of them allow the allocator to do more things; some prevent
the allocator from doing things it would otherwise do.  Some of them
aren't flags at all.  Some of them are mutually incompatible (and will
be warned about if set in combination), some of them will silently win
over other flags.

I think they made a certain amount of clunky sense when they were added,
but they've grown to a point where they don't make sense any more and
partly that's because there's nobody standing over the allocator with
a flaming sword promising certain death to anyone who adds a new flag
without thoroughly documenting its interactions with every other flag.

I am no longer a fan of GFP flags ;-)


_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

  reply	other threads:[~2020-02-18 22:52 UTC|newest]

Thread overview: 111+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-17 18:45 [f2fs-dev] [PATCH v6 00/19] Change readahead API Matthew Wilcox
2020-02-17 18:45 ` [f2fs-dev] [PATCH v6 01/19] mm: Return void from various readahead functions Matthew Wilcox
2020-02-18  4:47   ` Dave Chinner
2020-02-18 21:05   ` John Hubbard
2020-02-18 21:21     ` Matthew Wilcox
2020-02-18 21:52       ` John Hubbard
2020-02-17 18:45 ` [f2fs-dev] [PATCH v6 02/19] mm: Ignore return value of ->readpages Matthew Wilcox
2020-02-18  4:48   ` Dave Chinner
2020-02-18 21:33   ` John Hubbard
2020-02-17 18:45 ` [f2fs-dev] [PATCH v6 03/19] mm: Use readahead_control to pass arguments Matthew Wilcox
2020-02-18  5:03   ` Dave Chinner
2020-02-18 13:56     ` Matthew Wilcox
2020-02-18 22:46       ` Dave Chinner
2020-02-18 22:52         ` Matthew Wilcox [this message]
2020-02-18 22:22   ` John Hubbard
2020-02-17 18:45 ` [f2fs-dev] [PATCH v6 04/19] mm: Rearrange readahead loop Matthew Wilcox
2020-02-18  5:08   ` Dave Chinner
2020-02-18 13:57     ` Matthew Wilcox
2020-02-18 22:48       ` Dave Chinner
2020-02-18 22:33   ` John Hubbard
2020-02-17 18:45 ` [f2fs-dev] [PATCH v6 04/16] mm: Tweak readahead loop slightly Matthew Wilcox
2020-02-18 22:57   ` John Hubbard
2020-02-18 23:00     ` John Hubbard
2020-02-17 18:45 ` [f2fs-dev] [PATCH v6 05/16] mm: Put readahead pages in cache earlier Matthew Wilcox
2020-02-17 18:45 ` [f2fs-dev] [PATCH v6 05/19] mm: Remove 'page_offset' from readahead loop Matthew Wilcox
2020-02-18  5:14   ` Dave Chinner
2020-02-18 23:08   ` John Hubbard
2020-02-17 18:45 ` [f2fs-dev] [PATCH v6 06/16] mm: Add readahead address space operation Matthew Wilcox
2020-02-17 18:45 ` [f2fs-dev] [PATCH v6 06/19] mm: rename readahead loop variable to 'i' Matthew Wilcox
2020-02-18  5:33   ` Dave Chinner
2020-02-18 23:11   ` John Hubbard
2020-02-17 18:45 ` [f2fs-dev] [PATCH v6 07/16] mm: Add page_cache_readahead_limit Matthew Wilcox
2020-02-17 18:45 ` [f2fs-dev] [PATCH v6 07/19] mm: Put readahead pages in cache earlier Matthew Wilcox
2020-02-18  6:14   ` Dave Chinner
2020-02-18 15:42     ` Matthew Wilcox
2020-02-19  0:59       ` Dave Chinner
2020-02-19  0:01   ` John Hubbard
2020-02-19  1:02     ` Matthew Wilcox
2020-02-19  1:13       ` John Hubbard
2020-02-19  3:24       ` John Hubbard
2020-02-19 14:41     ` Matthew Wilcox
2020-02-19 14:52       ` Christoph Hellwig
2020-02-19 15:01         ` Matthew Wilcox
2020-02-19 20:24           ` John Hubbard
2020-02-17 18:45 ` [f2fs-dev] [PATCH v6 08/16] fs: Convert mpage_readpages to mpage_readahead Matthew Wilcox
2020-02-17 18:45 ` [f2fs-dev] [PATCH v6 08/19] mm: Add readahead address space operation Matthew Wilcox
2020-02-18  6:21   ` Dave Chinner
2020-02-18 16:10     ` Matthew Wilcox
2020-02-19  1:04       ` Dave Chinner
2020-02-19  0:12   ` John Hubbard
2020-02-19  3:10   ` Eric Biggers
2020-02-19  3:35     ` Eric Biggers
2020-02-19 16:52     ` Matthew Wilcox
2020-02-17 18:45 ` [f2fs-dev] [PATCH v6 09/16] btrfs: Convert from readpages to readahead Matthew Wilcox
2020-02-17 18:45 ` [f2fs-dev] [PATCH v6 09/19] mm: Add page_cache_readahead_limit Matthew Wilcox
2020-02-18  6:31   ` Dave Chinner
2020-02-18 19:54     ` Matthew Wilcox
2020-02-19  1:08       ` Dave Chinner
2020-02-19  1:32   ` John Hubbard
2020-02-19  2:23     ` Matthew Wilcox
2020-02-19  2:46       ` John Hubbard
2020-02-17 18:45 ` [f2fs-dev] [PATCH v6 10/16] erofs: Convert uncompressed files from readpages to readahead Matthew Wilcox
2020-02-17 18:45 ` [f2fs-dev] [PATCH v6 10/19] fs: Convert mpage_readpages to mpage_readahead Matthew Wilcox
2020-02-18  1:51   ` [f2fs-dev] [Ocfs2-devel] " Joseph Qi
2020-02-18  6:37   ` [f2fs-dev] " Dave Chinner
2020-02-19  2:48   ` John Hubbard
2020-02-19  3:28   ` Eric Biggers
2020-02-19  3:47     ` Matthew Wilcox
2020-02-19  3:55       ` Eric Biggers
2020-02-17 18:45 ` [f2fs-dev] [PATCH v6 11/19] btrfs: Convert from readpages to readahead Matthew Wilcox
2020-02-18  6:57   ` Dave Chinner
2020-02-18 21:12     ` Matthew Wilcox
2020-02-19  1:23       ` Dave Chinner
2020-02-17 18:46 ` [f2fs-dev] [PATCH v6 11/16] erofs: Convert compressed files " Matthew Wilcox
2020-02-19  2:34   ` Gao Xiang
2020-02-17 18:46 ` [f2fs-dev] [PATCH v6 12/19] erofs: Convert uncompressed " Matthew Wilcox
2020-02-19  2:39   ` Gao Xiang
2020-02-19  3:04   ` Dave Chinner
2020-02-17 18:46 ` [f2fs-dev] [PATCH v6 12/16] ext4: Convert " Matthew Wilcox
2020-02-17 18:46 ` [f2fs-dev] [PATCH v6 13/19] erofs: Convert compressed files " Matthew Wilcox
2020-02-19  3:08   ` Dave Chinner
2020-02-17 18:46 ` [f2fs-dev] [PATCH v6 13/16] f2fs: Convert " Matthew Wilcox
2020-02-17 18:46 ` [f2fs-dev] [PATCH v6 14/19] ext4: " Matthew Wilcox
2020-02-19  3:16   ` Dave Chinner
2020-02-19  3:29   ` Eric Biggers
2020-02-17 18:46 ` [f2fs-dev] [PATCH v6 14/16] fuse: " Matthew Wilcox
2020-02-17 18:46 ` [f2fs-dev] [PATCH v6 15/19] f2fs: " Matthew Wilcox
2020-02-17 18:46 ` [f2fs-dev] [PATCH v6 15/16] iomap: " Matthew Wilcox
2020-02-17 18:46 ` [f2fs-dev] [PATCH v6 16/19] fuse: " Matthew Wilcox
2020-02-19  3:22   ` Dave Chinner
2020-02-17 18:46 ` [f2fs-dev] [PATCH v6 16/16] mm: Use memalloc_nofs_save in readahead path Matthew Wilcox
2020-02-17 18:46 ` [f2fs-dev] [PATCH v6 17/19] iomap: Restructure iomap_readpages_actor Matthew Wilcox
2020-02-19  3:17   ` John Hubbard
2020-02-19  5:35     ` Matthew Wilcox
2020-02-19  3:29   ` Dave Chinner
2020-02-19  6:04     ` Matthew Wilcox
2020-02-19  6:40       ` Dave Chinner
2020-02-19 17:06         ` Matthew Wilcox
2020-02-17 18:46 ` [f2fs-dev] [PATCH v6 18/19] iomap: Convert from readpages to readahead Matthew Wilcox
2020-02-19  3:40   ` Dave Chinner
2020-02-17 18:46 ` [f2fs-dev] [PATCH v6 19/19] mm: Use memalloc_nofs_save in readahead path Matthew Wilcox
2020-02-19  3:43   ` Dave Chinner
2020-02-19  5:22     ` Matthew Wilcox
2020-02-17 18:48 ` [f2fs-dev] [PATCH v6 00/19] Change readahead API Matthew Wilcox
2020-02-18  4:56 ` Dave Chinner
2020-02-18 13:42   ` Matthew Wilcox
2020-02-18 21:26     ` Dave Chinner
2020-02-19  3:45       ` Dave Chinner
2020-02-19  3:48         ` Matthew Wilcox
2020-02-19  3:57           ` Dave Chinner
2020-02-18 20:49 ` John Hubbard

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=20200218225235.GH24185@bombadil.infradead.org \
    --to=willy@infradead.org \
    --cc=cluster-devel@redhat.com \
    --cc=david@fromorbit.com \
    --cc=hch@lst.de \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=linux-erofs@lists.ozlabs.org \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-f2fs-devel@lists.sourceforge.net \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=ocfs2-devel@oss.oracle.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).