All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH]: Speed freeing memory for suspend.
@ 2005-03-03 11:17 Nigel Cunningham
  2005-03-03 11:26 ` Andrew Morton
  0 siblings, 1 reply; 4+ messages in thread
From: Nigel Cunningham @ 2005-03-03 11:17 UTC (permalink / raw)
  To: Andrew Morton, Linux Kernel Mailing List; +Cc: Pavel Machek

Hi.

Here's a patch I've prepared which improves the speed at which memory is
freed prior to suspend. It should be a big gain for swsusp. For
suspend2, it isn't used much, but has shown big improvements when I set
a very low image size limit and had memory quite full.

Signed-Off-By: Nigel Cunningham <ncunningham@cyclades.com>
Acked-By: Pavel Machek <pavel@ucw.cz>

Also submitted to Linux-MM. No response received.

Regards,

Nigel

diff -ruNp 898-swap_cluster_max_adjustments-old/mm/vmscan.c 898-swap_cluster_max_adjustments-new/mm/vmscan.c
--- 898-swap_cluster_max_adjustments-old/mm/vmscan.c	2005-03-03 12:04:12.000000000 +1100
+++ 898-swap_cluster_max_adjustments-new/mm/vmscan.c	2005-03-03 11:51:00.000000000 +1100
@@ -73,6 +73,12 @@ struct scan_control {
 	unsigned int gfp_mask;
 
 	int may_writepage;
+
+	/* This context's SWAP_CLUSTER_MAX. If freeing memory for
+	 * suspend, we effectively ignore SWAP_CLUSTER_MAX.
+	 * In this context, it doesn't matter that we scan the
+	 * whole list at once. */
+	int swap_cluster_max;
 };
 
 #ifdef CONFIG_MKI
@@ -566,7 +572,7 @@ static void shrink_cache(struct zone *zo
 		int nr_scan = 0;
 		int nr_freed;
 
-		while (nr_scan++ < SWAP_CLUSTER_MAX &&
+		while (nr_scan++ < sc->swap_cluster_max &&
 				!list_empty(&zone->inactive_list)) {
 			page = lru_to_page(&zone->inactive_list);
 
@@ -811,31 +817,31 @@ shrink_zone(struct zone *zone, struct sc
 	 */
 	zone->nr_scan_active += (zone->nr_active >> sc->priority) + 1;
 	nr_active = zone->nr_scan_active;
-	if (nr_active >= SWAP_CLUSTER_MAX)
+	if (nr_active >= sc->swap_cluster_max)
 		zone->nr_scan_active = 0;
 	else
 		nr_active = 0;
 
 	zone->nr_scan_inactive += (zone->nr_inactive >> sc->priority) + 1;
 	nr_inactive = zone->nr_scan_inactive;
-	if (nr_inactive >= SWAP_CLUSTER_MAX)
+	if (nr_inactive >= sc->swap_cluster_max)
 		zone->nr_scan_inactive = 0;
 	else
 		nr_inactive = 0;
 
-	sc->nr_to_reclaim = SWAP_CLUSTER_MAX;
+	sc->nr_to_reclaim = sc->swap_cluster_max;
 
 	while (nr_active || nr_inactive) {
 		if (nr_active) {
 			sc->nr_to_scan = min(nr_active,
-					(unsigned long)SWAP_CLUSTER_MAX);
+					(unsigned long)sc->swap_cluster_max);
 			nr_active -= sc->nr_to_scan;
 			refill_inactive_zone(zone, sc);
 		}
 
 		if (nr_inactive) {
 			sc->nr_to_scan = min(nr_inactive,
-					(unsigned long)SWAP_CLUSTER_MAX);
+					(unsigned long)sc->swap_cluster_max);
 			nr_inactive -= sc->nr_to_scan;
 			shrink_cache(zone, sc);
 			if (sc->nr_to_reclaim <= 0)
@@ -936,13 +942,14 @@ int try_to_free_pages(struct zone **zone
 		sc.nr_scanned = 0;
 		sc.nr_reclaimed = 0;
 		sc.priority = priority;
+		sc.swap_cluster_max = SWAP_CLUSTER_MAX;
 		shrink_caches(zones, &sc);
 		shrink_slab(sc.nr_scanned, gfp_mask, lru_pages);
 		if (reclaim_state) {
 			sc.nr_reclaimed += reclaim_state->reclaimed_slab;
 			reclaim_state->reclaimed_slab = 0;
 		}
-		if (sc.nr_reclaimed >= SWAP_CLUSTER_MAX) {
+		if (sc.nr_reclaimed >= sc.swap_cluster_max) {
 			ret = 1;
 			goto out;
 		}
@@ -956,7 +963,7 @@ int try_to_free_pages(struct zone **zone
 		 * that's undesirable in laptop mode, where we *want* lumpy
 		 * writeout.  So in laptop mode, write out the whole world.
 		 */
-		if (total_scanned > SWAP_CLUSTER_MAX + SWAP_CLUSTER_MAX/2) {
+		if (total_scanned > sc.swap_cluster_max + sc.swap_cluster_max/2) {
 			wakeup_bdflush(laptop_mode ? 0 : total_scanned);
 			sc.may_writepage = 1;
 		}
@@ -1091,6 +1098,7 @@ scan:
 			sc.nr_scanned = 0;
 			sc.nr_reclaimed = 0;
 			sc.priority = priority;
+			sc.swap_cluster_max = nr_pages? nr_pages : SWAP_CLUSTER_MAX;
 			shrink_zone(zone, &sc);
 			reclaim_state->reclaimed_slab = 0;
 			shrink_slab(sc.nr_scanned, GFP_KERNEL, lru_pages);
@@ -1128,7 +1136,7 @@ scan:
 		 * matches the direct reclaim path behaviour in terms of impact
 		 * on zone->*_priority.
 		 */
-		if (total_reclaimed >= SWAP_CLUSTER_MAX)
+		if ((total_reclaimed >= SWAP_CLUSTER_MAX) && (!nr_pages))
 			break;
 	}
 out:

-- 
Nigel Cunningham
Software Engineer, Canberra, Australia
http://www.cyclades.com
Bus: +61 (2) 6291 9554; Hme: +61 (2) 6292 8028;  Mob: +61 (417) 100 574

Maintainer of Suspend2 Kernel Patches http://softwaresuspend.berlios.de



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH]: Speed freeing memory for suspend.
  2005-03-03 11:17 [PATCH]: Speed freeing memory for suspend Nigel Cunningham
@ 2005-03-03 11:26 ` Andrew Morton
  2005-03-03 12:35   ` Nigel Cunningham
  2005-03-03 22:20   ` Nigel Cunningham
  0 siblings, 2 replies; 4+ messages in thread
