SOURCES: kernel-desktop-ck.patch - adapted, big part already in su...

sparky sparky at pld-linux.org
Fri Jun 23 21:14:39 CEST 2006


Author: sparky                       Date: Fri Jun 23 19:14:39 2006 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- adapted, big part already in suspend2 patch

---- Files affected:
SOURCES:
   kernel-desktop-ck.patch (1.1 -> 1.2) 

---- Diffs:

================================================================
Index: SOURCES/kernel-desktop-ck.patch
diff -u SOURCES/kernel-desktop-ck.patch:1.1 SOURCES/kernel-desktop-ck.patch:1.2
--- SOURCES/kernel-desktop-ck.patch:1.1	Fri Jun 23 21:13:24 2006
+++ SOURCES/kernel-desktop-ck.patch	Fri Jun 23 21:14:34 2006
@@ -2806,12 +2806,12 @@
 --- linux-2.6.17-ck1.orig/include/linux/sysctl.h	2006-06-18 15:32:49.000000000 +1000
 +++ linux-2.6.17-ck1/include/linux/sysctl.h	2006-06-18 15:34:43.000000000 +1000
 @@ -148,6 +148,9 @@ enum
- 	KERN_SPIN_RETRY=70,	/* int: number of spinlock retries */
  	KERN_ACPI_VIDEO_FLAGS=71, /* int: flags for setting up video after ACPI sleep */
  	KERN_IA64_UNALIGNED=72, /* int: ia64 unaligned userland trap enable */
-+	KERN_INTERACTIVE=73,	/* interactive tasks can have cpu bursts */
-+	KERN_COMPUTE=74,	/* adjust timeslices for a compute server */
-+	KERN_ISO_CPU=75,	/* percent cpu SCHED_ISO tasks run SCHED_RR */
+	KERN_MAX_LOCK_DEPTH=80,
++	KERN_INTERACTIVE=83,	/* interactive tasks can have cpu bursts */
++	KERN_COMPUTE=84,	/* adjust timeslices for a compute server */
++	KERN_ISO_CPU=85,	/* percent cpu SCHED_ISO tasks run SCHED_RR */
  };
  
  
@@ -4145,7 +4145,7 @@
  
  #include <asm/tlbflush.h>
  #include <asm/div64.h>
-@@ -61,6 +63,8 @@ struct scan_control {
+@@ -61,6 +63,8 @@
  	 * In this context, it doesn't matter that we scan the
  	 * whole list at once. */
  	int swap_cluster_max;
@@ -4154,7 +4154,7 @@
  };
  
  /*
-@@ -105,10 +109,11 @@ struct shrinker {
+@@ -105,10 +109,11 @@
  #endif
  
  /*
@@ -4169,7 +4169,7 @@
  
  static LIST_HEAD(shrinker_list);
  static DECLARE_RWSEM(shrinker_rwsem);
-@@ -380,6 +385,7 @@ int remove_mapping(struct address_space 
+@@ -380,6 +385,7 @@
  
  	if (PageSwapCache(page)) {
  		swp_entry_t swap = { .val = page_private(page) };
@@ -4177,7 +4177,7 @@
  		__delete_from_swap_cache(page);
  		write_unlock_irq(&mapping->tree_lock);
  		swap_free(swap);
-@@ -738,10 +744,14 @@ static void shrink_active_list(unsigned 
+@@ -738,10 +744,14 @
  		 * The distress ratio is important - we don't want to start
  		 * going oom.
  		 *
@@ -4195,7 +4195,7 @@
  
  		/*
  		 * Now use this metric to decide whether to start moving mapped
-@@ -888,6 +898,40 @@ static unsigned long shrink_zone(int pri
+@@ -888,6 +898,40 @
  }
  
  /*
@@ -4236,7 +4236,7 @@
   * This is the direct reclaim path, for page-allocating processes.  We only
   * try to reclaim pages from zones which will satisfy the caller's allocation
   * request.
-@@ -943,7 +987,8 @@ static unsigned long shrink_zones(int pr
+@@ -943,7 +987,8 @
   * holds filesystem locks which prevent writeout this might not work, and the
   * allocation attempt will fail.
   */
