Re: [PATCH 08/25] Calculate the preferred zone for allocation only once

Mel Gorman
2009-04-21T08:27:11Z

On Tue, Apr 21, 2009 at 10:37:37AM +0300, Pekka Enberg wrote:
> Hi Mel,
>
> On Mon, 2009-04-20 at 23:19 +0100, Mel Gorman wrote:
> > get_page_from_freelist() can be called multiple times for an
> > allocation.
> > Part of this calculates the preferred_zone which is the first usable
> > zone in the zonelist. This patch calculates preferred_zone once.
> >
> > Signed-off-by: Mel Gorman <mel@csn.ul.ie>
>
> Reviewed-by: Pekka Enberg <penberg@cs.helsinki.fi>
>

Thanks

> > @@ -1772,11 +1774,20 @@ __alloc_pages_nodemask(gfp_t gfp_mask,
> > unsigned int order,
> > if (unlikely(!zonelist->_zonerefs->zone))
> > return NULL;
> >
> > + /* The preferred zone is used for statistics later */
> > + (void)first_zones_zonelist(zonelist, high_zoneidx, nodemask,
> > + &preferred_zone);
> > + if (!preferred_zone)
> > + return NULL;
>
> You might want to add an explanation to the changelog why this change is
> safe. It looked like a functional change at first glance and it was
> pretty difficult to convince myself that __alloc_pages_slowpath() will
> always return NULL when there's no preferred zone because of the other
> cleanups in this patch series.
>

Is this better?

get_page_from_freelist() can be called multiple times for an allocation.
Part of this calculates the preferred_zone which is the first usable zone in
the zonelist but the zone depends on the GFP flags specified at the beginning
of the allocation call. This patch calculates preferred_zone once. It's safe
to do this because if preferred_zone is NULL at the start of the call, no
amount of direct reclaim or other actions will change the fact the allocation
will fail.

> > +
> > + /* First allocation attempt */
> > page = get_page_from_freelist(gfp_mask|__GFP_HARDWALL, nodemask, order,
> > - zonelist, high_zoneidx, ALLOC_WMARK_LOW|ALLOC_CPUSET);
> > + zonelist, high_zoneidx, ALLOC_WMARK_LOW|ALLOC_CPUSET,
> > + preferred_zone);
> > if (unlikely(!page))
> > page = __alloc_pages_slowpath(gfp_mask, order,
> > - zonelist, high_zoneidx, nodemask);
> > + zonelist, high_zoneidx, nodemask,
> > + preferred_zone);
> >
> > return page;
> > }
>

--
Mel Gorman
Part-time Phd Student Linux Technology Center
University of Limerick IBM Dublin Software Lab