From nobody Sat Apr 4 06:16:22 2026 Received: from stravinsky.debian.org (stravinsky.debian.org [82.195.75.108]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 46F583CE4B7 for ; Fri, 20 Mar 2026 16:06:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=82.195.75.108 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774022784; cv=none; b=CDxDnRTNBa4rp0FGHsUsQjLijVttzShYGWQCwdn6BjGDiP8k9IMhsJo4OoWiQhCh2TcdPg6pWuEt1TbYjPpIShi1EjL+5E+6Jis2CmogZ8mrlr7AKok6bL1YDbdeqhB+CywJiizVmFtSpVYY2Ax1OoDcoAremheK9ylkDzqweaA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774022784; c=relaxed/simple; bh=jcKlEqc3tnW6wJZXZzWXv+1ozlKUNcVO+d6CbRLONSk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Er04wIdZ/Ni2kffmuDA33yvilcw2sd55NdLSjDmW1Q3s9wEOYsFffxXMDACSDzDhVJzNBBTdRupG8PVM9kcnTGkR1DhB6kFbr4clOkjL5uI5Ikr0bA6zu5obLeDBxCEJwvwEl3cYY3yoqlFDpc+VAZomrd9my/YbL+3SgAtPmfU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=debian.org; spf=none smtp.mailfrom=debian.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b=b25iGiyl; arc=none smtp.client-ip=82.195.75.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=debian.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=debian.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b="b25iGiyl" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debian.org; s=smtpauto.stravinsky; h=X-Debian-User:Cc:To:In-Reply-To:References: Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date: From:Reply-To:Content-ID:Content-Description; bh=l9kndfgMCZCKetzY2dV5de12tWjdS4gQ2EEcaKP+Gqc=; b=b25iGiylgLjyndgl6W6bc3ZGs6 KlZSpNyWNDd84Ib7bnrJ+Twnr9qOgFHISsnAiVNV+uIY5IRkPjaCmwxBzILLlCDoZhRN0QUFFw7iE TSw5gbm7SoRGNIgKdcnUlmGZFpPpZ2NnSNpD5FUH7TqifeRy1+RwVjWgdw3zTTwn6bipDVQomYYn5 OJFj8OUWf56/viedsHtvvTjPblWDtdG0pNDGzZt6a814Gkaesz+I0ob82q4nZZlw3KaNPsE8HrlWP Zb4HzbBMip+OMf/F0/1xxPECfYQ9+DOae+E2re5yFY7R2EiYKr/DzHFZSk1w1+CcHj4uvX2m7eV1L RwHLUoUA==; Received: from authenticated user by stravinsky.debian.org with esmtpsa (TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim 4.94.2) (envelope-from ) id 1w3cMR-005Jzp-2R; Fri, 20 Mar 2026 16:06:06 +0000 From: Breno Leitao Date: Fri, 20 Mar 2026 09:05:24 -0700 Subject: [PATCH 1/2] mm: huge_memory: use sysfs_match_string() in defrag_store() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260320-thp_defrag-v1-1-6ab15d0d26eb@debian.org> References: <20260320-thp_defrag-v1-0-6ab15d0d26eb@debian.org> In-Reply-To: <20260320-thp_defrag-v1-0-6ab15d0d26eb@debian.org> To: Andrew Morton , David Hildenbrand , Lorenzo Stoakes , Zi Yan , Baolin Wang , "Liam R. Howlett" , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Lance Yang Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Breno Leitao , kernel-team@meta.com X-Mailer: b4 0.15-dev-363b9 X-Developer-Signature: v=1; a=openpgp-sha256; l=4764; i=leitao@debian.org; h=from:subject:message-id; bh=jcKlEqc3tnW6wJZXZzWXv+1ozlKUNcVO+d6CbRLONSk=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBpvXBkBmQWp9u1MFJo5jWEpvK9HSU85PcjeejVy RJ2GuPAYvyJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCab1wZAAKCRA1o5Of/Hh3 bTqrD/4rF5MJ0vclBnpKacOkjWgWRZjhwC+jgdt91QucxfAEI0/Btsk0hztuEMeldxSsgHw34kh xnkBg0oj0HaV/V798fnohzt12Mb/lXH/si28DJ5L430kkeh1TxyuDkRNL2GfpachQig+Yw1Haf/ QjlGJgh+eVopR4RQIgKZFtlYipYahaFkRVOXE1iIY5s3OwUE2ILCRYM0tjh0LQo4gLsoQnsrx26 Ts1GfEbAEH0lrG08p7EAXDEh1f7qIOYYp5jFtu3GS38SxQ2d7mL9j/Pz0FPrfX1H8ijf/QkYVwY vYzcGJ9gLLjcMDKSxsgiDvWzZidd/rk0cW+9HfgF/ViMJL19l7bV/5LADnCZT6qVotdnZU4TqsT 9OnI+d3YTOpQ56X5QwgSpyzFOayTcxjqZUBSce41KryzoOrfIJyCJfBe+81rXsMNWC1InUSRT9w GY/9aTOCfT9B+qaFY6TelVCEdE97qaf7xHPrM+bY6kvB8tniF8mUDWNaCmvTvmUG5O8cttimGta UD6d8XRI/v8KG3vN5N7IhTLW0PKs5RBrFwbMM1RyE0aF6cQnVY+gPfw2+Oc2ZcNmeeaxHtsRepG mJYcpbt8jrulAFpjOD+W1rgf3l8sIOPP/oNeOjm66WnN2IkE+SmmNPg5Uf+1fNr1RCQESsvqveh BC+0pw8nYMHqYGw== X-Developer-Key: i=leitao@debian.org; a=openpgp; fpr=AC8539A6E8F46702CA4A439B35A3939FFC78776D X-Debian-User: leitao Replace the if/else chain of sysfs_streq() calls in defrag_store() with sysfs_match_string() and a defrag_mode_strings[] table. Introduce enum defrag_mode and defrag_flags[] array mapping each mode to its corresponding transparent_hugepage_flag. The store function now loops over defrag_flags[], setting the bit for the selected mode and clearing the others. When mode is DEFRAG_NEVER (index 4), no index in the 4-element defrag_flags[] matches, so all flags are cleared. Note that the enum ordering (always, defer, defer+madvise, madvise, never) differs from the original if/else chain order in defrag_store() (always, defer+madvise, defer, madvise, never). This is intentional to match the display order used by defrag_show(). This is a follow-up cleanup to commit 522dfb4ba71f ("mm: huge_memory: refactor anon_enabled_store() with change_anon_orders()") which applied the same sysfs_match_string() pattern to anon_enabled_store(). Signed-off-by: Breno Leitao Acked-by: David Hildenbrand (Arm) Reviewed-by: Barry Song Reviewed-by: Lance Yang Tested-by: Lance Yang --- mm/huge_memory.c | 60 ++++++++++++++++++++++++++++++++--------------------= ---- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 3fc02913b63e3..4843e2154038f 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -421,6 +421,29 @@ ssize_t single_hugepage_flag_store(struct kobject *kob= j, return count; } =20 +enum defrag_mode { + DEFRAG_ALWAYS =3D 0, + DEFRAG_DEFER =3D 1, + DEFRAG_DEFER_MADVISE =3D 2, + DEFRAG_MADVISE =3D 3, + DEFRAG_NEVER =3D 4, +}; + +static const char * const defrag_mode_strings[] =3D { + [DEFRAG_ALWAYS] =3D "always", + [DEFRAG_DEFER] =3D "defer", + [DEFRAG_DEFER_MADVISE] =3D "defer+madvise", + [DEFRAG_MADVISE] =3D "madvise", + [DEFRAG_NEVER] =3D "never", +}; + +static const enum transparent_hugepage_flag defrag_flags[] =3D { + [DEFRAG_ALWAYS] =3D TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, + [DEFRAG_DEFER] =3D TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, + [DEFRAG_DEFER_MADVISE] =3D TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLA= G, + [DEFRAG_MADVISE] =3D TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, +}; + static ssize_t defrag_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) { @@ -448,34 +471,19 @@ static ssize_t defrag_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count) { - if (sysfs_streq(buf, "always")) { - clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_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_hugepa= ge_flags); - set_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, &transparent_hugepage_f= lags); - } else if (sysfs_streq(buf, "defer+madvise")) { - 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_hugepa= ge_flags); - set_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, &transparent_hu= gepage_flags); - } else if (sysfs_streq(buf, "defer")) { - 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_hugepa= ge_flags); - set_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, &transparent_hugepage_f= lags); - } else if (sysfs_streq(buf, "madvise")) { - 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_KSWAPD_OR_MADV_FLAG, &transparent_= hugepage_flags); - set_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, &transparent_hugepage= _flags); - } else if (sysfs_streq(buf, "never")) { - 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_KSWAPD_OR_MADV_FLAG, &transparent_= hugepage_flags); - clear_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, &transparent_hugepa= ge_flags); - } else + int mode, m; + + mode =3D sysfs_match_string(defrag_mode_strings, buf); + if (mode < 0) return -EINVAL; =20 + for (m =3D 0; m < ARRAY_SIZE(defrag_flags); m++) { + if (m =3D=3D mode) + set_bit(defrag_flags[m], &transparent_hugepage_flags); + else + clear_bit(defrag_flags[m], &transparent_hugepage_flags); + } + return count; } static struct kobj_attribute defrag_attr =3D __ATTR_RW(defrag); --=20 2.52.0 From nobody Sat Apr 4 06:16:22 2026 Received: from stravinsky.debian.org (stravinsky.debian.org [82.195.75.108]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 46E5C3CE4B0 for ; Fri, 20 Mar 2026 16:06:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=82.195.75.108 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774022784; cv=none; b=GjGbY/Y73g08BBkgUwvr54UaLmxh8h2d8CUmD7zO+RPiNR0FX/scaCdPb5r0zM++9Phxga1T6geN/qEXSt4RZ3upBwWceJOJwzP4DBvs5lX2ErmBQLCmdUbhqwF4xIoi2kKYioCXMdtlGjLjRwvTX7fV/pwJEgcHhwX5pGqIpo4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774022784; c=relaxed/simple; bh=aX2KZFfA6pIuDllYR3DsQuJaEqcSVBTbVhZiGsWJiI4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NLC/K4AIm+AcXE8YXgJUBlnaM8HARDEQLScaqEPWoRJEUZ/YlZ74gJHt9BKeXeEl7h3jF0EZ86aJ5g8Hm42c8muHQzUtbTfNtJqPHNdjXp9U4ueGvZCMuj1fQE0O8GcvCi/H9puaDdD7xpZYdJnXtaVHQddZQLUtZKI7biKm+wc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=debian.org; spf=none smtp.mailfrom=debian.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b=Hit2PAW4; arc=none smtp.client-ip=82.195.75.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=debian.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=debian.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b="Hit2PAW4" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debian.org; s=smtpauto.stravinsky; h=X-Debian-User:Cc:To:In-Reply-To:References: Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date: From:Reply-To:Content-ID:Content-Description; bh=ombbguqSvsfcR5OKrmWvTSB0hfi9HSgAPvcR9juCuJM=; b=Hit2PAW4bWRcnfyMj+KBd3J3Y7 cBS0JPcI5wvp9SPveLc2jS2h+qtQmoUwJ+B0sSq5zcH0Bf1pTZM8bYZ4Ug2qrVQaGR4SV6cvxokHB 6KlLnqQ7TawSCxu8vEcY89wVI1CUvTFkDhfP2W7UjqJv+XptTOw22WPkOG7xy1e5v9ZlH6ZIEIhMz d6jfXC2QB9GfesOM/PJGbHHX87WoEnrRBIpF1g8NAb1EIjtNISnO7T7EzpbABghfg+Vggsy1TGY+Q 5s5fkr9bZZ+U2oFRbYdlGk/jSsiqRlYal9ZQOrmzeac3mlDP9m1lQI3oINMRUc7a93wYn4DvCwS2x OK6e18tg==; Received: from authenticated user by stravinsky.debian.org with esmtpsa (TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim 4.94.2) (envelope-from ) id 1w3cMV-005Jzr-Kg; Fri, 20 Mar 2026 16:06:10 +0000 From: Breno Leitao Date: Fri, 20 Mar 2026 09:05:25 -0700 Subject: [PATCH 2/2] mm: huge_memory: refactor defrag_show() to use defrag_flags[] Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260320-thp_defrag-v1-2-6ab15d0d26eb@debian.org> References: <20260320-thp_defrag-v1-0-6ab15d0d26eb@debian.org> In-Reply-To: <20260320-thp_defrag-v1-0-6ab15d0d26eb@debian.org> To: Andrew Morton , David Hildenbrand , Lorenzo Stoakes , Zi Yan , Baolin Wang , "Liam R. Howlett" , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Lance Yang Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Breno Leitao , kernel-team@meta.com X-Mailer: b4 0.15-dev-363b9 X-Developer-Signature: v=1; a=openpgp-sha256; l=2220; i=leitao@debian.org; h=from:subject:message-id; bh=aX2KZFfA6pIuDllYR3DsQuJaEqcSVBTbVhZiGsWJiI4=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBpvXBk9E2fUD00Vce2QBU6GuX4J62Eq6BFDDOHL 5X6QDyvdKCJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCab1wZAAKCRA1o5Of/Hh3 bV8QD/91JXc3u4ePzddbbBYgTnNz4d2VOubxMgFrQPPs35sD9wLqLd/bsAAJoZ6zR9dMBwsK+9n ruvuym3dnoNNM5uqrIDKKpfglnJadueJzo7VGP+uN9dw6GEXSOnOHk7YTGjqLcUlgOeH6cjxo0z LGKU8kUO/Jdcg5iOXUzHfOy4tWGCM69PWwlb624I/8WhUat1sYLM99fM6HsvpHdjmp8zmi4rCPT zsED7jXvc44bm7K+pwTjVtX7E97Dcbxcgrh1yMMa6/KgGHbbgR10V92km8+RySKV6zTGeqZwvOX WAs9GG/umKvpTdecpRiYX/n2fguJz9kc3nUkcabw27ge/YDsLLj0ADoXTtqOJq4E7hLDuUEVWg3 2sn4zF2yFDh/FP7ZCcMA24OPtAOyLD+VJNQNpTN5pPCFduluxQ9bs/0eXOf3fVt8hXUQmbwxXZ6 EPF3PIU0WqpLGRU4eK42CpdmSDZxyxI1aalXaf4CZuKAB2tqWp3tOPAeIhywYZvt2rY6QVG2jmd Ad4SiYa7OFzxyRlYQjqsEYbSFyo9LekbA05HOgREQncWhL1qSd3P24kx6gobC7oJYK2J7SMBwYd GaGUPo65wZsgtht2QlkNTnjqwhCwwDORC2hQUusyLkE3sGAYuUzspu1i5qOu60djzhGlzJFGTPR Pr696ULtNhxyO+A== X-Developer-Key: i=leitao@debian.org; a=openpgp; fpr=AC8539A6E8F46702CA4A439B35A3939FFC78776D X-Debian-User: leitao 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. Signed-off-by: Breno Leitao Acked-by: David Hildenbrand (Arm) Reviewed-by: Barry Song Reviewed-by: Lance Yang Tested-by: Lance Yang --- mm/huge_memory.c | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 4843e2154038f..eaa6623fa49e2 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -447,24 +447,30 @@ static const enum transparent_hugepage_flag defrag_fl= ags[] =3D { static ssize_t defrag_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) { - const char *output; + int active =3D DEFRAG_NEVER; + int len =3D 0; + int i; =20 - if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG, - &transparent_hugepage_flags)) - output =3D "[always] defer defer+madvise madvise never"; - else if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG, - &transparent_hugepage_flags)) - output =3D "always [defer] defer+madvise madvise never"; - else if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG, - &transparent_hugepage_flags)) - output =3D "always defer [defer+madvise] madvise never"; - else if (test_bit(TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, - &transparent_hugepage_flags)) - output =3D "always defer defer+madvise [madvise] never"; - else - output =3D "always defer defer+madvise madvise [never]"; + for (i =3D 0; i < ARRAY_SIZE(defrag_flags); i++) { + if (test_bit(defrag_flags[i], &transparent_hugepage_flags)) { + active =3D i; + break; + } + } =20 - return sysfs_emit(buf, "%s\n", output); + for (i =3D 0; i < ARRAY_SIZE(defrag_mode_strings); i++) { + if (i =3D=3D active) + len +=3D sysfs_emit_at(buf, len, "[%s] ", + defrag_mode_strings[i]); + else + len +=3D sysfs_emit_at(buf, len, "%s ", + defrag_mode_strings[i]); + } + + /* Replace trailing space with newline */ + buf[len - 1] =3D '\n'; + + return len; } =20 static ssize_t defrag_store(struct kobject *kobj, --=20 2.52.0