On Fri, 06 Nov 2020 12:53:33 -0500 Rik van Riel wrote: > On Fri, 2020-11-06 at 11:05 +0800, Hillf Danton wrote: > > On Thu, 5 Nov 2020 14:15:08 -0500 > > > Matthew Wilcox pointed out that the i915 driver opportunistically > > > allocates tmpfs memory, but will happily reclaim some of its > > > pool if no memory is available. > > > > > > Make sure the gfp mask used to opportunistically allocate a THP > > > is always at least as restrictive as the original gfp mask. > > > > > > Signed-off-by: Rik van Riel <riel@xxxxxxxxxxx> > > > Suggested-by: Matthew Wilcox <willy@xxxxxxxxxxxxx> > > > --- > > > mm/shmem.c | 21 +++++++++++++++++++++ > > > 1 file changed, 21 insertions(+) > > > > > > diff --git a/mm/shmem.c b/mm/shmem.c > > > index 6c3cb192a88d..ee3cea10c2a4 100644 > > > --- a/mm/shmem.c > > > +++ b/mm/shmem.c > > > @@ -1531,6 +1531,26 @@ static struct page *shmem_swapin(swp_entry_t > > > swap, gfp_t gfp, > > > return page; > > > } > > > > > > +/* > > > + * Make sure huge_gfp is always more limited than limit_gfp. > > > + * Some of the flags set permissions, while others set > > > limitations. > > > + */ > > > +static gfp_t limit_gfp_mask(gfp_t huge_gfp, gfp_t limit_gfp) > > > +{ > > > + gfp_t allowflags = __GFP_IO | __GFP_FS | __GFP_RECLAIM; > > > + gfp_t denyflags = __GFP_NOWARN | __GFP_NORETRY; > > > + gfp_t result = huge_gfp & ~allowflags; > > > + > > > + /* > > > + * Minimize the result gfp by taking the union with the deny > > > flags, > > > + * and the intersection of the allow flags. > > > + */ > > > + result |= (limit_gfp & denyflags); > > > > Currently NORETRY is always set regardless of i915 and if it's > > determined in 1/2 then the i915 thing can be done like > > > > return huge_gfp | (limit_gfp & __GFP_RECLAIM); > > No, if __GFP_KSWAPD_RECLAIM or __GFP_DIRECT_RECLAIM are > not set in either huge_gfp or limit_gfp, we want to ensure > the resulting gfp does not have it set, either. That means huge_gfp can play game without i915 considered if __GFP_RECLAIM is determined in 1/2 too. Then things become simpler because we have no need to check limit_gfp from the begining. > > Your suggested change > would result in __GFP_KSWAPD_RECLAIM > or __GFP_DIRECT_RECLAIM getting set if it was set in either > of the input gfp variables, which is probably not the desired > behavior. It makes sense on if we could not determine __GFP_RECLAIM without i915 considered. Now it is safe to ignore it.