On 04/06/2017 03:17 AM, David Rientjes wrote: > Setting thp defrag mode of "defer+madvise" actually sets "defer" in the > kernel due to the name similarity and the out-of-order way the string is > checked in defrag_store(). > > Check the string in the correct order so that > TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG is set appropriately for > "defer+madvise". > > Fixes: 21440d7eb904 ("mm, thp: add new defer+madvise defrag option") > Signed-off-by: David Rientjes <rient...@google.com>
Acked-by: Vlastimil Babka <vba...@suse.cz> > --- > mm/huge_memory.c | 12 ++++++------ > 1 file changed, 6 insertions(+), 6 deletions(-) > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -240,18 +240,18 @@ static ssize_t defrag_store(struct kobject *kobj, > clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, > &transparent_hugepage_flags); > clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, > &transparent_hugepage_flags); > set_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, > &transparent_hugepage_flags); > - } else if (!memcmp("defer", buf, > - min(sizeof("defer")-1, count))) { > - clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, > &transparent_hugepage_flags); > - clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, > &transparent_hugepage_flags); > - clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, > &transparent_hugepage_flags); > - set_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, > &transparent_hugepage_flags); > } else if (!memcmp("defer+madvise", buf, > min(sizeof("defer+madvise")-1, count))) { > clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, > &transparent_hugepage_flags); > clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, > &transparent_hugepage_flags); > clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, > &transparent_hugepage_flags); > set_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, > &transparent_hugepage_flags); > + } else if (!memcmp("defer", buf, > + min(sizeof("defer")-1, count))) { > + clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, > &transparent_hugepage_flags); > + clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, > &transparent_hugepage_flags); > + clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, > &transparent_hugepage_flags); > + set_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, > &transparent_hugepage_flags); > } else if (!memcmp("madvise", buf, > min(sizeof("madvise")-1, count))) { > clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, > &transparent_hugepage_flags); >