From: Jaewon Kim <jaewon31.kim@gmail.com>
To: Mike Rapoport <rppt@linux.ibm.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Jaewon Kim <jaewon31.kim@samsung.com>,
Vlastimil Babka <vbabka@suse.cz>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Joonsoo Kim <iamjoonsoo.kim@lge.com>
Subject: Re: [RFC PATCH] page_ext: create page extension for all memblock memory regions
Date: Tue, 17 May 2022 20:38:18 +0900 [thread overview]
Message-ID: <CAJrd-UuzTh-0Ee9+rMRES9onP_EkvJS-VpPP66J4M4n0Ku0ZWA@mail.gmail.com> (raw)
In-Reply-To: <YoNcBG6kQnmLZ3Z9@linux.ibm.com>
Hello Mike Rapoport
Thank you for your comment.
Oh really? Could you point out the code or the commit regarding 'all
struct pages in any section should be valid and
properly initialized' ?
Actually I am using v5.10 based source tree on an arm64 device.
I tried to look up and found the following commit in v5.16-rc1, did
you mean this?
3de360c3fdb3 arm64/mm: drop HAVE_ARCH_PFN_VALID
I guess memblock_is_memory code in pfn_valid in arch/arm64/mm/init.c, v5.10
might affect the page_ext_init.
Thank you
2022년 5월 17일 (화) 오후 5:25, Mike Rapoport <rppt@linux.ibm.com>님이 작성:
>
> On Mon, May 16, 2022 at 05:33:21PM -0700, Andrew Morton wrote:
> > On Mon, 9 May 2022 16:43:30 +0900 Jaewon Kim <jaewon31.kim@samsung.com> wrote:
> >
> > > The page extension can be prepared for each section. But if the first
> > > page is not valid, the page extension for the section was not
> > > initialized though there were many other valid pages within the section.
>
> What do you mean by "first page [in a section] is not valid"?
> In recent kernels all struct pages in any section should be valid and
> properly initialized.
>
> > > To support the page extension for all sections, refer to memblock memory
> > > regions. If the page is valid use the nid from pfn_to_nid, otherwise use
> > > the previous nid.
> > >
> > > Also this pagech changed log to include total sections and a section
> > > size.
> > >
> > > i.e.
> > > allocated 100663296 bytes of page_ext for 64 sections (1 section : 0x8000000)
> >
> > Cc Joonsoo, who wrote this code.
> > Cc Mike, for memblock.
> >
> > Thanks.
> >
> > >
> > > diff --git a/mm/page_ext.c b/mm/page_ext.c
> > > index 2e66d934d63f..506d58b36a1d 100644
> > > --- a/mm/page_ext.c
> > > +++ b/mm/page_ext.c
> > > @@ -381,41 +381,43 @@ static int __meminit page_ext_callback(struct notifier_block *self,
> > > void __init page_ext_init(void)
> > > {
> > > unsigned long pfn;
> > > - int nid;
> > > + int nid = 0;
> > > + struct memblock_region *rgn;
> > > + int nr_section = 0;
> > > + unsigned long next_section_pfn = 0;
> > >
> > > if (!invoke_need_callbacks())
> > > return;
> > >
> > > - for_each_node_state(nid, N_MEMORY) {
> > > + /*
> > > + * iterate each memblock memory region and do not skip a section having
> > > + * !pfn_valid(pfn)
> > > + */
> > > + for_each_mem_region(rgn) {
> > > unsigned long start_pfn, end_pfn;
> > >
> > > - start_pfn = node_start_pfn(nid);
> > > - end_pfn = node_end_pfn(nid);
> > > - /*
> > > - * start_pfn and end_pfn may not be aligned to SECTION and the
> > > - * page->flags of out of node pages are not initialized. So we
> > > - * scan [start_pfn, the biggest section's pfn < end_pfn) here.
> > > - */
> > > + start_pfn = (unsigned long)(rgn->base >> PAGE_SHIFT);
> > > + end_pfn = start_pfn + (unsigned long)(rgn->size >> PAGE_SHIFT);
> > > +
> > > + if (start_pfn < next_section_pfn)
> > > + start_pfn = next_section_pfn;
> > > +
> > > for (pfn = start_pfn; pfn < end_pfn;
> > > pfn = ALIGN(pfn + 1, PAGES_PER_SECTION)) {
> > >
> > > - if (!pfn_valid(pfn))
> > > - continue;
> > > - /*
> > > - * Nodes's pfns can be overlapping.
> > > - * We know some arch can have a nodes layout such as
> > > - * -------------pfn-------------->
> > > - * N0 | N1 | N2 | N0 | N1 | N2|....
> > > - */
> > > - if (pfn_to_nid(pfn) != nid)
> > > - continue;
> > > + if (pfn_valid(pfn))
> > > + nid = pfn_to_nid(pfn);
> > > + nr_section++;
> > > if (init_section_page_ext(pfn, nid))
> > > goto oom;
> > > cond_resched();
> > > }
> > > + next_section_pfn = pfn;
> > > }
> > > +
> > > hotplug_memory_notifier(page_ext_callback, 0);
> > > - pr_info("allocated %ld bytes of page_ext\n", total_usage);
> > > + pr_info("allocated %ld bytes of page_ext for %d sections (1 section : 0x%x)\n",
> > > + total_usage, nr_section, (1 << SECTION_SIZE_BITS));
> > > invoke_init_callbacks();
> > > return;
> > >
> > > --
> > > 2.17.1
> > >
>
> --
> Sincerely yours,
> Mike.
next prev parent reply other threads:[~2022-05-17 11:38 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20220509073953epcas1p127f2d36186316642068c92c5d9dee1c4@epcas1p1.samsung.com>
2022-05-09 7:43 ` Jaewon Kim
2022-05-10 0:00 ` Jaewon Kim
2022-05-17 0:01 ` Jaewon Kim
2022-05-17 0:33 ` Andrew Morton
2022-05-17 8:25 ` Mike Rapoport
2022-05-17 11:38 ` Jaewon Kim [this message]
2022-05-17 12:55 ` Mike Rapoport
2022-05-17 13:10 ` Jaewon Kim
2022-05-18 13:31 ` Mike Rapoport
2022-05-19 0:20 ` Jaewon Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAJrd-UuzTh-0Ee9+rMRES9onP_EkvJS-VpPP66J4M4n0Ku0ZWA@mail.gmail.com \
--to=jaewon31.kim@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=iamjoonsoo.kim@lge.com \
--cc=jaewon31.kim@samsung.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=rppt@linux.ibm.com \
--cc=vbabka@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox