On 09/06/2017 06:37 AM, js1304@xxxxxxxxx wrote: > From: Joonsoo Kim <iamjoonsoo.kim@xxxxxxx> > > slub uses higher order allocation than it actually needs. In this case, > we don't want to do direct reclaim to make such a high order page since > it causes a big latency to the user. Instead, we would like to fallback > lower order allocation that it actually needs. > > However, we also want to get this higher order page in the next time > in order to get the best performance and it would be a role of > the background thread like as kswapd and kcompactd. To wake up them, > we should not clear __GFP_KSWAPD_RECLAIM. > > Unlike this intention, current code clears __GFP_KSWAPD_RECLAIM so fix it. > Current unintended code is done by Mel's commit 444eb2a449ef ("mm: thp: > set THP defrag by default to madvise and add a stall-free defrag option") > for slub part. It removes a special case in __alloc_page_slowpath() > where including __GFP_THISNODE and lacking ~__GFP_DIRECT_RECLAIM > effectively means also lacking __GFP_KSWAPD_RECLAIM. However, slub > doesn't use __GFP_THISNODE so it is not the case for this purpose. So, > partially reverting this code in slub doesn't hurt Mel's intention. > > Note that this patch does some clean up, too. > __GFP_NOFAIL is cleared twice so remove one. > > Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@xxxxxxx> Acked-by: Vlastimil Babka <vbabka@xxxxxxx> > --- > mm/slub.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/mm/slub.c b/mm/slub.c > index 163352c..45f4a4b 100644 > --- a/mm/slub.c > +++ b/mm/slub.c > @@ -1578,8 +1578,12 @@ static struct page *allocate_slab(struct kmem_cache *s, gfp_t flags, int node) > * so we fall-back to the minimum order allocation. > */ > alloc_gfp = (flags | __GFP_NOWARN | __GFP_NORETRY) & ~__GFP_NOFAIL; > - if ((alloc_gfp & __GFP_DIRECT_RECLAIM) && oo_order(oo) > oo_order(s->min)) > - alloc_gfp = (alloc_gfp | __GFP_NOMEMALLOC) & ~(__GFP_RECLAIM|__GFP_NOFAIL); > + if (oo_order(oo) > oo_order(s->min)) { > + if (alloc_gfp & __GFP_DIRECT_RECLAIM) { > + alloc_gfp |= __GFP_NOMEMALLOC; > + alloc_gfp &= ~__GFP_DIRECT_RECLAIM; > + } > + } > > page = alloc_slab_page(s, alloc_gfp, node, oo); > if (unlikely(!page)) { > -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>