From: Breno Leitao Date: Wed, 8 Apr 2026 15:47:01 +0000 (-0700) Subject: mm: huge_memory: refactor defrag_show() to use defrag_flags[] X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=1d8274b82cd1870eba883fd20204bcd8601c3527;p=thirdparty%2Flinux.git mm: huge_memory: refactor defrag_show() to use defrag_flags[] Replace the hardcoded if/else chain of test_bit() calls and string literals in defrag_show() with a loop over defrag_flags[] and defrag_mode_strings[] arrays introduced in the previous commit. This makes defrag_show() consistent with defrag_store() and eliminates the duplicated mode name strings. Link: https://lore.kernel.org/20260408-thp_defrag-v2-2-bc544c1bde4e@debian.org Signed-off-by: Breno Leitao Acked-by: David Hildenbrand (Arm) Tested-by: Lance Yang Reviewed-by: Lance Yang Reviewed-by: Barry Song Reviewed-by: Lorenzo Stoakes Tested-by: Zi Yan Acked-by: Zi Yan Cc: Baolin Wang Cc: Dev Jain Cc: Liam Howlett Cc: Nico Pache Cc: Ryan Roberts Signed-off-by: Andrew Morton --- diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 62e00b21fdf4..e9d499da0ac7 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -455,24 +455,30 @@ static const enum transparent_hugepage_flag defrag_flags[] = { static ssize_t defrag_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) { - const char *output; + int active = DEFRAG_NEVER; + int len = 0; + int i; - if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, - &transparent_hugepage_flags)) - output = "[always] defer defer+madvise madvise never"; - else if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, - &transparent_hugepage_flags)) - output = "always [defer] defer+madvise madvise never"; - else if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, - &transparent_hugepage_flags)) - output = "always defer [defer+madvise] madvise never"; - else if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, - &transparent_hugepage_flags)) - output = "always defer defer+madvise [madvise] never"; - else - output = "always defer defer+madvise madvise [never]"; + for (i = 0; i < ARRAY_SIZE(defrag_flags); i++) { + if (test_bit(defrag_flags[i], &transparent_hugepage_flags)) { + active = i; + break; + } + } - return sysfs_emit(buf, "%s\n", output); + for (i = 0; i < ARRAY_SIZE(defrag_mode_strings); i++) { + if (i == active) + len += sysfs_emit_at(buf, len, "[%s] ", + defrag_mode_strings[i]); + else + len += sysfs_emit_at(buf, len, "%s ", + defrag_mode_strings[i]); + } + + /* Replace trailing space with newline */ + buf[len - 1] = '\n'; + + return len; } static ssize_t defrag_store(struct kobject *kobj,