Re: [patch] vm early reclaim orphaned pages

From: Andrew Morton
Date: Thu Jun 16 2005 - 22:36:58 EST


Nick Piggin <nickpiggin@xxxxxxxxxxxx> wrote:
>
> We have workloads where orphaned pages build up and appear to slow
> the system down when it starts reclaiming memory.
>
> Stripping the referenced bit from orphaned pages and putting them
> on the end of the inactive list should help improve reclaim.

Presumably if do_invalidatepage() failed, there's some reason why this page
is not reclaimable (eg, JBD is still dinking with it). Hence there's a
very good chance that kswapd won't be able to reclaim it either.

Adding some instrumentation would be useful: set some new page flag on
these pages and then accumulate the success/failure stats in vmscan.c, see
what they say.

> Signed-off-by: Nick Piggin <npiggin@xxxxxxx>
>
> Index: linux-2.6/mm/truncate.c
> ===================================================================
> --- linux-2.6.orig/mm/truncate.c 2005-06-01 16:09:34.000000000 +1000
> +++ linux-2.6/mm/truncate.c 2005-06-17 13:01:01.090334444 +1000
> @@ -45,11 +45,30 @@
> static void
> truncate_complete_page(struct address_space *mapping, struct page *page)
> {
> + int orphaned = 0;
> +
> if (page->mapping != mapping)
> return;
>
> if (PagePrivate(page))
> - do_invalidatepage(page, 0);
> + orphaned = !(do_invalidatepage(page, 0));
> +
> + if (orphaned) {
> + /*
> + * Put orphaned pagecache on the end of the inactive
> + * list so it can get reclaimed quickly.
> + */
> + unsigned long flags;
> + struct zone *zone = page_zone(page);
> + spin_lock_irqsave(&zone->lru_lock, flags);
> + ClearPageReferenced(page);
> + if (PageLRU(page)) {
> + list_move_tail(&page->lru, &zone->inactive_list);
> + if (PageActive(page))
> + ClearPageActive(page);
> + }
> + spin_unlock_irqrestore(&zone->lru_lock, flags);
> + }

A standalone function in swap.c would be nicer.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/