Re: [rfc] [patch] mm: zone_reclaim fix for pseudo file systems

Christoph Lameter
2007-07-31T19:30:43Z

On Tue, 31 Jul 2007, Andrew Morton wrote:

> On Tue, 31 Jul 2007 01:27:51 -0700 Ravikiran G Thirumalai <kiran@scalex86.org> wrote:
>
> > >From what I can see with .21 and .22, going into reclaim is a problem rather
> > than reclaim efficiency itself. Sure, if unreclaimable pages are not on LRU
> > it would be good, but the main problem for my narrow eyes is going into
> > reclaim when there are no reclaimable pages, and the fact that benchmark
> > works as expected with the fixed arithmetic reinforces that impression.
> >
> > What am I missing?
>
> The fact that is there are "no reclaimable pages" then the all_unreclaimable
> logic should kick in and fix the problem.
>
> Except zone_reclaim() fails to implement it.

It would be easy to implement. Just set a flag when we fail to reclaim.
But this will result in the same deadbeat behavior like regular reclaim.

If the unmapped pages turn out to be unreclaimable then we essentially
switch off zone reclaim and do small attempts at reclaim until we are
successful. This may take a long time and we may be unsuccessful in
detecting unmapped pages that become reclaimable.

Index: linux-2.6/include/linux/mmzone.h
===================================================================
--- linux-2.6.orig/include/linux/mmzone.h 2007-07-31 12:25:18.000000000 -0700
+++ linux-2.6/include/linux/mmzone.h 2007-07-31 12:25:41.000000000 -0700
@@ -234,6 +234,7 @@ struct zone {
unsigned long nr_scan_inactive;
unsigned long pages_scanned; /* since last reclaim */
int all_unreclaimable; /* All pages pinned */
+ int unmapped_unreclaimable; /* Unmapped pages are unreclaimable */

/* A count of how many reclaimers are scanning this zone */
atomic_t reclaim_in_progress;
Index: linux-2.6/mm/vmscan.c
===================================================================
--- linux-2.6.orig/mm/vmscan.c 2007-07-31 12:21:23.000000000 -0700
+++ linux-2.6/mm/vmscan.c 2007-07-31 12:29:27.000000000 -0700
@@ -1759,7 +1759,10 @@ static int __zone_reclaim(struct zone *z
note_zone_scanning_priority(zone, priority);
nr_reclaimed += shrink_zone(priority, zone, &sc);
priority--;
- } while (priority >= 0 && nr_reclaimed < nr_pages);
+ } while (priority >= 0 && nr_reclaimed < nr_pages &&
+ !zone->unmapped_unreclaimable);
+
+ zone->unmapped_reclaimable = nr_reclaimed > 0;
}

slab_reclaimable = zone_page_state(zone, NR_SLAB_RECLAIMABLE);