Re: [patch v3]vmscan: correctly detect GFP_ATOMIC allocation failure

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 2011-10-28 at 06:50 +0800, Minchan Kim wrote:
> On Tue, Oct 18, 2011 at 10:13:52AM +0800, Shaohua Li wrote:
> > On Wed, 2011-10-12 at 15:59 +0800, Minchan Kim wrote:
> > > On Wed, Oct 12, 2011 at 10:48:59AM +0800, Shaohua Li wrote:
> > >  > > there are two cases one zone is below min_watermark.
> > > > > > 1. the zone is below min_watermark for allocation in the zone. in this
> > > > > > case we need hurry up.
> > > > > > 2. the zone is below min_watermark for allocation from high zone. we
> > > > > > don't really need hurry up if other zone is above min_watermark.
> > > > > > Since low zone need to reserve pages for high zone, the second case
> > > > > > could be common.
> > > > > 
> > > > > You mean "lowmem_reserve"?
> > > > > It means opposite. It is a mechanism to defend using of lowmem pages from high zone allocation
> > > > > because it could be fatal to allow process pages to be allocated from low zone.
> > > > > Also, We could set each ratio for reserved pages of zones.
> > > > > How could we make sure lower zones have enough free pages for higher zone?
> > > > lowmem_reserve causes the problem, but it's not a fault of
> > > > lowmem_reserve. I'm thinking changing it.
> > > > 
> > > > > > Yes, keeping kswapd running in this case can reduce the chance
> > > > > > GFP_ATOMIC failure. But my patch will not cause immediate failure
> > > > > > because there is still some zones which are above min_watermark and can
> > > > > > meet the GFP_ATOMIC allocation. And keeping kswapd running has some
> > > > > 
> > > > > True. It was why I said "I don't mean you are wrong but we are very careful about this."
> > > > > Normally, it could handle but might fail on sudden peak of atomic allocation stream.
> > > > > Recently, we have suffered from many reporting of GFP_AOTMIC allocation than olded.
> > > > > So I would like to be very careful and that's why I suggest we need at least some experiment.
> > > > > Through it, Andrew could make final call.
> > > > sure.
> > > > 
> > > > > > drawbacks:
> > > > > > 1. cpu overhead
> > > > > > 2. extend isolate window size, so trash working set.
> > > > > > Considering DMA zone, we almost always have DMA zone min_watermark not
> > > > > > ok for any allocation from high zone. So we will always have such
> > > > > > drawbacks.
> > > > > 
> > > > > I agree with you in that it's a problem.
> > > > > I think the real solution is to remove the zone from allocation fallback list in such case
> > > > > because the lower zone could never meet any allocation for the higher zone.
> > > > > But it makes code rather complicated as we have to consider admin who can change
> > > > > reserved pages anytime.
> > > > Not worthy the complication.
> > > > 
> > > > > So how about this?
> > > > > 
> > > > > diff --git a/mm/vmscan.c b/mm/vmscan.c
> > > > > index 8913374..f71ed2f 100644
> > > > > --- a/mm/vmscan.c
> > > > > +++ b/mm/vmscan.c
> > > > > @@ -2693,8 +2693,16 @@ loop_again:
> > > > >                                  * failure risk. Hurry up!
> > > > >                                  */
> > > > >                                 if (!zone_watermark_ok_safe(zone, order,
> > > > > -                                           min_wmark_pages(zone), end_zone, 0))
> > > > > -                                       has_under_min_watermark_zone = 1;
> > > > > +                                           min_wmark_pages(zone), end_zone, 0)) {
> > > > > +                                       /*
> > > > > +                                        * In case of big reserved page for higher zone,
> > > > > +                                        * it is pointless to try reclaimaing pages quickly
> > > > > +                                        * because it could never meet the requirement.
> > > > > +                                        */
> > > > > +                                       if (zone->present_pages >
> > > > > +                                               min_wmark_pages(zone) + zone->lowmem_reserve[end_zone])
> > > > > +                                               has_under_min_watermark_zone = 1;
> > > > > +                               }
> > > > >                         } else {
> > > > >                                 /*
> > > > >                                  * If a zone reaches its high watermark,
> > > > This looks like a workaround just for DMA zone. present_pages could be
> > > > bigger than min_mwark+lowmem_reserve. And We still suffered from the
> > > > issue, for example, a DMA32 zone with some pages allocated for DMA, or a
> > > > zone which has some lru pages, but still much smaller than high zone.
> > > 
> > > Right. I thought about it but couldn't have a good idea for it. :(
> > > 
> > > > 
> > > > > Even, we could apply this at starting of the loop so that we can avoid unnecessary scanning st the beginning.
> > > > > In that case, we have to apply zone->lowmem_reserve[end_zone] only because we have to consider NO_WATERMARK alloc case.
> > > > yes, we can do this to avoid unnecessary scan. but DMA zone hasn't lru
> > > > pages, so not sure how big the benefit is here.
> > > 
> > > At least, we can prevent has_under_min_watermark_zone from set.
> > > But it still have a problem you pointed out earlier.
> > > 
> > > > 
> > > > > > Or is something below better? we can avoid the big reserved pages
> > > > > > accounting to the min_wmark_pages for low zone. if high zone is under
> > > > > > min_wmark, kswapd will not sleep.
> > > > > >                                if (!zone_watermark_ok_safe(zone, order,
> > > > > > -                                            min_wmark_pages(zone), end_zone, 0))
> > > > > > +                                            min_wmark_pages(zone), 0, 0))
> > > > > >                                         has_under_min_watermark_zone = 1;
> > > > > 
> > > > > I think it's not a good idea since page allocator always considers classzone_idx.
> > > > > So although we fix kswapd issue through your changes, page allocator still can't allocate memory
> > > > > and wakes up kswapd, again.
> > > > why kswapd will be waked up again? The high zone itself still has
> > > > min_wark+low_reserve ok for the allocation(classzone_idx 0 means
> > > > checking the low_reserve for allocation from the zone itself), so the
> > > > allocation can be met.
> > > 
> > > You're absolutely right.
> > > I got confused. Sorry about that.
> > > 
> > > I like this than your old version.
> > > That's because it could rush if one of zonelist is consumed as below min_watermak.
> > > It could mitigate GFP_ALLOC fail than yours old version but still would be higher than now.
> > > So, we need the number.
> > > 
> > > Could you repost this as formal patch with good comment and number?
> > > Personally, I like description based on scenario with kind step-by-step.
> > > Feel free to use my description in my patch if you want.
> > > 
> > > Thanks for patient discussion in spite of my irregular reply, Shaohua.
> > Thanks for your time. Here is patch. I'm trying to get some number, but
> > didn't find a proper workload to demonstrate the atomic allocation
> > failure. Any suggestion for the workload?
> 
> Sorry for really really late response.
> 
> Hmm.. I didn't have a such test.
> But it seems recently we had a such report, again.
> https://lkml.org/lkml/2011/10/18/131
> If you want it, you could ask him.
I'll ask.

> > Subject: vmscan: correctly detect GFP_ATOMIC allocation failure -v3
> > 
> > has_under_min_watermark_zone is used to detect if there is GFP_ATOMIC allocation
> > failure risk. Current logic is if any zone has min watermark not ok, we have
> > risk.
> > 
> > Low zone needs reserve memory to avoid fallback from high zone. The reserved
> > memory is zone->lowmem_reserve[]. If high zone is big, low zone's
> > min_wmark + lowmem_reserve[] usually is big. Sometimes min_wmark +
> > lowmem_reserve[] could even be higher than zone->present_pages. An example is
> > DMA zone. Other low zones could have the similar high reserved memory though
> > might still have margins between reserved pages and present pages. So in kswapd
> > loop, if end_zone is a high zone, has_under_min_watermark_zone could be easily
> > set or always set for DMA.
> > 
> > Let's consider end_zone is a high zone and it has high_mwark not ok, but
> > min_mwark ok. A DMA zone always has present_pages less than reserved pages, so
> > has_under_min_watermark_zone is always set. When kswapd is running, there are
> > some drawbacks:
> > 1. kswapd can keep unnecessary running without congestion_wait. high zone
> > already can meet GFP_ATOMIC. The running will waste some CPU.
> > 2. kswapd can scan much more pages to trash working set. congestion_wait can
> > slow down scan if kswapd has trouble. Now congestion_wait is skipped, kswapd
> > will keep scanning unnecessary pages.
> > 
> > So since DMA zone always set has_under_min_watermark_zone, current logic actually
> > equals to that kswapd keeps running without congestion_wait till high zone has
> > high wmark ok when it has trouble. This is not intended.
> > 
> > In this path, we test the min_mwark against the zone itself. This doesn't change
> > the behavior of high zone. For low zone, we now exclude lowmem_reserve for high
> > zone to avoid unnecessary running.
> > 
> > Note: With this patch, we could have potential higher risk of GFP_ATOMIC failure.
> > 
> > v3: Uses a less intrusive method to determine if has_under_min_watermark_zone
> > should be set after discussion with Minchan.
> > v2: use bool and clear has_under_min_watermark_zone for zone with watermark ok
> > as suggested by David Rientjes.
> > 
> > Signed-off-by: Shaohua Li <shaohua.li@xxxxxxxxx>
> Reviewed-by: Minchan Kim <minchan.kim@xxxxxxxxx>
> 
> As you know, I give my reviewed-by as a token of "code looks good to me".
> But still, we see atomic allocation failure messasge recently.
> So you need to get a acked-by as a toekn of "I support this idea" of
> others(ie, Mel/Rik are right person).
> 
> I hope it would be better to write down it in description that
> it's real problem of your system and the patch solves it.
Thanks, I haven't test case exposing this issue, but just thought the
logic looks buggy.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@xxxxxxxxx.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@xxxxxxxxx";> email@xxxxxxxxx </a>


[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]