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 1F9A7D5B854 for ; Tue, 29 Oct 2024 01:07:48 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 462086B00B9; Mon, 28 Oct 2024 21:07:48 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 410BC6B00BA; Mon, 28 Oct 2024 21:07:48 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2B2806B00BB; Mon, 28 Oct 2024 21:07:48 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 0C4FA6B00B9 for ; Mon, 28 Oct 2024 21:07:48 -0400 (EDT) Received: from smtpin18.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id AF10C4091D for ; Tue, 29 Oct 2024 01:07:47 +0000 (UTC) X-FDA: 82724852112.18.5AE197A Received: from mail-vs1-f42.google.com (mail-vs1-f42.google.com [209.85.217.42]) by imf06.hostedemail.com (Postfix) with ESMTP id D183318001A for ; Tue, 29 Oct 2024 01:07:28 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b="Aw9ee/sh"; spf=pass (imf06.hostedemail.com: domain of 21cnbao@gmail.com designates 209.85.217.42 as permitted sender) smtp.mailfrom=21cnbao@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1730163906; 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=IG0PFS2Vufi1owynRS2sTlDlYx2r2czk9VLiILWiX+U=; b=dBaOOjvXlxQJkDbl21/k6eanZNZQbHjcacUr2Hx0Vw8GxxQfc6QNIPhbjKTJa4vMBBg+V2 bXps7xPFxacxmDlCZd4FH3UZJNowA684MmLqvzXBeuAw/xfaAqNHZI60qEHtoZhh0YnmdR CgcTilYa8SvMWDqvumFSOYpMGDvNrVQ= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1730163906; a=rsa-sha256; cv=none; b=lOdJ0t3B6AObs0ex42GSYKmkU8Kn9GYvTYNDLD3P33Fzp7nN/D9/24nKB+XZrGGGCt+yqL HIdiRPqKgtdhKr9X27utJXlfp12JXTfT+6hHHJhxUGlR6k1uNuAHT7u4q1/AZN5iFGRhY0 AEHMR051mpzzX5pbaoOYtoS2ccnabX8= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b="Aw9ee/sh"; spf=pass (imf06.hostedemail.com: domain of 21cnbao@gmail.com designates 209.85.217.42 as permitted sender) smtp.mailfrom=21cnbao@gmail.com; dmarc=pass (policy=none) header.from=gmail.com Received: by mail-vs1-f42.google.com with SMTP id ada2fe7eead31-4a47f8a9168so1628669137.0 for ; Mon, 28 Oct 2024 18:07:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1730164065; x=1730768865; 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=IG0PFS2Vufi1owynRS2sTlDlYx2r2czk9VLiILWiX+U=; b=Aw9ee/shhJQc0srT8gl1g0m42H0YDOJJK4Q5MTv94tz0+Md1JK0zpAoFoet1GjRTy1 1IRbtA6zOAcPHmSymJ23a9PuKsxt4cPo31bv8/E9BfGGIGYsIlRags9nG/KwWckMcrDu mr1E/qeRRe58h3PkpiiDIfTmfm0eOVIxRJci410vIQaL9M3X+W/NpoOJXJCKpRvN4y/R 8n9+mTQlx9/y0x2J1Pl73W7qZAPxVumjYRJHWmBZYOd+O4+aMJjuRyqYOcQdR8tqTvKY IGSxdNgbSrOVJWR1lydW6RL+F2gUKhL0DQu3kIkQ+NjbP3otcj2TxTxvpwZNGShATrPO InWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1730164065; x=1730768865; 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=IG0PFS2Vufi1owynRS2sTlDlYx2r2czk9VLiILWiX+U=; b=amDtoWnpzjolEDSspXlHWUoL7UZx9VRzCNEQjezTuiOesJSXN2rDaWlUVP2X9jh6EJ Q/yi8qAleujzIgemJ7CT+O8GFLaDHIdqI0EbJFawwbVbFApmnnAYMqsX+mocpV8+ptg2 pym9VhZQpc/ZPETR/KoxXKmgQ+sPAkTOqWHsbAbf24ItfW3oE1LNhsssfFggOJXwGTsB /7zl7UK1nPHcejLBv+dh/xeweXU5wnF+HlWqtweF5Fj41bFZ9Rry2Azg3fqh7i6po14m Q30r/xFna0fWVMFZSX6i/5uAhEctSpHWRmc+sirlqaekmt6ZEfU/+HMnSp1y3uvWNhcm HBmQ== X-Forwarded-Encrypted: i=1; AJvYcCX8Ilw+p5c9BqCi4wqiFCPKFhi+pvurnT15AKCoNRtgwSvAPDRjYb0N93QeFtxdBp3d3XIqNw3jLQ==@kvack.org X-Gm-Message-State: AOJu0YwCJZ2AHCSYa16rW7xXMA/Nb5TJhEZ9O58B9ejUoFhIusnxoisL AfXISMAZNAE1+6FIiF4E5SZRbHkEkEjeXp6gq7F34ns82WV1NSB7qQG5re0qsk11yb1kYfxdpHX PKnwadcji0/IdnkVqvAmaE7cLvso= X-Google-Smtp-Source: AGHT+IFAQyuOiDaDWHTzQfoOvYmjnp4EXydCzQUk8uROlSAjxsOCXitgU6klSjw7VOVl8iKqy8ni8sOO5mYp738xB4Q= X-Received: by 2002:a05:6102:4192:b0:4a7:487d:88e4 with SMTP id ada2fe7eead31-4a8cfb443d7mr9031420137.4.1730164064894; Mon, 28 Oct 2024 18:07:44 -0700 (PDT) MIME-Version: 1.0 References: <20241029002324.1062723-1-mcanal@igalia.com> <20241029002324.1062723-4-mcanal@igalia.com> In-Reply-To: <20241029002324.1062723-4-mcanal@igalia.com> From: Barry Song <21cnbao@gmail.com> Date: Tue, 29 Oct 2024 09:07:34 +0800 Message-ID: Subject: Re: [PATCH v2 3/4] mm: generalize the implementation of ``thp_anon=`` 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-Stat-Signature: o75j7dux9wrt5rp39e3n8mon7ttdigch X-Rspamd-Queue-Id: D183318001A X-Rspam-User: X-Rspamd-Server: rspam08 X-HE-Tag: 1730164048-578479 X-HE-Meta: U2FsdGVkX18S0kDuS/YuDU53OUAvszkfvTiDv8t2dNRWMT9TeEvY6iyU9u1+fH7PQPRQRIRssx9jQAtxVghJQ6UL1WoAd0iGECdXyrGUW4Q7yECVb+I5yy7PIP15ifbbHVDpXc6Q5gQ1uZZQvdpwuTIv2z78c80gxsfD2SzxGpK6666FLMDiTbAPyNpJFeQonnGOo481Azb0IuHyxiReyBUYHuRaGZlSzwqcVpYcUM+1yXKSd0F3zBc9ANZEy65UM/YOsITxn2LDSuMSVxjTPQGTkk+d3W2cyamcZyHEwHsdVqVCeRkhrcD++mQfNS0CkeOA6+PAyeqc3MGVaTm9LcDEbmf9xj1r7O375Bil9EScjWHyNlQEk6ztKfK0n3u9dt950YSPn+Jd1DyN0ry2gO5JFo+SiEwUwnB0MsXPnkBpk2ZtO1NsrZmVuOvPy+1I+XAT46jep0UxNdColJ95rKR4FDTkv/vAQnjLsnXIcL10/leuNs/1siato6yw9wUZp3X1V6zUzrw28rdEoxH9luhPY18Mkw+HFI/AmxokQuKTrxy90ufWXYG72B+d8vlJj7pCP87/I5zP2vumvPDzLHpH7NdnfESjjaQo7nSQdx67Fp+V1ixgnYVn6m8R6bQZubOf9YiMYo2a/GGLdf0uQ0Ia2w7YW9vrjzFUNrk8+dRbZl6hW5zb1A0a1c0zQlIQg9PUDy61o/4JGHwdh7kQ/Q7UEGTemW6LainNQImABwDOfsYb5ZWJH5npgpDd4btRC7VqxwR/ti7DfeZ7oT6nWTK3qhqyC8UQlMm/QqWzqdMwQlIR6mHRsUqifqb4L+AGfLjno6P5YvCXzSwYRVBYfhIwOGAjIGn81NkWE9PfPFgI4hCl1Yhio9bOlIPC6uUJuec6gc/MQKYiGUpVtqjJWsXisK6NNICvQNvsBaYguykyoarUk5/2ZlPQrAnDKeFb8i0jHtr8VbI1/HxK45S VYOjQzNK Je7Jye20S/outS1aogoCMkfExPQO2uBMJy9J/e42s0Th9SF8HQA9VuKVyr++QxZUtGzLybTy1CwVpxSZ0h1jcDwmEUvdLmk2xS8Jd1iLY9Q2VsQXa5YPypGkuitwDmhsnpjWCh01n4+Nz71TDig9GtH1CdbaxsnTqxktGbvCxnhmBa3oI4QKt2Avkot5/V+b8QVsQrZ+oZAlkcKINQHVKFNynQ8Lqcxo0H9D2kJesRhaUQch/ZUSdaWg7LmRJq4Z6Ek8Kjluf91GNTEPrI/c7Q4PrNeaX+tWqOQ8lqOOrtwy9qIDE8tazg8Iq1DVc+Aav5mi2XAPU9IZXI4s5ZROemHwRCbFakz9+kku+sMQVZyMJGYTrxWS7HA7mm4JX/g7vlDt3aBETNi5vU4gZa8vuQHLmPlWtkIYdN1Bww7r3eFMkn8M= 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 Tue, Oct 29, 2024 at 8:24=E2=80=AFAM Ma=C3=ADra Canal wrote: > > Currently, the function ``setup_thp_anon()`` is extremely tied to the > policies and bitmaps that currently exist for anon THP. This means that > we can't reuse the function if we implement a ``thp_shmem=3D``. > > This commit extracts the behavior of the function to a new generic > function. The new function is exposed in common headers for future use > by mm/shmem.c. > > Signed-off-by: Ma=C3=ADra Canal Sorry, Ma=C3=ADra, my mistake. I don't see much value in making get_order_from_str() a common API since bootcmd such a small thing. I'd prefer to stick with your previous code with just a rename=E2=80=94unless, at some point, we move both shmem and anon co= ntrols into mm/huge_memory.c. > --- > include/linux/huge_mm.h | 29 +++++++++++ > mm/huge_memory.c | 109 ++++++++++++++++++---------------------- > 2 files changed, 78 insertions(+), 60 deletions(-) > > diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h > index b94c2e8ee918..b82e9379f2bf 100644 > --- a/include/linux/huge_mm.h > +++ b/include/linux/huge_mm.h > @@ -471,6 +471,35 @@ void split_huge_pmd_locked(struct vm_area_struct *vm= a, unsigned long address, > bool unmap_huge_pmd_locked(struct vm_area_struct *vma, unsigned long add= r, > pmd_t *pmdp, struct folio *folio); > > +static inline int get_order_from_str(const char *size_str, > + const unsigned long thp_orders) > +{ > + 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) > + goto err; > + > + return order; > +err: > + pr_err("invalid size %s in boot parameter\n", size_str); > + return -EINVAL; > +} > + > +struct thp_policy_bitmap { > + const char *policy; > + unsigned long bitmap; > +}; > + > +int parse_huge_orders(char *p, struct thp_policy_bitmap *policies, > + const int num_policies, const unsigned long thp_ord= ers); > #else /* CONFIG_TRANSPARENT_HUGEPAGE */ > > static inline bool folio_test_pmd_mappable(struct folio *folio) > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index 832ca761b4c3..c61f4481cb6a 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -958,91 +958,80 @@ static int __init setup_transparent_hugepage(char *= str) > } > __setup("transparent_hugepage=3D", setup_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_ANON) > - goto err; > - > - return order; > -err: > - pr_err("invalid size %s in thp_anon boot parameter\n", size_str); > - return -EINVAL; > -} > - > -static char str_dup[PAGE_SIZE] __initdata; > -static int __init setup_thp_anon(char *str) > +int parse_huge_orders(char *p, struct thp_policy_bitmap *policies, > + const int num_policies, const unsigned long thp_ord= ers) > { > char *token, *range, *policy, *subtoken; > - unsigned long always, inherit, madvise; > char *start_size, *end_size; > - int start, end, nr; > - char *p; > + int start, end, nr, i; > + bool policy_set; > > - if (!str || strlen(str) + 1 > PAGE_SIZE) > - goto err; > - strcpy(str_dup, str); > - > - always =3D huge_anon_orders_always; > - madvise =3D huge_anon_orders_madvise; > - inherit =3D huge_anon_orders_inherit; > - p =3D str_dup; > while ((token =3D strsep(&p, ";")) !=3D NULL) { > range =3D strsep(&token, ":"); > policy =3D token; > > if (!policy) > - goto err; > + return 0; > > while ((subtoken =3D strsep(&range, ",")) !=3D NULL) { > + policy_set =3D false; > + > 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); > + start =3D get_order_from_str(start_size, = thp_orders); > + end =3D get_order_from_str(end_size, thp_= orders); > } else { > - start =3D end =3D get_order_from_str(subt= oken); > + start =3D end =3D get_order_from_str(subt= oken, thp_orders); > } > > if (start < 0 || end < 0 || start > end) > - goto err; > + return 0; > > nr =3D end - start + 1; > - if (!strcmp(policy, "always")) { > - bitmap_set(&always, start, nr); > - bitmap_clear(&inherit, start, nr); > - bitmap_clear(&madvise, start, nr); > - } else if (!strcmp(policy, "madvise")) { > - bitmap_set(&madvise, start, nr); > - bitmap_clear(&inherit, start, nr); > - bitmap_clear(&always, start, nr); > - } else if (!strcmp(policy, "inherit")) { > - bitmap_set(&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); > - } else { > - pr_err("invalid policy %s in thp_anon boo= t parameter\n", policy); > - goto err; > + > + for (i =3D 0; i < num_policies; i++) { > + if (!strcmp(policy, policies[i].policy)) = { > + bitmap_set(&policies[i].bitmap, s= tart, nr); > + policy_set =3D true; > + } else > + bitmap_clear(&policies[i].bitmap,= start, nr); > + } > + > + if (!policy_set && strcmp(policy, "never")) { > + pr_err("invalid policy %s in boot paramet= er\n", policy); > + return 0; > } > } > } > > - huge_anon_orders_always =3D always; > - huge_anon_orders_madvise =3D madvise; > - huge_anon_orders_inherit =3D inherit; > + return 1; > +} > + > +static char str_dup[PAGE_SIZE] __initdata; > +static int __init setup_thp_anon(char *str) > +{ > + struct thp_policy_bitmap policies[] =3D { > + { "always", huge_anon_orders_always }, > + { "madvise", huge_anon_orders_madvise }, > + { "inherit", huge_anon_orders_inherit }, > + }; > + char *p; > + > + if (!str || strlen(str) + 1 > PAGE_SIZE) > + goto err; > + > + strscpy(str_dup, str); > + p =3D str_dup; > + > + if (!parse_huge_orders(p, policies, ARRAY_SIZE(policies), > + THP_ORDERS_ALL_ANON)) > + goto err; > + > + huge_anon_orders_always =3D policies[0].bitmap; > + huge_anon_orders_madvise =3D policies[1].bitmap; > + huge_anon_orders_inherit =3D policies[2].bitmap; > anon_orders_configured =3D true; > return 1; > > -- > 2.46.2 > Thanks Barry