Re: [mm PATCH v5 3/7] mm: Implement new zone specific memblock iterator
From: Pavel Tatashin
Date: Fri Nov 09 2018 - 19:11:22 EST
> > > + 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