On Tue, 20 Dec 2011, Linus Torvalds wrote: > On Tue, Dec 20, 2011 at 8:23 PM, Dave Kleikamp <dave.kleikamp@xxxxxxxxxx> wrote: > > > > I don't think this is a regression. It's been seen before, but the > > patch never got submitted, or was lost somewhere. I believe this > > will fix it. > > Hmm. This patch looks obviously correct. But it looks *so* obviously > correct that it just makes me suspicious - this is not new or seldom > used code, it's been this way for ages and used all the time. That > line literally goes back to 2007, commit eb2be189317d0. And it looks > like even before that we had a GFP_KERNEL for the add_to_page_cache() > case and that goes back to before the git history. So this is > *ancient*. > > Maybe almost nobody uses __read_cache_page() with a non-GFP_KERNEL gfp > and as a result we've not noticed. > > Or maybe there is some crazy reason why it calls "add_to_page_cache()" > with GFP_KERNEL. > > Adding the usual suspects for mm/filemap.c to the cc line (Andrew is > already cc'd, but Al and Hugh should comment). > > Ack's, people? Is it really as obvious as it looks, and we've just had > this bug forever? Certainly Acked-by: Hugh Dickins <hughd@xxxxxxxxxx> from me (and add_to_page_cache_locked does the masking of inappropriate bits when passing on down, so no need to worry about that aspect). I agree that it's odd that we've never noticed it before, but I don't think the GFP_KERNEL there has any more significance than oversight. Nick cleaned up some similar instances in filemap.c a few years back, I guess ones he hit in testing, but this just got left over. page_cache_read()'s GFP_KERNEL looks similarly worrying, but as it's only called by filemap_fault(), I suppose it's actually okay. Ooh, maybe you should also update that comment on GFP_KERNEL above read_cache_page_gfp()... Hugh > > Linus > > --- snip snip --- > > vfs: __read_cache_page should use gfp argument rather than GFP_KERNEL > > > > lockdep reports a deadlock in jfs because a special inode's rw semaphore > > is taken recursively. The mapping's gfp mask is GFP_NOFS, but is not used > > when __read_cache_page() calls add_to_page_cache_lru(). > > > > Signed-off-by: Dave Kleikamp <dave.kleikamp@xxxxxxxxxx> > > > > diff --git a/mm/filemap.c b/mm/filemap.c > > index c106d3b..c9ea3df 100644 > > --- a/mm/filemap.c > > +++ b/mm/filemap.c > > @@ -1828,7 +1828,7 @@ repeat: > > page = __page_cache_alloc(gfp | __GFP_COLD); > > if (!page) > > return ERR_PTR(-ENOMEM); > > - err = add_to_page_cache_lru(page, mapping, index, GFP_KERNEL); > > + err = add_to_page_cache_lru(page, mapping, index, gfp); > > if (unlikely(err)) { > > page_cache_release(page); > > if (err == -EEXIST)