All of lore.kernel.org
 help / color / mirror / Atom feed
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 19:11:16 -0500	[thread overview]
Message-ID: <20181110001116.gtg7vxz2erbrnxc2@xakep.localdomain> (raw)
In-Reply-To: <d511ee6a18da13b9543557db783e6ff3327ca87b.camel@linux.intel.com>

> > > +		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.
> 
> Actually I think what you are asking for is the logic that is outside
> of the while loop we are breaking out of. So if you check at the end of
> the function there is the bit of code with the comment "signal end of
> iteration" where I end up setting *idx to ULLONG_MAX, *out_spfn to
> ULONG_MAX, and *out_epfn to 0.
> 
> The general idea I had with the function is that you could use either
> the index or spfn < epfn checks to determine if you keep going or not.

Yes, I meant to remove that *idx = U64_MAX after the loop, it is
confusing to have a loop:

while (*idx != U64_MAX) {
	...
}

*idx = U64_MAX;


So, it is better to set idx to U643_MAX inside the loop before the
break.

> 
> > 
> > > +
> > > +			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?
> 
> We have a few checks that I believe prevent that. Before we get to this
> point we have verified the following:
> 	zone->zone_start < epfn
> 	spfn < epfn
> 
> The other check that should be helping to prevent that is the break
> statement above that is forcing us to exit if spfn is somehow already
> past the end of the zone, that essentially maps out:
> 	spfn < zone_end_pfn(zone)
> 
> So the only check we don't have is:
> 	zone->zone_start < zone_end_pfn(zone)
> 
> If I am not mistaken that is supposed to be a given is it not? I would
> assume we don't have any zones that are completely empty or inverted
> that would be called here do we?


if (zone_end_pfn(zone) <= spfn) won't break

Equal sign in <= here takes care of the case I was thinking. Yes, logic looks good.

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: Sat, 10 Nov 2018 00:11:16 +0000	[thread overview]
Message-ID: <20181110001116.gtg7vxz2erbrnxc2@xakep.localdomain> (raw)
In-Reply-To: <d511ee6a18da13b9543557db783e6ff3327ca87b.camel@linux.intel.com>

> > > +		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.
> 
> Actually I think what you are asking for is the logic that is outside
> of the while loop we are breaking out of. So if you check at the end of
> the function there is the bit of code with the comment "signal end of
> iteration" where I end up setting *idx to ULLONG_MAX, *out_spfn to
> ULONG_MAX, and *out_epfn to 0.
> 
> The general idea I had with the function is that you could use either
> the index or spfn < epfn checks to determine if you keep going or not.

Yes, I meant to remove that *idx = U64_MAX after the loop, it is
confusing to have a loop:

while (*idx != U64_MAX) {
	...
}

*idx = U64_MAX;


So, it is better to set idx to U643_MAX inside the loop before the
break.

> 
> > 
> > > +
> > > +			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?
> 
> We have a few checks that I believe prevent that. Before we get to this
> point we have verified the following:
> 	zone->zone_start < epfn
> 	spfn < epfn
> 
> The other check that should be helping to prevent that is the break
> statement above that is forcing us to exit if spfn is somehow already
> past the end of the zone, that essentially maps out:
> 	spfn < zone_end_pfn(zone)
> 
> So the only check we don't have is:
> 	zone->zone_start < zone_end_pfn(zone)
> 
> If I am not mistaken that is supposed to be a given is it not? I would
> assume we don't have any zones that are completely empty or inverted
> that would be called here do we?


if (zone_end_pfn(zone) <= spfn) won't break

Equal sign in <= here takes care of the case I was thinking. Yes, logic looks good.

Thank you
Pasha

  reply	other threads:[~2018-11-10  0:11 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
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 [this message]
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=20181110001116.gtg7vxz2erbrnxc2@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: link
Be 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.