From: Andrew Morton @ 2005-03-03 11:26 UTC (permalink / raw)
  To: ncunningham; +Cc: akpm, linux-kernel, pavel

Nigel Cunningham <ncunningham@cyclades.com> wrote:
>
> Here's a patch I've prepared which improves the speed at which memory is
>  freed prior to suspend. It should be a big gain for swsusp.

Patch is simple enough but, as always, please back up an optimization patch
with quantitative test results.


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH]: Speed freeing memory for suspend.
  2005-03-03 11:26 ` Andrew Morton
@ 2005-03-03 12:35   ` Nigel Cunningham
  2005-03-03 22:20   ` Nigel Cunningham
  1 sibling, 0 replies; 4+ messages in thread
From: Nigel Cunningham @ 2005-03-03 12:35 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Andrew Morton, Linux Kernel Mailing List, Pavel Machek

Hi.

On Thu, 2005-03-03 at 22:26, Andrew Morton wrote:
> Nigel Cunningham <ncunningham@cyclades.com> wrote:
> >
> > Here's a patch I've prepared which improves the speed at which memory is
> >  freed prior to suspend. It should be a big gain for swsusp.
> 
> Patch is simple enough but, as always, please back up an optimization patch
> with quantitative test results.

Okay.

I'll see if I can do some timings in the morning.

Regards,

Nigel
-- 
Nigel Cunningham
Software Engineer, Canberra, Australia
http://www.cyclades.com
Bus: +61 (2) 6291 9554; Hme: +61 (2) 6292 8028;  Mob: +61 (417) 100 574

Maintainer of Suspend2 Kernel Patches http://softwaresuspend.berlios.de



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH]: Speed freeing memory for suspend.
  2005-03-03 11:26 ` Andrew Morton
  2005-03-03 12:35   ` Nigel Cunningham
@ 2005-03-03 22:20   ` Nigel Cunningham
  1 sibling, 0 replies; 4+ messages in thread
From: Nigel Cunningham @ 2005-03-03 22:20 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Linux Kernel Mailing List, Pavel Machek

Hi.

Here are the stats:

1GB P4, 2.6.11+Suspend2 2.1.8.
Soft image size limit set to 2MB to emulate Pavel's implementation (eat
as much memory as we can).

Without patch:
Freed  16545 pages in  4000 jiffies = 16.16 MB/s
Freed  83281 pages in 14060 jiffies = 23.14 MB/s
Freed 237754 pages in 41482 jiffies = 22.39 MB/s

With patch:
Freed  52257 pages in  6700 jiffies = 30.46 MB/s
Freed 105693 pages in 11035 jiffies = 37.41 MB/s
Freed 239007 pages in 18284 jiffies = 51.06 MB/s

With a less aggressive image size limit (200MB):

Without the patch:
Freed  14600 pages in  1749 jiffies = 32.61 MB/s (Anomolous!)
Freed  88563 pages in 14719 jiffies = 23.50 MB/s
Freed 205734 pages in 32389 jiffies = 24.81 MB/s

With the patch:
Freed  68252 pages in   496 jiffies = 537.52 MB/s
Freed 116464 pages in   569 jiffies = 798.54 MB/s
Freed 209699 pages in   705 jiffies = 1161.89 MB/s

The later pages take more work to get, which accounts for the slower
MB/s with smaller numbers of pages to free. Without the patch, though,
getting the easier pages also takes longer because we do a far greater
number of invocations of shrink_all_memory in order to get the same
number of pages.

Regards,

Nigel

On Thu, 2005-03-03 at 22:26, Andrew Morton wrote: 
> Nigel Cunningham <ncunningham@cyclades.com> wrote:
> >
> > Here's a patch I've prepared which improves the speed at which memory is
> >  freed prior to suspend. It should be a big gain for swsusp.
> 
> Patch is simple enough but, as always, please back up an optimization patch
> with quantitative test results.



-- 
Nigel Cunningham
Software Engineer, Canberra, Australia
http://www.cyclades.com
Bus: +61 (2) 6291 9554; Hme: +61 (2) 6292 8028;  Mob: +61 (417) 100 574

Maintainer of Suspend2 Kernel Patches http://softwaresuspend.berlios.de


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2005-03-03 22:24 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-03-03 11:17 [PATCH]: Speed freeing memory for suspend Nigel Cunningham
2005-03-03 11:26 ` Andrew Morton
2005-03-03 12:35   ` Nigel Cunningham
2005-03-03 22:20   ` Nigel Cunningham

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.