On Fri 30-10-15 12:10:15, Hillf Danton wrote: [...] > > + for_each_zone_zonelist_nodemask(zone, z, ac->zonelist, ac->high_zoneidx, ac->nodemask) { > > + unsigned long free = zone_page_state(zone, NR_FREE_PAGES); > > + unsigned long reclaimable; > > + unsigned long target; > > + > > + reclaimable = zone_reclaimable_pages(zone) + > > + zone_page_state(zone, NR_ISOLATED_FILE) + > > + zone_page_state(zone, NR_ISOLATED_ANON); > > + target = reclaimable; > > + target -= stall_backoff * (1 + target/MAX_STALL_BACKOFF); > > target = reclaimable - stall_backoff * (1 + target/MAX_STALL_BACKOFF); > = reclaimable - stall_backoff - stall_backoff * (target/MAX_STALL_BACKOFF); > > then the first stall_backoff looks unreasonable. First stall_backoff is off by 1 but that shouldn't make any difference. > I guess you mean > target = reclaimable - target * (stall_backoff/MAX_STALL_BACKOFF); > = reclaimable - stall_back * (target/MAX_STALL_BACKOFF); No the reason I used the bias is to converge for MAX_STALL_BACKOFF. If you have target which is not divisible by MAX_STALL_BACKOFF then the rounding would get target > 0 and so we wouldn't converge. With the +1 you underflow which is MAX_STALL_BACKOFF in maximum which should be fixed up by the free memory. Maybe a check for free < MAX_STALL_BACKOFF would be good but I didn't get that far with this. [...] > /* > > @@ -2734,10 +2730,6 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist, > > goto retry; > > } > > > > - /* Any of the zones still reclaimable? Don't OOM. */ > > - if (zones_reclaimable) > > - return 1; > > - > > Looks cleanup of zones_reclaimable left. Removed. Thanks! -- Michal Hocko SUSE Labs -- 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/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>