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);
> 

Reply via email to