On Tue, Mar 31, 2020 at 08:04:21PM -0700, Matthew Wilcox wrote: > From: "Matthew Wilcox (Oracle)" <willy@xxxxxxxxxxxxx> > > bio_alloc() can fail when we use GFP_NORETRY. If it does, allocate > a bio large enough for a single page like mpage_readpages() does. Why does mpage_readpages() do that? Is this a means to guarantee some kind of forward (readahead?) progress? Forgive my ignorance, but if memory is so tight we can't allocate a bio for readahead then why not exit having accomplished nothing? --D > Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> > --- > fs/iomap/buffered-io.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c > index 417115bfaf6b..c258801f18d4 100644 > --- a/fs/iomap/buffered-io.c > +++ b/fs/iomap/buffered-io.c > @@ -302,6 +302,7 @@ iomap_readpage_actor(struct inode *inode, loff_t pos, loff_t length, void *data, > > if (!ctx->bio || !is_contig || bio_full(ctx->bio, plen)) { > gfp_t gfp = mapping_gfp_constraint(page->mapping, GFP_KERNEL); > + gfp_t orig_gfp = gfp; > int nr_vecs = (length + PAGE_SIZE - 1) >> PAGE_SHIFT; > > if (ctx->bio) > @@ -310,6 +311,8 @@ iomap_readpage_actor(struct inode *inode, loff_t pos, loff_t length, void *data, > if (ctx->is_readahead) /* same as readahead_gfp_mask */ > gfp |= __GFP_NORETRY | __GFP_NOWARN; > ctx->bio = bio_alloc(gfp, min(BIO_MAX_PAGES, nr_vecs)); > + if (!ctx->bio) > + ctx->bio = bio_alloc(orig_gfp, 1); > ctx->bio->bi_opf = REQ_OP_READ; > if (ctx->is_readahead) > ctx->bio->bi_opf |= REQ_RAHEAD; > -- > 2.25.1 >