lkml.org 
[lkml]   [2009]   [Feb]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [patch] vmscan: initialize sc.order in indirect shrink_list() users
[added Mel to CC]

On Tue, Feb 10, 2009 at 04:29:48PM -0800, Andrew Morton wrote:
> On Tue, 10 Feb 2009 17:51:35 +0100
> Johannes Weiner <hannes@cmpxchg.org> wrote:
>
> > shrink_all_memory() and __zone_reclaim() currently don't initialize
> > the .order field of their scan control.
> >
> > Both of them call into functions which use that field and make certain
> > decisions based on a random value.
> >
> > The functions depending on the .order field are marked with a star,
> > the faulty entry points are marked with a percentage sign:
> >
> > * shrink_page_list()
> > * shrink_inactive_list()
> > * shrink_active_list()
> > shrink_list()
> > shrink_all_zones()
> > % shrink_all_memory()
> > shrink_zone()
> > % __zone_reclaim()
> >
> > Initialize .order to zero in shrink_all_memory(). Initialize .order
> > to the order parameter in __zone_reclaim().
> >
> > Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
> > ---
> > mm/vmscan.c | 2 ++
> > 1 files changed, 2 insertions(+), 0 deletions(-)
> >
> > diff --git a/mm/vmscan.c b/mm/vmscan.c
> > index 4422301..9ce85ea 100644
> > --- a/mm/vmscan.c
> > +++ b/mm/vmscan.c
> > @@ -2112,6 +2112,7 @@ unsigned long shrink_all_memory(unsigned long nr_pages)
> > .may_unmap = 0,
> > .swap_cluster_max = nr_pages,
> > .may_writepage = 1,
> > + .order = 0,
> > .isolate_pages = isolate_pages_global,
> > };
> >
> > @@ -2294,6 +2295,7 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order)
> > SWAP_CLUSTER_MAX),
> > .gfp_mask = gfp_mask,
> > .swappiness = vm_swappiness,
> > + .order = order,
> > .isolate_pages = isolate_pages_global,
> > };
> > unsigned long slab_reclaimable;
>
> The second hunk might fix something, but it would need a correcter
> changelog, and some thought about what its runtimes effects are likely
> to be, please.

zone_reclaim() is used by the watermark rebalancing of the buddy
allocator right before trying to do an allocation. Even though it
tries to reclaim at least 1 << order pages, it doesn't raise sc.order
to increase clustering efforts.

I think this happens with the assumption that the upcoming allocation
can still succeed and in that case we don't want to lump too
aggressively to refill the zone. The allocation might succeed on
another zone and now we have evicted precious pages due to clustering
while we are still not sure it's even needed.

If the allocation fails from all zones, we still will use lumpy
reclaim for higher orders in kswapd and try_to_free_pages().

So I think that __zone_reclaim() leaves sc.order = 0 intentionally.

Mel?

Hannes


\
 
 \ /
  Last update: 2009-02-11 02:55    [W:0.111 / U:0.056 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site