Re: [PATCH v3 1/2] mm: shmem: refactor thpsize_shmem_enabled_store() with sysfs_match_string()

From: ranxiaokai627

Date: Mon May 25 2026 - 03:55:30 EST


>On Mon, May 18, 2026 at 12:32:37PM +0000, ranxiaokai627@xxxxxxx wrote:
>> From: Ran Xiaokai <ran.xiaokai@xxxxxxxxxx>
>> ---
>> mm/shmem.c | 107 ++++++++++++++++++++++++++++++-----------------------
>> 1 file changed, 60 insertions(+), 47 deletions(-)
>>
>> diff --git a/mm/shmem.c b/mm/shmem.c
>> index 3b5dc21b323c..46d2cfc30823 100644
>> --- a/mm/shmem.c
>> +++ b/mm/shmem.c
>> @@ -5526,6 +5526,29 @@ static ssize_t shmem_enabled_store(struct kobject *kobj,
>> struct kobj_attribute shmem_enabled_attr = __ATTR_RW(shmem_enabled);
>> static DEFINE_SPINLOCK(huge_shmem_orders_lock);
>>
>> +enum huge_shmem_enabled_mode {
>> + HUGE_SHMEM_ENABLED_ALWAYS = 0,
>> + HUGE_SHMEM_ENABLED_INHERIT,
>> + HUGE_SHMEM_ENABLED_WITHIN_SIZE,
>> + HUGE_SHMEM_ENABLED_ADVISE,
>> + HUGE_SHMEM_ENABLED_NEVER,
>> +};
>> +
>> +static const char * const huge_shmem_enabled_mode_strings[] = {
>> + [HUGE_SHMEM_ENABLED_ALWAYS] = "always",
>> + [HUGE_SHMEM_ENABLED_INHERIT] = "inherit",
>> + [HUGE_SHMEM_ENABLED_WITHIN_SIZE] = "within_size",
>> + [HUGE_SHMEM_ENABLED_ADVISE] = "advise",
>> + [HUGE_SHMEM_ENABLED_NEVER] = "never",
>> +};
>> +
>> +static unsigned long * const huge_shmem_orders_by_mode[] = {
>> + [HUGE_SHMEM_ENABLED_ALWAYS] = &huge_shmem_orders_always,
>> + [HUGE_SHMEM_ENABLED_INHERIT] = &huge_shmem_orders_inherit,
>> + [HUGE_SHMEM_ENABLED_WITHIN_SIZE] = &huge_shmem_orders_within_size,
>> + [HUGE_SHMEM_ENABLED_ADVISE] = &huge_shmem_orders_madvise,
>> +};
>
>As Baolin suggested, we can probably rename these for bervity.
>
>We know it's shmem, as it's in shmem.c :) so drop that.
>
>huge_mode, huge_mode_strings, huge_mode_orders seems good to me?

The old naming is indeed a bit verbose.
I will send a new version based on Baolin and your suggestion.

>> +
>> static ssize_t thpsize_shmem_enabled_show(struct kobject *kobj,
>> struct kobj_attribute *attr, char *buf)
>> {
>> @@ -5546,63 +5569,53 @@ static ssize_t thpsize_shmem_enabled_show(struct kobject *kobj,
>> return sysfs_emit(buf, "%s\n", output);
>> }
>>
>> +static bool set_shmem_enabled_mode(int order, enum huge_shmem_enabled_mode mode)
>> +{
>> + bool changed = false;
>> + enum huge_shmem_enabled_mode idx;
>> +
>> + spin_lock(&huge_shmem_orders_lock);
>> + for (idx = 0; idx < ARRAY_SIZE(huge_shmem_orders_by_mode); idx++) {
>> + if (idx == mode)
>> + changed |= !__test_and_set_bit(order, huge_shmem_orders_by_mode[idx]);
>> + else
>> + changed |= __test_and_clear_bit(order, huge_shmem_orders_by_mode[idx]);
>> + }
>> + spin_unlock(&huge_shmem_orders_lock);
>> +
>> + return changed;
>> +}
>> +
>
>Thanks for separating this out! :)