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 EBAE9EEB59D for ; Thu, 12 Sep 2024 19:04:59 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 867306B0095; Thu, 12 Sep 2024 15:04:59 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 816996B0096; Thu, 12 Sep 2024 15:04:59 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 6DE8B6B0098; Thu, 12 Sep 2024 15:04:59 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 4D5A06B0095 for ; Thu, 12 Sep 2024 15:04:59 -0400 (EDT) Received: from smtpin26.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id B45B0402E4 for ; Thu, 12 Sep 2024 19:04:58 +0000 (UTC) X-FDA: 82557013476.26.7B7B12A Received: from mail-ej1-f45.google.com (mail-ej1-f45.google.com [209.85.218.45]) by imf28.hostedemail.com (Postfix) with ESMTP id DEEE1C0008 for ; Thu, 12 Sep 2024 19:04:56 +0000 (UTC) Authentication-Results: imf28.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=F98c1T6E; spf=pass (imf28.hostedemail.com: domain of yosryahmed@google.com designates 209.85.218.45 as permitted sender) smtp.mailfrom=yosryahmed@google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1726167791; 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=2RuL7aptEkpJ1P+T0S8igsw+xQeBsqnY1xQ/dh2HbqE=; b=Ctvg8cwdXL3KpkuRH0eoc2K9jlKMClIuoFKnTJhZ146gom2LwOVD6aVvhm2toDS1QbZX4f JiFcQWlxzlbTlMcMKmQ986RQ/idDAFkTn0Stel5ljhu+PYfy7KTrfnwUQ9BR8R22ZMA+UC 7N7q55v32Ff5kt+kD1SExMRDFsFYrsA= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1726167791; a=rsa-sha256; cv=none; b=twRzWF3F7QqUkKv0h1WDT15npvUFCFwFnRDXTNtTkV3MMnIyTiDDf2XBlA1WslsSQKXobl anFKc6JqfwP2Nnbi8hhfWfsBl9jd9Zng2Rvwe73T76dee2vdi4tJjGJhbtSL5xCyBv6bCu KJLrlvOHhj3pHoG1UAS3XN+Vjdn4V1U= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=F98c1T6E; spf=pass (imf28.hostedemail.com: domain of yosryahmed@google.com designates 209.85.218.45 as permitted sender) smtp.mailfrom=yosryahmed@google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-ej1-f45.google.com with SMTP id a640c23a62f3a-a8d64b27c45so12915066b.3 for ; Thu, 12 Sep 2024 12:04:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1726167895; x=1726772695; 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=2RuL7aptEkpJ1P+T0S8igsw+xQeBsqnY1xQ/dh2HbqE=; b=F98c1T6ESw6o3tRvul1r81WHHvlTC50zZwDveJt6+k6J8MlVVYy+6OrzpOa9yaCVx+ 2TXsf3SIfcbpuQyi4p+eoloc05bJ9qk95+7lZo1wZSSzYs7fS3tOy6i43a4+7/zz3m3i WTEB5/5ipQizh2QqNh5ltMPTYrCqCqd8LX262XZKf1u8YBCwdghTsAbz23RjR8CAf1Qe umqBTyTrkQ80W1hnkXIDCUtSilQ+5vaYulLngsBDZCHi30ACvjl3oppKYoMpd9tcjNfw WgZSFX/Imx17SvmMeVEogeCDNu3KI9jXd2aVRXJStekDE1tAHZ9qJzKHzY91IFJDv/Ng 7hwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1726167895; x=1726772695; 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=2RuL7aptEkpJ1P+T0S8igsw+xQeBsqnY1xQ/dh2HbqE=; b=QKgrqJiqJJWYL+C+xEnIu83UhG8vCn8eRbsamtw6OEeGai1tC8pAS8Sj0rR8+ykYvc tgDIwbVGichfUSXgLyN7nqMSjhzMQxXPOj3taunCPJRGftHwntc95uEJZxH1ryHvNoKs yC483W1fsPr8OEBeN1U+CGm/n+DMWKUqViCni96kNvxW/wPp8VlA6qoguuPGLoMmdgu0 TALpfL10sBdLgUkgYeV0XdIH5N7mFy5FUGZaimV4z9TwcebwZH0xZnyYgMpkdFByJExW uxaGKFS56Nlk8UKV/8A1Li3WNzmGhozkK7ab7tnSI0VgW+l/FfDkiamyCS15g0D46BHg 6YAg== X-Gm-Message-State: AOJu0YwulUzpFEtOBKJdJb++dd3yzsQpp6fk+YquJbXyAIujNCwsLxsu +R5G+2qgHliYunTypHb3gGDzPLu027GDdYtdPwM42B535V1GKwt+DHzJcdu7U9oTSF9zIieBp3v qYjhhe5mR+MwK8GNjf5OQvhiinqmAmfY0t8um X-Google-Smtp-Source: AGHT+IHtBi+gw94AVzowFRn9NtkqoOlP01pSbyWEVf7Slb/Ci/GnfJ3nbAex/xNSWwjSDQrFZ89qgZcUoKXYD/w4y2Q= X-Received: by 2002:a17:907:6e88:b0:a8a:8915:6bf7 with SMTP id a640c23a62f3a-a90481060b7mr6223166b.51.1726167894678; Thu, 12 Sep 2024 12:04:54 -0700 (PDT) MIME-Version: 1.0 References: <20240912185602.2342148-1-willy@infradead.org> In-Reply-To: <20240912185602.2342148-1-willy@infradead.org> From: Yosry Ahmed Date: Thu, 12 Sep 2024 12:04:18 -0700 Message-ID: Subject: Re: [PATCH] bootmem: Stop using page->index To: "Matthew Wilcox (Oracle)" Cc: linux-mm@kvack.org, x86@kernel.org, Mike Rapoport Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Stat-Signature: 4gy16ikowf6nfbgpwmo19nbdfr7sawws X-Rspamd-Queue-Id: DEEE1C0008 X-Rspam-User: X-Rspamd-Server: rspam08 X-HE-Tag: 1726167896-339624 X-HE-Meta: U2FsdGVkX18iVD/0Pyjz0Ecdk8Xut2EaaS63yvSTCIoO0PV+LpE5bpg5DxB5hvCJRSiHvO3hX2QAN4lvltDzKLQ7sc4ixvTMiI8tsFi1zqxVU4DQKxGPJE+9DdWmks+0uVd9HfP7Ke7oFxGUSpMkxcYWv6uFWyPE6+ZZSSQkAhiKcmQ7okBXt5y2zJABpFXyPwwzY5XBqwENEApX2bY/RAyozSzJZT0bLXUXCgb1zoWeYhjMY0I69OYUHtSf2+ef2xu/4u+lVZ+LGBl5R7kyTAj7nfkKR3PLtM5Bgc9UeG0Qk5nHTMb7BWn/SwLoHkmQgtXv2SVX0VNwyFXJ5EgC+rG8gBRRAshPKqJWI5FmWxDZ7dB+APnmKRMS8VIiVkFrack1KlYMwQVds1tiSVjP4SWQYVbSfT5btS6o+vs9OlhTfxKACbkFTSURBvPOTb30QvgghoYtjlo/f/Zu54DseI8hW737R8knaC8QkhFMyCxDx/qutPeaN7jqAp8Lu5mlhYhmz+Vn9YUFSFMgCo1WMTeJtZ8hszVaYJpxcrsMPdUgMya4LOwIURsYvEVL+3NtTRawY+1ouamYFSOCFG+eyFlk3GMttnS9cOxWrkhYgdrA+aLpdAtDqfJGJfyTggUkgA6t85S3kJr+Ez1k8dB74icqIQNu16QhCPLi5eTZ5PMkxRZzjYE0CCSZ3ks+BGAfdEB1TOASgULD6AVj+42AfupBJ5WDxukQj3lSHACSlDk3J8pAi3g+O+TOfEgicoOUYQm+oAdGsZc3PI1sLecZnyQzn3NORqK0CI4V40ZXROVDPV/2OK880nR7GpQRK2d3jcYnXjPX6D0bbygCvP/9G4YFga3LqAYkVWXfTGENyipFAx17YHLHJFR+eZxI5PkdWGxu1ofgDQD2b7kEoznBi1Xr9GfK62OOjyo5bbRQw0BEKduMELq7w7sITuRfx9iSkg5ikpvTM+GmxRI3Uij NSZt9cMD mohoggvLKJXlMcX9+nHlvur1joUiTj//27Vz0l4aIut9CBfxNtJD/Gr4pr8sCLXpDieG0rbKN/4giMrcIzPutDgZFaGPzbmAoOq4K2wNHeZdII7bKC0DK1eVnvotwym4UDlQUAI352fqVCXm6o6r8SlF5TdvECWJTGu8HLTlIOGJAodiS3oYUqsM1R9H6/zz3VFYSmbfL/XFcX5FupZNoA8BCrB0s3p7/mBHi7BVpKhg+mEzNv0qfRogp5AuTzwYJkymB 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 Thu, Sep 12, 2024 at 11:56=E2=80=AFAM Matthew Wilcox (Oracle) wrote: > > Encode the type into the bottom four bits of page->private and the > info into the remaining bits. Also turn the bootmem type into a > named enum. > > Signed-off-by: Matthew Wilcox (Oracle) > --- > arch/x86/mm/init_64.c | 9 ++++----- > include/linux/bootmem_info.h | 25 +++++++++++++++++-------- > mm/bootmem_info.c | 11 ++++++----- > mm/sparse.c | 8 ++++---- > 4 files changed, 31 insertions(+), 22 deletions(-) > > diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c > index ff253648706f..4d5fde324136 100644 > --- a/arch/x86/mm/init_64.c > +++ b/arch/x86/mm/init_64.c > @@ -987,13 +987,12 @@ int arch_add_memory(int nid, u64 start, u64 size, > > static void __meminit free_pagetable(struct page *page, int order) > { > - unsigned long magic; > - unsigned int nr_pages =3D 1 << order; > - > /* bootmem page has reserved flag */ > if (PageReserved(page)) { > - magic =3D page->index; > - if (magic =3D=3D SECTION_INFO || magic =3D=3D MIX_SECTION= _INFO) { > + enum bootmem_type type =3D bootmem_type(page); > + unsigned long nr_pages =3D 1 << order; > + > + if (type =3D=3D SECTION_INFO || type =3D=3D MIX_SECTION_I= NFO) { > while (nr_pages--) > put_page_bootmem(page++); > } else > diff --git a/include/linux/bootmem_info.h b/include/linux/bootmem_info.h > index cffa38a73618..e2fe5de93dcc 100644 > --- a/include/linux/bootmem_info.h > +++ b/include/linux/bootmem_info.h > @@ -6,11 +6,10 @@ > #include > > /* > - * Types for free bootmem stored in page->lru.next. These have to be in > - * some random range in unsigned long space for debugging purposes. > + * Types for free bootmem stored in the low bits of page->private. > */ > -enum { > - MEMORY_HOTPLUG_MIN_BOOTMEM_TYPE =3D 12, > +enum bootmem_type { > + MEMORY_HOTPLUG_MIN_BOOTMEM_TYPE =3D 1, > SECTION_INFO =3D MEMORY_HOTPLUG_MIN_BOOTMEM_TYPE, > MIX_SECTION_INFO, > NODE_INFO, > @@ -21,9 +20,19 @@ enum { > void __init register_page_bootmem_info_node(struct pglist_data *pgdat); > > void get_page_bootmem(unsigned long info, struct page *page, > - unsigned long type); > + enum bootmem_type type); > void put_page_bootmem(struct page *page); > > +static inline enum bootmem_type bootmem_type(const struct page *page) > +{ > + return (unsigned long)page->private & 0xf; > +} > + > +static inline unsigned long bootmem_info(const struct page *page) > +{ > + return (unsigned long)page->private >> 4; > +} Would it be better to define the number of bits used for the type as a macro and use it throughout (bootmem_type(), bootmem_info(), get_page_bootmem())?. We can also add a static assertion or build bug in case 4 bits is not enough anymore (e.g. if someone changes the enum values). > + > /* > * Any memory allocated via the memblock allocator and not via the > * buddy will be marked reserved already in the memmap. For those > @@ -31,7 +40,7 @@ void put_page_bootmem(struct page *page); > */ > static inline void free_bootmem_page(struct page *page) > { > - unsigned long magic =3D page->index; > + enum bootmem_type type =3D bootmem_type(page); > > /* > * The reserve_bootmem_region sets the reserved flag on bootmem > @@ -39,7 +48,7 @@ static inline void free_bootmem_page(struct page *page) > */ > VM_BUG_ON_PAGE(page_ref_count(page) !=3D 2, page); > > - if (magic =3D=3D SECTION_INFO || magic =3D=3D MIX_SECTION_INFO) > + if (type =3D=3D SECTION_INFO || type =3D=3D MIX_SECTION_INFO) > put_page_bootmem(page); > else > VM_BUG_ON_PAGE(1, page); > @@ -54,7 +63,7 @@ static inline void put_page_bootmem(struct page *page) > } > > static inline void get_page_bootmem(unsigned long info, struct page *pag= e, > - unsigned long type) > + enum bootmem_type type) > { > } > > diff --git a/mm/bootmem_info.c b/mm/bootmem_info.c > index fa7cb0c87c03..95f288169a38 100644 > --- a/mm/bootmem_info.c > +++ b/mm/bootmem_info.c > @@ -14,23 +14,24 @@ > #include > #include > > -void get_page_bootmem(unsigned long info, struct page *page, unsigned lo= ng type) > +void get_page_bootmem(unsigned long info, struct page *page, > + enum bootmem_type type) > { > - page->index =3D type; > + BUG_ON(type > 0xf); > + BUG_ON(info > (ULONG_MAX >> 4)); > SetPagePrivate(page); > - set_page_private(page, info); > + set_page_private(page, info << 4 | type); > page_ref_inc(page); > } > > void put_page_bootmem(struct page *page) > { > - unsigned long type =3D page->index; > + enum bootmem_type type =3D bootmem_type(page); > > BUG_ON(type < MEMORY_HOTPLUG_MIN_BOOTMEM_TYPE || > type > MEMORY_HOTPLUG_MAX_BOOTMEM_TYPE); > > if (page_ref_dec_return(page) =3D=3D 1) { > - page->index =3D 0; > ClearPagePrivate(page); > set_page_private(page, 0); > INIT_LIST_HEAD(&page->lru); > diff --git a/mm/sparse.c b/mm/sparse.c > index dc38539f8560..6ba5354cf2e1 100644 > --- a/mm/sparse.c > +++ b/mm/sparse.c > @@ -720,19 +720,19 @@ static void depopulate_section_memmap(unsigned long= pfn, unsigned long nr_pages, > static void free_map_bootmem(struct page *memmap) > { > unsigned long maps_section_nr, removing_section_nr, i; > - unsigned long magic, nr_pages; > + unsigned long type, nr_pages; > struct page *page =3D virt_to_page(memmap); > > nr_pages =3D PAGE_ALIGN(PAGES_PER_SECTION * sizeof(struct page)) > >> PAGE_SHIFT; > > for (i =3D 0; i < nr_pages; i++, page++) { > - magic =3D page->index; > + type =3D bootmem_type(page); > > - BUG_ON(magic =3D=3D NODE_INFO); > + BUG_ON(type =3D=3D NODE_INFO); > > maps_section_nr =3D pfn_to_section_nr(page_to_pfn(page)); > - removing_section_nr =3D page_private(page); > + removing_section_nr =3D bootmem_info(page); > > /* > * When this function is called, the removing section is > -- > 2.43.0 > >