@@ -4246,7 +4246,7 @@
  {
  	int priority;
  	int ret = 0;
-@@ -951,14 +996,20 @@ unsigned long try_to_free_pages(struct z
+@@ -951,14 +996,20 @
  	unsigned long nr_reclaimed = 0;
  	struct reclaim_state *reclaim_state = current->reclaim_state;
  	unsigned long lru_pages = 0;
@@ -4268,7 +4268,7 @@
  	inc_page_state(allocstall);
  
  	for (i = 0; zones[i] != NULL; i++) {
-@@ -967,11 +1018,11 @@ unsigned long try_to_free_pages(struct z
+@@ -967,11 +1018,11 @
  		if (!cpuset_zone_allowed(zone, __GFP_HARDWALL))
  			continue;
  
@@ -4282,7 +4282,7 @@
  		sc.nr_mapped = read_page_state(nr_mapped);
  		sc.nr_scanned = 0;
  		if (!priority)
-@@ -1002,7 +1053,7 @@ unsigned long try_to_free_pages(struct z
+@@ -1002,7 +1053,7 @
  		}
  
  		/* Take a nap, wait for some writeback to complete */
@@ -4291,26 +4291,10 @@
  			blk_congestion_wait(WRITE, HZ/10);
  	}
  out:
-@@ -1021,10 +1072,6 @@ out:
-  * For kswapd, balance_pgdat() will work across all this node's zones until
-  * they are all at pages_high.
-  *
-- * If `nr_pages' is non-zero then it is the number of pages which are to be
-- * reclaimed, regardless of the zone occupancies.  This is a software suspend
-- * special.
-- *
-  * Returns the number of pages which were actually freed.
-  *
-  * There is special handling here for zones which are full of pinned pages.
-@@ -1042,22 +1089,23 @@ out:
-  * the page allocator fallback scheme to ensure that aging of pages is balanced
-  * across the zones.
+@@ -1040,9 +1091,9 @
   */
--static unsigned long balance_pgdat(pg_data_t *pgdat, unsigned long nr_pages,
--				int order)
-+static unsigned long balance_pgdat(pg_data_t *pgdat, int order)
+ static unsigned long balance_pgdat(pg_data_t *pgdat, int order)
  {
--	unsigned long to_free = nr_pages;
 -	int all_zones_ok;
 +	int all_zones_ok = 0;
  	int priority;
@@ -4319,11 +4303,10 @@
  	unsigned long total_scanned;
  	unsigned long nr_reclaimed;
  	struct reclaim_state *reclaim_state = current->reclaim_state;
- 	struct scan_control sc = {
+@@ -1050,8 +1101,11 @
  		.gfp_mask = GFP_KERNEL,
  		.may_swap = 1,
--		.swap_cluster_max = nr_pages ? nr_pages : SWAP_CLUSTER_MAX,
-+		.swap_cluster_max = SWAP_CLUSTER_MAX,
+ 		.swap_cluster_max = SWAP_CLUSTER_MAX,
 +		.mapped = vm_mapped,
  	};
  
@@ -4332,7 +4315,7 @@
  loop_again:
  	total_scanned = 0;
  	nr_reclaimed = 0;
-@@ -1069,10 +1117,10 @@ loop_again:
+@@ -1063,10 +1117,10 @
  	for (i = 0; i < pgdat->nr_zones; i++) {
  		struct zone *zone = pgdat->node_zones + i;
  
@@ -4345,42 +4328,22 @@
  		int end_zone = 0;	/* Inclusive.  0 = ZONE_DMA */
  		unsigned long lru_pages = 0;
  
-@@ -1082,31 +1130,34 @@ loop_again:
- 
- 		all_zones_ok = 1;
- 
--		if (nr_pages == 0) {
--			/*
--			 * Scan in the highmem->dma direction for the highest
--			 * zone which needs scanning
--			 */
--			for (i = pgdat->nr_zones - 1; i >= 0; i--) {
--				struct zone *zone = pgdat->node_zones + i;
-+		/*
-+		 * Scan in the highmem->dma direction for the highest
-+		 * zone which needs scanning
-+		 */
-+		for (i = pgdat->nr_zones - 1; i >= 0; i--) {
-+			struct zone *zone = pgdat->node_zones + i;
+@@ -1082,19 +1136,26 @
+ 		 */
+ 		for (i = pgdat->nr_zones - 1; i >= 0; i--) {
+ 			struct zone *zone = pgdat->node_zones + i;
 +			unsigned long watermark;
-+
-+			if (!populated_zone(zone))
-+				continue;
  
--				if (!populated_zone(zone))
--					continue;
+ 			if (!populated_zone(zone))
+ 				continue;
+ 
+-			if (zone->all_unreclaimable &&
+-					priority != DEF_PRIORITY)
 +			if (zone->all_unreclaimable && priority != scan_priority)
-+				continue;
+ 				continue;
  
--				if (zone->all_unreclaimable &&
--						priority != DEF_PRIORITY)
--					continue;
--
--				if (!zone_watermark_ok(zone, order,
--						zone->pages_high, 0, 0)) {
--					end_zone = i;
--					goto scan;
--				}
+-			if (!zone_watermark_ok(zone, order, zone->pages_high,
+-					       0, 0)) {
 +			/*
 +			 * The watermark is relaxed depending on the
 +			 * level of "priority" till it drops to
@@ -4389,19 +4352,14 @@
 +			watermark = zone->pages_high + (zone->pages_high *
 +				    priority / scan_priority);
 +			if (!zone_watermark_ok(zone, order, watermark, 0, 0)) {
-+				end_zone = i;
-+				goto scan;
+ 				end_zone = i;
+ 				goto scan;
  			}
--			goto out;
--		} else {
--			end_zone = pgdat->nr_zones - 1;
 +
  		}
-+		goto out;
+ 		goto out;
  scan:
- 		for (i = 0; i <= end_zone; i++) {
- 			struct zone *zone = pgdat->node_zones + i;
-@@ -1126,18 +1177,20 @@ scan:
+@@ -1116,14 +1177,18 @
  		for (i = 0; i <= end_zone; i++) {
  			struct zone *zone = pgdat->node_zones + i;
  			int nr_slab;
@@ -4414,29 +4372,15 @@
 +			if (zone->all_unreclaimable && priority != scan_priority)
  				continue;
  
--			if (nr_pages == 0) {	/* Not software suspend */
--				if (!zone_watermark_ok(zone, order,
--						zone->pages_high, end_zone, 0))
--					all_zones_ok = 0;
--			}
+-			if (!zone_watermark_ok(zone, order, zone->pages_high,
 +			watermark = zone->pages_high + (zone->pages_high *
 +				    priority / scan_priority);
 +
 +			if (!zone_watermark_ok(zone, order, watermark,
-+					       end_zone, 0))
-+				all_zones_ok = 0;
+ 					       end_zone, 0))
+ 				all_zones_ok = 0;
  			zone->temp_priority = priority;
- 			if (zone->prev_priority > priority)
- 				zone->prev_priority = priority;
-@@ -1162,15 +1215,13 @@ scan:
- 			    total_scanned > nr_reclaimed + nr_reclaimed / 2)
- 				sc.may_writepage = 1;
- 		}
--		if (nr_pages && to_free > nr_reclaimed)
--			continue;	/* swsusp: need to do more work */
- 		if (all_zones_ok)
- 			break;		/* kswapd: all done */
- 		/*
+@@ -1156,7 +1221,7 @
  		 * OK, kswapd is getting into trouble.  Take a nap, then take
  		 * another pass across the zones.
  		 */
@@ -4445,16 +4389,7 @@
  			blk_congestion_wait(WRITE, HZ/10);
  
  		/*
-@@ -1179,7 +1230,7 @@ scan:
- 		 * matches the direct reclaim path behaviour in terms of impact
- 		 * on zone->*_priority.
- 		 */
--		if ((nr_reclaimed >= SWAP_CLUSTER_MAX) && !nr_pages)
-+		if (nr_reclaimed >= SWAP_CLUSTER_MAX)
- 			break;
- 	}
- out:
-@@ -1196,6 +1247,8 @@ out:
+@@ -1182,6 +1247,8 @
  	return nr_reclaimed;
  }
  
@@ -4463,16 +4398,16 @@
  /*
   * The background pageout daemon, started as a kernel thread
   * from the init process. 
-@@ -1246,6 +1299,8 @@ static int kswapd(void *p)
- 
- 		try_to_freeze();
+@@ -1233,6 +1300,8 @
+ 		if (try_to_freeze())
+ 			pgdat->kswapd_max_order = 0;
  
 +		/* kswapd has been busy so delay watermark_timer */
 +		mod_timer(&pgdat->watermark_timer, jiffies + WT_EXPIRY);
  		prepare_to_wait(&pgdat->kswapd_wait, &wait, TASK_INTERRUPTIBLE);
  		new_order = pgdat->kswapd_max_order;
  		pgdat->kswapd_max_order = 0;
-@@ -1256,12 +1311,13 @@ static int kswapd(void *p)
+@@ -1243,6 +1311,7 @
  			 */
  			order = new_order;
  		} else {
@@ -4480,14 +4415,7 @@
  			schedule();
  			order = pgdat->kswapd_max_order;
  		}
- 		finish_wait(&pgdat->kswapd_wait, &wait);
- 
--		balance_pgdat(pgdat, 0, order);
-+		balance_pgdat(pgdat, order);
- 	}
- 	return 0;
- }
-@@ -1269,9 +1325,10 @@ static int kswapd(void *p)
+@@ -1256,9 +1325,10 @
  /*
   * A zone is low on free memory, so wake its kswapd task to service it.
   */
@@ -4499,7 +4427,7 @@
  
  	if (!populated_zone(zone))
  		return;
-@@ -1283,42 +1340,163 @@ void wakeup_kswapd(struct zone *zone, in
+@@ -1270,7 +1340,9 @
  		pgdat->kswapd_max_order = order;
  	if (!cpuset_zone_allowed(zone, __GFP_HARDWALL))
  		return;
@@ -4510,178 +4438,53 @@
  		return;
  	wake_up_interruptible(&pgdat->kswapd_wait);
  }
- 
- #ifdef CONFIG_PM
- /*
-- * Try to free `nr_pages' of memory, system-wide.  Returns the number of freed
-- * pages.
-+ * Helper function for shrink_all_memory().  Tries to reclaim 'nr_pages' pages
-+ * from LRU lists system-wide, for given pass and priority, and returns the
-+ * number of reclaimed pages
-+ *
-+ * For pass > 3 we also try to shrink the LRU lists that contain a few pages
-+ */
-+unsigned long shrink_all_zones(unsigned long nr_pages, int pass, int prio,
-+				struct scan_control *sc)
-+{
-+	struct zone *zone;
-+	unsigned long nr_to_scan, ret = 0;
-+
-+	for_each_zone(zone) {
-+
-+		if (!populated_zone(zone))
-+			continue;
-+
-+		if (zone->all_unreclaimable && prio != DEF_PRIORITY)
-+			continue;
-+
-+		/* For pass = 0 we don't shrink the active list */
-+		if (pass > 0) {
-+			zone->nr_scan_active += (zone->nr_active >> prio) + 1;
-+			if (zone->nr_scan_active >= nr_pages || pass > 3) {
-+				zone->nr_scan_active = 0;
-+				nr_to_scan = min(nr_pages, zone->nr_active);
-+				shrink_active_list(nr_to_scan, zone, sc);
-+			}
-+		}
-+
-+		zone->nr_scan_inactive += (zone->nr_inactive >> prio) + 1;
-+		if (zone->nr_scan_inactive >= nr_pages || pass > 3) {
-+			zone->nr_scan_inactive = 0;
-+			nr_to_scan = min(nr_pages, zone->nr_inactive);
-+			ret += shrink_inactive_list(nr_to_scan, zone, sc);
-+			if (ret >= nr_pages)
-+				return ret;
-+		}
-+	}
-+
-+	return ret;
-+}
-+
-+/*
-+ * Try to free `nr_pages' of memory, system-wide, and return the number of
-+ * freed pages.
-+ *
-+ * Rather than trying to age LRUs the aim is to preserve the overall
-+ * LRU order by reclaiming preferentially
-+ * inactive > active > active referenced > active mapped
-  */
- unsigned long shrink_all_memory(unsigned long nr_pages)
+@@ -1332,14 +1404,15 @
  {
--	pg_data_t *pgdat;
--	unsigned long nr_to_free = nr_pages;
-+	unsigned long lru_pages, nr_slab;
+ 	unsigned long lru_pages, nr_slab;
  	unsigned long ret = 0;
--	unsigned retry = 2;
--	struct reclaim_state reclaim_state = {
--		.reclaimed_slab = 0,
+-	int swappiness = vm_swappiness, pass;
 +	int pass;
-+	struct reclaim_state reclaim_state;
-+	struct zone *zone;
-+	struct scan_control sc = {
-+		.gfp_mask = GFP_KERNEL,
+ 	struct reclaim_state reclaim_state;
+ 	struct zone *zone;
+ 	struct scan_control sc = {
+ 		.gfp_mask = GFP_KERNEL,
+-		.may_swap = 1,
 +		.may_swap = 0,
-+		.swap_cluster_max = nr_pages,
-+		.may_writepage = 1,
+ 		.swap_cluster_max = nr_pages,
+ 		.may_writepage = 1,
 +		.mapped = vm_mapped,
  	};
  
  	current->reclaim_state = &reclaim_state;
--repeat:
--	for_each_online_pgdat(pgdat) {
--		unsigned long freed;
- 
--		freed = balance_pgdat(pgdat, nr_to_free, 0);
--		ret += freed;
--		nr_to_free -= freed;
--		if ((long)nr_to_free <= 0)
-+	lru_pages = 0;
-+	for_each_zone(zone)
-+		lru_pages += zone->nr_active + zone->nr_inactive;
-+
-+	nr_slab = read_page_state(nr_slab);
-+	/* If slab caches are huge, it's better to hit them first */
-+	while (nr_slab >= lru_pages) {
-+		reclaim_state.reclaimed_slab = 0;
-+		shrink_slab(nr_pages, sc.gfp_mask, lru_pages);
-+		if (!reclaim_state.reclaimed_slab)
- 			break;
-+
-+		ret += reclaim_state.reclaimed_slab;
-+		if (ret >= nr_pages)
-+			goto out;
-+
-+		nr_slab -= reclaim_state.reclaimed_slab;
- 	}
--	if (retry-- && ret < nr_pages) {
--		blk_congestion_wait(WRITE, HZ/5);
--		goto repeat;
-+
-+	/*
-+	 * We try to shrink LRUs in 5 passes:
-+	 * 0 = Reclaim from inactive_list only
-+	 * 1 = Reclaim from active list but don't reclaim mapped
-+	 * 2 = 2nd pass of type 1
-+	 * 3 = Reclaim mapped (normal reclaim)
-+	 * 4 = 2nd pass of type 3
-+	 */
-+	for (pass = 0; pass < 5; pass++) {
-+		int prio;
-+
-+		/* Needed for shrinking slab caches later on */
-+		if (!lru_pages)
-+			for_each_zone(zone) {
-+				lru_pages += zone->nr_active;
-+				lru_pages += zone->nr_inactive;
-+			}
-+
-+		/* Force reclaiming mapped pages in the passes #3 and #4 */
+@@ -1381,15 +1455,16 @
+ 			}
+ 
+ 		/* Force reclaiming mapped pages in the passes #3 and #4 */
+-		if (pass > 2)
+-			vm_swappiness = 100;
 +		if (pass > 2) {
 +			sc.may_swap = 1;
 +			sc.mapped = 0;
 +		}
-+
-+		for (prio = DEF_PRIORITY; prio >= 0; prio--) {
-+			unsigned long nr_to_scan = nr_pages - ret;
-+
-+			sc.nr_mapped = read_page_state(nr_mapped);
-+			sc.nr_scanned = 0;
-+
-+			ret += shrink_all_zones(nr_to_scan, prio, pass, &sc);
-+			if (ret >= nr_pages)
-+				goto out;
-+
-+			reclaim_state.reclaimed_slab = 0;
-+			shrink_slab(sc.nr_scanned, sc.gfp_mask, lru_pages);
-+			ret += reclaim_state.reclaimed_slab;
-+			if (ret >= nr_pages)
-+				goto out;
-+
-+			if (sc.nr_scanned && prio < DEF_PRIORITY - 2)
-+				blk_congestion_wait(WRITE, HZ / 10);
-+		}
-+
-+		lru_pages = 0;
- 	}
-+
-+	/*
-+	 * If ret = 0, we could not shrink LRUs, but there may be something
-+	 * in slab caches
-+	 */
-+	if (!ret)
-+		do {
-+			reclaim_state.reclaimed_slab = 0;
-+			shrink_slab(nr_pages, sc.gfp_mask, lru_pages);
-+			ret += reclaim_state.reclaimed_slab;
-+		} while (ret < nr_pages && reclaim_state.reclaimed_slab > 0);
-+
-+out:
+ 
+ 		for (prio = DEF_PRIORITY; prio >= 0; prio--) {
+ 			unsigned long nr_to_scan = nr_pages - ret;
+ 
+ 			sc.nr_mapped = read_page_state(nr_mapped);
+ 			sc.nr_scanned = 0;
+-			sc.swap_cluster_max = nr_pages - ret;
+ 
+ 			ret += shrink_all_zones(nr_to_scan, prio, pass, &sc);
+ 			if (ret >= nr_pages)
+@@ -1422,7 +1496,6 @
+ 
+ out:
  	current->reclaim_state = NULL;
-+
+-	vm_swappiness = swappiness;
+ 
  	return ret;
  }
- #endif
-@@ -1346,12 +1524,41 @@ static int cpu_callback(struct notifier_
+@@ -1451,12 +1524,41 @
  }
  #endif /* CONFIG_HOTPLUG_CPU */
  
@@ -4723,7 +4526,7 @@
  		pid_t pid;
  
  		pid = kernel_thread(kswapd, pgdat, CLONE_KERNEL);
-@@ -1359,6 +1566,11 @@ static int __init kswapd_init(void)
+@@ -1464,6 +1566,11 @
  		read_lock(&tasklist_lock);
  		pgdat->kswapd = find_task_by_pid(pid);
  		read_unlock(&tasklist_lock);
@@ -4735,7 +4538,7 @@
  	}
  	total_memory = nr_free_pagecache_pages();
  	hotcpu_notifier(cpu_callback, 0);
-@@ -1416,6 +1628,7 @@ static int __zone_reclaim(struct zone *z
+@@ -1521,6 +1628,7 @
  		.swap_cluster_max = max_t(unsigned long, nr_pages,
  					SWAP_CLUSTER_MAX),
  		.gfp_mask = gfp_mask,
@@ -4821,38 +4624,6 @@
 +#endif	/* CONFIG_SWAP_PREFETCH */
 +
 +#endif		/* SWAP_PREFETCH_H_INCLUDED */
-Index: linux-2.6.17-ck1/kernel/power/swsusp.c
-===================================================================
---- linux-2.6.17-ck1.orig/kernel/power/swsusp.c	2006-06-18 15:32:49.000000000 +1000
-+++ linux-2.6.17-ck1/kernel/power/swsusp.c	2006-06-18 15:34:38.000000000 +1000
-@@ -175,6 +175,12 @@ void free_all_swap_pages(int swap, struc
-  */
- 
- #define SHRINK_BITE	10000
-+static inline unsigned long __shrink_memory(long tmp)
-+{
-+	if (tmp > SHRINK_BITE)
-+		tmp = SHRINK_BITE;
-+	return shrink_all_memory(tmp);
-+}
- 
- int swsusp_shrink_memory(void)
- {
-@@ -195,12 +201,12 @@ int swsusp_shrink_memory(void)
- 			if (!is_highmem(zone))
- 				tmp -= zone->free_pages;
- 		if (tmp > 0) {
--			tmp = shrink_all_memory(SHRINK_BITE);
-+			tmp = __shrink_memory(tmp);
- 			if (!tmp)
- 				return -ENOMEM;
- 			pages += tmp;
- 		} else if (size > image_size / PAGE_SIZE) {
--			tmp = shrink_all_memory(SHRINK_BITE);
-+			tmp = __shrink_memory(size - (image_size / PAGE_SIZE));
- 			pages += tmp;
- 		}
- 		printk("\b%c", p[i++%4]);
<<Diff was trimmed, longer than 597 lines>>

---- CVS-web:
    http://cvs.pld-linux.org/SOURCES/kernel-desktop-ck.patch?r1=1.1&r2=1.2&f=u



More information about the pld-cvs-commit mailing list