From: Pavel Tatashin <pasha.tatashin@soleen.com> To: Alexander Duyck <alexander.h.duyck@linux.intel.com> Cc: akpm@linux-foundation.org, linux-mm@kvack.org, sparclinux@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org, davem@davemloft.net, pavel.tatashin@microsoft.com, mhocko@suse.com, mingo@kernel.org, kirill.shutemov@linux.intel.com, dan.j.williams@intel.com, dave.jiang@intel.com, rppt@linux.vnet.ibm.com, willy@infradead.org, vbabka@suse.cz, khalid.aziz@oracle.com, ldufour@linux.vnet.ibm.com, mgorman@techsingularity.net, yi.z.zhang@linux.intel.com Subject: Re: [mm PATCH v5 3/7] mm: Implement new zone specific memblock iterator Date: Fri, 9 Nov 2018 18:26:54 -0500 [thread overview] Message-ID: <20181109232654.bi37bdkrqbogbdcx@xakep.localdomain> (raw) In-Reply-To: <154145278071.30046.9022571960145979137.stgit@ahduyck-desk1.jf.intel.com> > +/** > + * for_each_free_mem_range_in_zone - iterate through zone specific free > + * memblock areas > + * @i: u64 used as loop variable > + * @zone: zone in which all of the memory blocks reside > + * @p_start: ptr to phys_addr_t for start address of the range, can be %NULL > + * @p_end: ptr to phys_addr_t for end address of the range, can be %NULL > + * > + * Walks over free (memory && !reserved) areas of memblock in a specific > + * zone. Available as soon as memblock is initialized. > + */ > +#define for_each_free_mem_pfn_range_in_zone(i, zone, p_start, p_end) \ > + for (i = 0, \ > + __next_mem_pfn_range_in_zone(&i, zone, p_start, p_end); \ > + i != (u64)ULLONG_MAX; \ > + __next_mem_pfn_range_in_zone(&i, zone, p_start, p_end)) > +#endif /* CONFIG_DEFERRED_STRUCT_PAGE_INIT */ Use U64_MAX instead of ULLONG_MAX, and avoid u64 cast. I know other places in this file use UULONG_MAX with cast, but I think U64_MAX is better. > + > /** > * for_each_free_mem_range - iterate through free memblock areas > * @i: u64 used as loop variable > diff --git a/mm/memblock.c b/mm/memblock.c > index 7df468c8ebc8..f1d1fbfd1ae7 100644 > --- a/mm/memblock.c > +++ b/mm/memblock.c > @@ -1239,6 +1239,69 @@ int __init_memblock memblock_set_node(phys_addr_t base, phys_addr_t size, > return 0; > } > #endif /* CONFIG_HAVE_MEMBLOCK_NODE_MAP */ > +#ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT > +/** > + * __next_mem_pfn_range_in_zone - iterator for for_each_*_range_in_zone() > + * > + * @idx: pointer to u64 loop variable > + * @zone: zone in which all of the memory blocks reside > + * @out_start: ptr to ulong for start pfn of the range, can be %NULL > + * @out_end: ptr to ulong for end pfn of the range, can be %NULL > + * > + * This function is meant to be a zone/pfn specific wrapper for the > + * for_each_mem_range type iterators. Specifically they are used in the > + * deferred memory init routines and as such we were duplicating much of > + * this logic throughout the code. So instead of having it in multiple > + * locations it seemed like it would make more sense to centralize this to > + * one new iterator that does everything they need. > + */ > +void __init_memblock > +__next_mem_pfn_range_in_zone(u64 *idx, struct zone *zone, > + unsigned long *out_spfn, unsigned long *out_epfn) > +{ > + int zone_nid = zone_to_nid(zone); > + phys_addr_t spa, epa; > + int nid; > + > + __next_mem_range(idx, zone_nid, MEMBLOCK_NONE, > + &memblock.memory, &memblock.reserved, > + &spa, &epa, &nid); > + > + while (*idx != ULLONG_MAX) { Ditto, use U64_MAX > + unsigned long epfn = PFN_DOWN(epa); > + unsigned long spfn = PFN_UP(spa); > + > + /* > + * Verify the end is at least past the start of the zone and > + * that we have at least one PFN to initialize. > + */ > + if (zone->zone_start_pfn < epfn && spfn < epfn) { > + /* if we went too far just stop searching */ > + if (zone_end_pfn(zone) <= spfn) > + break; Set *idx = U64_MAX here, then break. This way after we are outside this while loop idx is always equals to U64_MAX. > + > + if (out_spfn) > + *out_spfn = max(zone->zone_start_pfn, spfn); > + if (out_epfn) > + *out_epfn = min(zone_end_pfn(zone), epfn); Don't we need to verify after adjustment that out_spfn != out_epfn, so there is at least one PFN to initialize? The rest looks good. Once the above is fixed: Reviewed-by: Pavel Tatashin <pasha.tatashin@soleen.com> Thank you, Pasha
WARNING: multiple messages have this Message-ID (diff)
From: Pavel Tatashin <pasha.tatashin@soleen.com> To: Alexander Duyck <alexander.h.duyck@linux.intel.com> Cc: akpm@linux-foundation.org, linux-mm@kvack.org, sparclinux@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org, davem@davemloft.net, pavel.tatashin@microsoft.com, mhocko@suse.com, mingo@kernel.org, kirill.shutemov@linux.intel.com, dan.j.williams@intel.com, dave.jiang@intel.com, rppt@linux.vnet.ibm.com, willy@infradead.org, vbabka@suse.cz, khalid.aziz@oracle.com, ldufour@linux.vnet.ibm.com, mgorman@techsingularity.net, yi.z.zhang@linux.intel.com Subject: Re: [mm PATCH v5 3/7] mm: Implement new zone specific memblock iterator Date: Fri, 09 Nov 2018 23:26:54 +0000 [thread overview] Message-ID: <20181109232654.bi37bdkrqbogbdcx@xakep.localdomain> (raw) In-Reply-To: <154145278071.30046.9022571960145979137.stgit@ahduyck-desk1.jf.intel.com> > +/** > + * for_each_free_mem_range_in_zone - iterate through zone specific free > + * memblock areas > + * @i: u64 used as loop variable > + * @zone: zone in which all of the memory blocks reside > + * @p_start: ptr to phys_addr_t for start address of the range, can be %NULL > + * @p_end: ptr to phys_addr_t for end address of the range, can be %NULL > + * > + * Walks over free (memory && !reserved) areas of memblock in a specific > + * zone. Available as soon as memblock is initialized. > + */ > +#define for_each_free_mem_pfn_range_in_zone(i, zone, p_start, p_end) \ > + for (i = 0, \ > + __next_mem_pfn_range_in_zone(&i, zone, p_start, p_end); \ > + i != (u64)ULLONG_MAX; \ > + __next_mem_pfn_range_in_zone(&i, zone, p_start, p_end)) > +#endif /* CONFIG_DEFERRED_STRUCT_PAGE_INIT */ Use U64_MAX instead of ULLONG_MAX, and avoid u64 cast. I know other places in this file use UULONG_MAX with cast, but I think U64_MAX is better. > + > /** > * for_each_free_mem_range - iterate through free memblock areas > * @i: u64 used as loop variable > diff --git a/mm/memblock.c b/mm/memblock.c > index 7df468c8ebc8..f1d1fbfd1ae7 100644 > --- a/mm/memblock.c > +++ b/mm/memblock.c > @@ -1239,6 +1239,69 @@ int __init_memblock memblock_set_node(phys_addr_t base, phys_addr_t size, > return 0; > } > #endif /* CONFIG_HAVE_MEMBLOCK_NODE_MAP */ > +#ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT > +/** > + * __next_mem_pfn_range_in_zone - iterator for for_each_*_range_in_zone() > + * > + * @idx: pointer to u64 loop variable > + * @zone: zone in which all of the memory blocks reside > + * @out_start: ptr to ulong for start pfn of the range, can be %NULL > + * @out_end: ptr to ulong for end pfn of the range, can be %NULL > + * > + * This function is meant to be a zone/pfn specific wrapper for the > + * for_each_mem_range type iterators. Specifically they are used in the > + * deferred memory init routines and as such we were duplicating much of > + * this logic throughout the code. So instead of having it in multiple > + * locations it seemed like it would make more sense to centralize this to > + * one new iterator that does everything they need. > + */ > +void __init_memblock > +__next_mem_pfn_range_in_zone(u64 *idx, struct zone *zone, > + unsigned long *out_spfn, unsigned long *out_epfn) > +{ > + int zone_nid = zone_to_nid(zone); > + phys_addr_t spa, epa; > + int nid; > + > + __next_mem_range(idx, zone_nid, MEMBLOCK_NONE, > + &memblock.memory, &memblock.reserved, > + &spa, &epa, &nid); > + > + while (*idx != ULLONG_MAX) { Ditto, use U64_MAX > + unsigned long epfn = PFN_DOWN(epa); > + unsigned long spfn = PFN_UP(spa); > + > + /* > + * Verify the end is at least past the start of the zone and > + * that we have at least one PFN to initialize. > + */ > + if (zone->zone_start_pfn < epfn && spfn < epfn) { > + /* if we went too far just stop searching */ > + if (zone_end_pfn(zone) <= spfn) > + break; Set *idx = U64_MAX here, then break. This way after we are outside this while loop idx is always equals to U64_MAX. > + > + if (out_spfn) > + *out_spfn = max(zone->zone_start_pfn, spfn); > + if (out_epfn) > + *out_epfn = min(zone_end_pfn(zone), epfn); Don't we need to verify after adjustment that out_spfn != out_epfn, so there is at least one PFN to initialize? The rest looks good. Once the above is fixed: Reviewed-by: Pavel Tatashin <pasha.tatashin@soleen.com> Thank you, Pasha
next prev parent reply other threads:[~2018-11-09 23:26 UTC|newest] Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-11-05 21:19 [mm PATCH v5 0/7] Deferred page init improvements Alexander Duyck 2018-11-05 21:19 ` Alexander Duyck 2018-11-05 21:19 ` Alexander Duyck 2018-11-05 21:19 ` Alexander Duyck 2018-11-05 21:19 ` [mm PATCH v5 1/7] mm: Use mm_zero_struct_page from SPARC on all 64b architectures Alexander Duyck 2018-11-05 21:19 ` Alexander Duyck 2018-11-05 21:19 ` Alexander Duyck 2018-11-05 21:19 ` Alexander Duyck 2018-11-05 21:19 ` [mm PATCH v5 2/7] mm: Drop meminit_pfn_in_nid as it is redundant Alexander Duyck 2018-11-05 21:19 ` Alexander Duyck 2018-11-05 21:19 ` Alexander Duyck 2018-11-05 21:19 ` Alexander Duyck 2018-11-05 21:19 ` [mm PATCH v5 3/7] mm: Implement new zone specific memblock iterator Alexander Duyck 2018-11-05 21:19 ` Alexander Duyck 2018-11-05 21:19 ` Alexander Duyck 2018-11-05 21:19 ` Alexander Duyck 2018-11-09 23:26 ` Pavel Tatashin [this message] 2018-11-09 23:26 ` Pavel Tatashin 2018-11-09 23:58 ` Alexander Duyck 2018-11-09 23:58 ` Alexander Duyck 2018-11-10 0:11 ` Pavel Tatashin 2018-11-10 0:11 ` Pavel Tatashin 2018-11-05 21:19 ` [mm PATCH v5 4/7] mm: Initialize MAX_ORDER_NR_PAGES at a time instead of doing larger sections Alexander Duyck 2018-11-05 21:19 ` Alexander Duyck 2018-11-05 21:19 ` Alexander Duyck 2018-11-10 1:02 ` Pavel Tatashin 2018-11-10 1:02 ` Pavel Tatashin 2018-11-19 18:53 ` Alexander Duyck 2018-11-19 18:53 ` Alexander Duyck 2018-11-19 18:53 ` Alexander Duyck 2018-11-05 21:19 ` [mm PATCH v5 5/7] mm: Move hot-plug specific memory init into separate functions and optimize Alexander Duyck 2018-11-05 21:19 ` Alexander Duyck 2018-11-05 21:19 ` Alexander Duyck 2018-11-10 2:07 ` Pavel Tatashin 2018-11-10 2:07 ` Pavel Tatashin 2018-11-05 21:19 ` [mm PATCH v5 6/7] mm: Add reserved flag setting to set_page_links Alexander Duyck 2018-11-05 21:19 ` Alexander Duyck 2018-11-05 21:19 ` Alexander Duyck 2018-11-10 2:11 ` Pavel Tatashin 2018-11-10 2:11 ` Pavel Tatashin 2018-11-05 21:20 ` [mm PATCH v5 7/7] mm: Use common iterator for deferred_init_pages and deferred_free_pages Alexander Duyck 2018-11-05 21:20 ` Alexander Duyck 2018-11-05 21:20 ` Alexander Duyck 2018-11-10 4:13 ` Pavel Tatashin 2018-11-10 4:13 ` Pavel Tatashin 2018-11-12 15:12 ` Alexander Duyck 2018-11-12 15:12 ` Alexander Duyck 2018-11-12 15:12 ` Alexander Duyck 2018-11-09 21:15 ` [mm PATCH v5 0/7] Deferred page init improvements Pavel Tatashin 2018-11-09 21:15 ` Pavel Tatashin 2018-11-09 23:14 ` Alexander Duyck 2018-11-09 23:14 ` Alexander Duyck 2018-11-10 0:00 ` Pavel Tatashin 2018-11-10 0:00 ` Pavel Tatashin 2018-11-10 0:00 ` Pavel Tatashin 2018-11-10 0:46 ` Alexander Duyck 2018-11-10 0:46 ` Alexander Duyck 2018-11-10 1:16 ` Pavel Tatashin 2018-11-10 1:16 ` Pavel Tatashin 2018-11-12 19:10 ` Alexander Duyck 2018-11-12 19:10 ` Alexander Duyck 2018-11-12 20:37 ` Pavel Tatashin 2018-11-12 20:37 ` Pavel Tatashin 2018-11-12 16:25 ` Daniel Jordan 2018-11-12 16:25 ` Daniel Jordan 2018-11-12 16:25 ` Daniel Jordan 2018-11-14 15:07 ` Michal Hocko 2018-11-14 15:07 ` Michal Hocko 2018-11-14 19:12 ` Pavel Tatashin 2018-11-14 19:12 ` Pavel Tatashin 2018-11-14 21:35 ` Michal Hocko 2018-11-14 21:35 ` Michal Hocko 2018-11-14 21:35 ` Michal Hocko 2018-11-15 0:50 ` Alexander Duyck 2018-11-15 0:50 ` Alexander Duyck 2018-11-15 0:50 ` Alexander Duyck 2018-11-15 1:55 ` Mike Rapoport 2018-11-15 1:55 ` Mike Rapoport 2018-11-15 19:09 ` Mike Rapoport 2018-11-15 19:09 ` Mike Rapoport 2018-11-15 8:10 ` Michal Hocko 2018-11-15 8:10 ` Michal Hocko 2018-11-15 8:10 ` Michal Hocko 2018-11-15 16:02 ` Alexander Duyck 2018-11-15 16:02 ` Alexander Duyck 2018-11-15 16:02 ` Alexander Duyck 2018-11-15 16:40 ` Michal Hocko 2018-11-15 16:40 ` Michal Hocko
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=20181109232654.bi37bdkrqbogbdcx@xakep.localdomain \ --to=pasha.tatashin@soleen.com \ --cc=akpm@linux-foundation.org \ --cc=alexander.h.duyck@linux.intel.com \ --cc=dan.j.williams@intel.com \ --cc=dave.jiang@intel.com \ --cc=davem@davemloft.net \ --cc=khalid.aziz@oracle.com \ --cc=kirill.shutemov@linux.intel.com \ --cc=ldufour@linux.vnet.ibm.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=linux-nvdimm@lists.01.org \ --cc=mgorman@techsingularity.net \ --cc=mhocko@suse.com \ --cc=mingo@kernel.org \ --cc=pavel.tatashin@microsoft.com \ --cc=rppt@linux.vnet.ibm.com \ --cc=sparclinux@vger.kernel.org \ --cc=vbabka@suse.cz \ --cc=willy@infradead.org \ --cc=yi.z.zhang@linux.intel.com \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.