From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7FFA7D13587 for ; Sun, 27 Oct 2024 21:54:34 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CFFC46B0085; Sun, 27 Oct 2024 17:54:33 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C88CF6B0088; Sun, 27 Oct 2024 17:54:33 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id ADB2B6B0089; Sun, 27 Oct 2024 17:54:33 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 8C03C6B0085 for ; Sun, 27 Oct 2024 17:54:33 -0400 (EDT) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id CA46E1604B8 for ; Sun, 27 Oct 2024 21:54:07 +0000 (UTC) X-FDA: 82720736322.16.BE87E0A Received: from mail-vk1-f179.google.com (mail-vk1-f179.google.com [209.85.221.179]) by imf28.hostedemail.com (Postfix) with ESMTP id 77ECBC0006 for ; Sun, 27 Oct 2024 21:54:08 +0000 (UTC) Authentication-Results: imf28.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=FDRO3lMR; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf28.hostedemail.com: domain of 21cnbao@gmail.com designates 209.85.221.179 as permitted sender) smtp.mailfrom=21cnbao@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1730066029; a=rsa-sha256; cv=none; b=lvMux3YdsTDzK1qBB1/66bKJ/GAPbznGKDoUsbCQBVzebUuLytrCpk6hNfsByiZrgLzWVf BorpzL9V26iV0LwIwRNpF8hnZKd7rkmW8LErieQ5g2kJMMj44/gnHBJtwA115LAketRQ2j SWXxWlLHSN0bBM8bHvXCpCVPqy5OGQw= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=FDRO3lMR; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf28.hostedemail.com: domain of 21cnbao@gmail.com designates 209.85.221.179 as permitted sender) smtp.mailfrom=21cnbao@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1730066029; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=z4LBARO2VWUVfjfQOMm1iO16EEmOYiq18g4Z+k4irkM=; b=6Sq4qEdgVVgsJJtaU4JGIl2xDXbfv7mMEc/Ffv+crRSGudMTf3vJ0M6j5afKFcvfBLKCPP 1qijOuWChTTz/a6XpWs3y/4X+wNDr817XS1CMWUdTkUFr9qfR37XYmgLlxANwRWLf2J9Jw V6wtwY5CGuhLTgdzyIVjlTO1ZA4i27U= Received: by mail-vk1-f179.google.com with SMTP id 71dfb90a1353d-50d479aef64so1125690e0c.0 for ; Sun, 27 Oct 2024 14:54:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1730066070; x=1730670870; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=z4LBARO2VWUVfjfQOMm1iO16EEmOYiq18g4Z+k4irkM=; b=FDRO3lMRzKsI4zx93yYlBzQm0BGpBY60m/5sA1cWgnm/s1kdpgZHIDeSCneyHHshvA dankmLX2jYLJ5YCQK9+t+Y5NQlIBJlpgvP/5hPNGfBdtTDCdYsvmAUqqedO99jkjX4VE U7cHfA+GLH7LCvuwdGzitYw88rurG5+9nu0Y8U5U0cOki0PJFoPmF/eHCQADdKFtKuLm AjhCDf5ASvJHHT1GT0NHimf4zOCc+TuZ5QxtwSLEtOzbp4JvphU7sVsycn9V8IVWoA8K R9KlBbPM/c1+nHQ/WM8vDLa7mS4H7IdW5CKFXn4M8yJXLnelAcfn6nklNhVnY4Rwmldo 9sNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1730066070; x=1730670870; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=z4LBARO2VWUVfjfQOMm1iO16EEmOYiq18g4Z+k4irkM=; b=WkmkLJkgsPK5jqE8oqtQGPh7WMTRl4HTmHveSr1KB2VRQJn5xAuFSI/C5FQNyPSTIL M7vNhnJLVu3VvgVXbfemN8ECrgFzF8w4aPEguUVBKQb4Z7fFR9iAtBDaXrCV8Vx9mhIS ANLACaFzxtRtlARF+wuIAHoRTwZKJuRWZS3CTRl8eoFtgFbT6Wma4+1/jiioV9Dg9qAs ZUEJPK+dBzUWLt2ddxVa6UQHLS9cBVkEKGHXWkd6izakMG2QU3XmC0atZI2z81i11Twu KdFSebC/9/jm2K2Cnf5CcLx4YxiJJPZYMT7rMib4Qj5uuivZTBTFVC89SMTC0X5sWl/2 e8KA== X-Forwarded-Encrypted: i=1; AJvYcCXBzLrsZRCQklIPkfrNhQXVxplajdLmqYu+wJN+W8mbDsT0o+ZTAsw8eooL77ixGepgofJiX7vCkg==@kvack.org X-Gm-Message-State: AOJu0YxisEiC3Bgu52qF4lYwRp3Jn75FWzfmVSUmt1ENxS2Z2mEKTtQ/ Tl+97u9ICDVL3RMBBKsv9ofirT/94JRkSEx4zdmFfSlUjlaknzR5YVwWUc0oeU+YHY4yFJKblFB R7ILzlOD09FzrSBhU4kDc41hSA5s= X-Google-Smtp-Source: AGHT+IEpmLTD4g+THx4mqPFX4Zc1dkM6ydFdYrW6KOFru8Qg3FBmXgclL1JPebcHwOhqBqrB92Mvsy5hkiYKBiJmqhg= X-Received: by 2002:a05:6122:1ad5:b0:50a:36ab:c788 with SMTP id 71dfb90a1353d-51014ff5f55mr3245260e0c.3.1730066070273; Sun, 27 Oct 2024 14:54:30 -0700 (PDT) MIME-Version: 1.0 References: <20241027175743.1056710-1-mcanal@igalia.com> <20241027175743.1056710-4-mcanal@igalia.com> In-Reply-To: <20241027175743.1056710-4-mcanal@igalia.com> From: Barry Song <21cnbao@gmail.com> Date: Mon, 28 Oct 2024 10:54:19 +1300 Message-ID: Subject: Re: [PATCH 3/3] mm: shmem: override mTHP shmem default with a kernel parameter To: =?UTF-8?B?TWHDrXJhIENhbmFs?= Cc: Jonathan Corbet , Andrew Morton , Hugh Dickins , David Hildenbrand , Ryan Roberts , Baolin Wang , Lance Yang , linux-mm@kvack.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-dev@igalia.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspam-User: X-Stat-Signature: kqne9enn69mrhrqbuezw3kke4qysp55h X-Rspamd-Queue-Id: 77ECBC0006 X-Rspamd-Server: rspam02 X-HE-Tag: 1730066048-454940 X-HE-Meta: U2FsdGVkX1+EYIsD73P1QZeydTfLKFDmg6P2dKuf40yXdzcVwjdJxkl/vil29+DYn3KpIupuDPyNWvu7f2WlxlxLGngvQd9OmgcOQkXBaO0vx/+og3Z3HAdtSMpm+gxgO2oVDIA0WeBEtIDwVMRcMvWOdbN5CK+sXzhIH0LZG//W35Wg1i4sPpFJrx7GdEhi4YmEG6PsvqLWtWZMiB81rJ8r8J7x4dWUl4/KBwtNjAQevLUnZb8/mcg+u+QS8ET5DTzNHbjQu54bDBAcjr8QrA1tz2HmXeykgThkjd9akLo+V7lRYwdfkotMnrM5uZGoR5Muw10rtxHLqXnxhBTOfreAm2kVus4xyVL+i8dvFjhRMcguWpac+NGFYLwgvCyXhFt0S6zZ6JBF3vfNPNgpYwAx5+4m3+yeCIHbkw87K/BkPp/E4AIVP5csDgjAN+gk+ckheGy1XuR7Ru+W7liugsqr2nXbpsdOrqZvxIGJV7+hA2KtU9kOWHT5EfaC4J8KLHc91RnC6X7viPh3hC4Igz2tSMaFMxLJQ8xczRHAXz+y9cJwHcPn1uBYBbxOxwJoIod6w4TEitw176idx9Ffe33uvRK+/B3a+mG6ckczEmOJvRh5QXAvFLb8yFMp2oilkwn5eRuj30RcX76UzfyQC4SjRKlI4K0epuovB16KkmMMSmlVkOHOaQ8dwnS9W9neUGwC/lh+YUYL6PJFEayHFkxoaIlryWnFgjhWrSBkDRoU6M5NoQUAOrb7tOqPFR+Gnxe4dt3aP1dolVPkjeZwP2Qn2hb0JXRaNyB1dNGVKwzXN3Mu+CsV6JzvrA8qQL8+3J67DbNEKVyxODd18GsQ4XOorDCBkxwwtX6RdBEPdVes2d5tojrpJTc+KHPmi2lFqAVsz3q+SeAx4zsT1jcdRG0dfHZxV6gE8ek7mzq+uwJ4DqWT+Z8Te6eY7iM8kd6tIWBnly4IItWEODhzlnl t8KckCr0 8baYRTDOThI8Ke3o9W247Hg61YlmQG/kKOyslLv5SaRyb1MgwsRRPHsiex/B0hIoXgfCpWzv2RUkbSmzCmS2E5GSBpyZAlitCOcBDuWVviQlp7uwzo5Jn0NO563s78Od97d2+eWzgGvNnAd/vOufx1aYRnUjF89QTsaRLFeRnXAFE1jqB3aWOZ4R9HJgGzpI32n1OVTU462QVj+2E03VkYROMpGUhw9zlZtbK0ToI3piXveBnuZg8B48U0/l7rDMPXd3+cgH5pS9Tq5Wi6tijCE9rQjDHnR57Xxzo7kgBzPB83/zKL7LqlVimLrK8EAKERRKuX2BAfzOrhQGYmNCiEsgXHEsKYFWJEsoMUfxU/g6IPIixk8ZYv/SUR04FjCY3BuaP X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Mon, Oct 28, 2024 at 6:58=E2=80=AFAM Ma=C3=ADra Canal wrote: > > Add the ``thp_shmem=3D`` kernel command line to allow specifying the > default policy of each supported shmem hugepage size. The kernel paramete= r > accepts the following format: > > thp_shmem=3D[KMG],[KMG]:;[KMG]-[KMG]: > > For example, > > thp_shmem=3D16K-64K:always;128K,512K:inherit;256K:advise;1M-2M:never;4M-8= M:within_size > > By configuring the default policy of several shmem huge pages, the user > can take advantage of mTHP before it's been configured through sysfs. > > Signed-off-by: Ma=C3=ADra Canal > --- > .../admin-guide/kernel-parameters.txt | 10 ++ > Documentation/admin-guide/mm/transhuge.rst | 17 +++ > mm/shmem.c | 109 +++++++++++++++++- > 3 files changed, 135 insertions(+), 1 deletion(-) > Hi Ma=C3=ADra, > diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentat= ion/admin-guide/kernel-parameters.txt > index acabb04d0dd4..595fa096e28b 100644 > --- a/Documentation/admin-guide/kernel-parameters.txt > +++ b/Documentation/admin-guide/kernel-parameters.txt > @@ -6700,6 +6700,16 @@ > Force threading of all interrupt handlers except = those > marked explicitly IRQF_NO_THREAD. > > + shmem_anon=3D [KNL] > + Format: [KMG],[KMG]:;[K= MG]-[KMG]: > + Control the default policy of each hugepage size = for the > + internal shmem mount. is one of policies= available > + for the shmem mount ("always", "inherit", "never"= , "within_size", > + and "advise"). > + It can be used multiple times for multiple shmem = THP sizes. > + See Documentation/admin-guide/mm/transhuge.rst fo= r more > + details. I'm not sure this is the right name. How about "thp_shmem"? > + > topology=3D [S390,EARLY] > Format: {off | on} > Specify if the kernel should make use of the cpu > diff --git a/Documentation/admin-guide/mm/transhuge.rst b/Documentation/a= dmin-guide/mm/transhuge.rst > index 9b5b02c4d1ab..47e7fc30e22d 100644 > --- a/Documentation/admin-guide/mm/transhuge.rst > +++ b/Documentation/admin-guide/mm/transhuge.rst > @@ -332,6 +332,23 @@ allocation policy for the internal shmem mount by us= ing the kernel parameter > seven valid policies for shmem (``always``, ``within_size``, ``advise``, > ``never``, ``deny``, and ``force``). > > +In the same manner as ``thp_anon`` controls each supported anonymous THP > +size, ``thp_shmem`` controls each supported shmem THP size. ``thp_shmem`= ` > +has the same format as ``thp_anon``, but also supports the policy > +``within_size``. > + > +``thp_shmem=3D`` may be specified multiple times to configure all THP si= zes > +as required. If ``thp_shmem=3D`` is specified at least once, any shmem T= HP > +sizes not explicitly configured on the command line are implicitly set t= o > +``never``. > + > +``transparent_hugepage_shmem`` setting only affects the global toggle. I= f > +``thp_shmem`` is not specified, PMD_ORDER hugepage will default to > +``inherit``. However, if a valid ``thp_shmem`` setting is provided by th= e > +user, the PMD_ORDER hugepage policy will be overridden. If the policy fo= r > +PMD_ORDER is not defined within a valid ``thp_shmem``, its policy will > +default to ``never``. > + > Hugepages in tmpfs/shmem > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > diff --git a/mm/shmem.c b/mm/shmem.c > index 24cdeafd8260..0a7a7d04f725 100644 > --- a/mm/shmem.c > +++ b/mm/shmem.c > @@ -136,6 +136,7 @@ static unsigned long huge_shmem_orders_always __read_= mostly; > static unsigned long huge_shmem_orders_madvise __read_mostly; > static unsigned long huge_shmem_orders_inherit __read_mostly; > static unsigned long huge_shmem_orders_within_size __read_mostly; > +static bool shmem_orders_configured __initdata; > #endif > > #ifdef CONFIG_TMPFS > @@ -5013,7 +5014,8 @@ void __init shmem_init(void) > * Default to setting PMD-sized THP to inherit the global setting= and > * disable all other multi-size THPs. > */ > - huge_shmem_orders_inherit =3D BIT(HPAGE_PMD_ORDER); > + if (!shmem_orders_configured) > + huge_shmem_orders_inherit =3D BIT(HPAGE_PMD_ORDER); > #endif > return; > > @@ -5174,6 +5176,26 @@ struct kobj_attribute thpsize_shmem_enabled_attr = =3D > > #if defined(CONFIG_TRANSPARENT_HUGEPAGE) > > +static inline int get_order_from_str(const char *size_str) > +{ > + unsigned long size; > + char *endptr; > + int order; > + > + size =3D memparse(size_str, &endptr); > + > + if (!is_power_of_2(size)) > + goto err; > + order =3D get_order(size); > + if (BIT(order) & ~THP_ORDERS_ALL_FILE_DEFAULT) > + goto err; > + > + return order; > +err: > + pr_err("invalid size %s in thp_shmem boot parameter\n", size_str)= ; > + return -EINVAL; > +} > + > static int __init setup_transparent_hugepage_shmem(char *str) > { > int huge, ret =3D 0; > @@ -5206,6 +5228,91 @@ static int __init setup_transparent_hugepage_shmem= (char *str) > } > __setup("transparent_hugepage_shmem=3D", setup_transparent_hugepage_shme= m); > > +static char str_dup[PAGE_SIZE] __initdata; > +static int __init setup_thp_shmem(char *str) > +{ > + char *token, *range, *policy, *subtoken; > + unsigned long always, inherit, madvise, within_size; > + char *start_size, *end_size; > + int start, end, nr; > + char *p; > + > + if (!str || strlen(str) + 1 > PAGE_SIZE) > + goto err; > + strcpy(str_dup, str); > + > + always =3D huge_shmem_orders_always; > + inherit =3D huge_shmem_orders_inherit; > + madvise =3D huge_shmem_orders_madvise; > + within_size =3D huge_shmem_orders_within_size; > + p =3D str_dup; > + while ((token =3D strsep(&p, ";")) !=3D NULL) { > + range =3D strsep(&token, ":"); > + policy =3D token; > + > + if (!policy) > + goto err; > + > + while ((subtoken =3D strsep(&range, ",")) !=3D NULL) { > + if (strchr(subtoken, '-')) { > + start_size =3D strsep(&subtoken, "-"); > + end_size =3D subtoken; > + > + start =3D get_order_from_str(start_size); > + end =3D get_order_from_str(end_size); > + } else { > + start =3D end =3D get_order_from_str(subt= oken); > + } > + > + if (start < 0 || end < 0 || start > end) > + goto err; > + > + nr =3D end - start + 1; > + if (!strcmp(policy, "always")) { > + bitmap_set(&always, start, nr); > + bitmap_clear(&inherit, start, nr); > + bitmap_clear(&madvise, start, nr); > + bitmap_clear(&within_size, start, nr); > + } else if (!strcmp(policy, "advise")) { > + bitmap_set(&madvise, start, nr); > + bitmap_clear(&inherit, start, nr); > + bitmap_clear(&always, start, nr); > + bitmap_clear(&within_size, start, nr); > + } else if (!strcmp(policy, "inherit")) { > + bitmap_set(&inherit, start, nr); > + bitmap_clear(&madvise, start, nr); > + bitmap_clear(&always, start, nr); > + bitmap_clear(&within_size, start, nr); > + } else if (!strcmp(policy, "within_size")) { > + bitmap_set(&within_size, start, nr); > + bitmap_clear(&inherit, start, nr); > + bitmap_clear(&madvise, start, nr); > + bitmap_clear(&always, start, nr); > + } else if (!strcmp(policy, "never")) { > + bitmap_clear(&inherit, start, nr); > + bitmap_clear(&madvise, start, nr); > + bitmap_clear(&always, start, nr); > + bitmap_clear(&within_size, start, nr); > + } else { > + pr_err("invalid policy %s in thp_shmem bo= ot parameter\n", policy); > + goto err; > + } > + } > + } > + > + huge_shmem_orders_always =3D always; > + huge_shmem_orders_madvise =3D madvise; > + huge_shmem_orders_inherit =3D inherit; > + huge_shmem_orders_within_size =3D within_size; > + shmem_orders_configured =3D true; > + return 1; > + > +err: > + pr_warn("thp_shmem=3D%s: error parsing string, ignoring setting\n= ", str); > + return 0; > +} Can we share source code with thp_anon since there's a lot of duplication? > +__setup("thp_shmem=3D", setup_thp_shmem); > + > #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ > > #else /* !CONFIG_SHMEM */ > -- > 2.46.2 > Thanks barry