aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/goldfish/patches-2.6.30/0056-mm-Check-if-any-page-in-a-pageblock-is-reserved-bef.patch
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2009-06-14 20:42:33 +0000
committerFelix Fietkau <nbd@openwrt.org>2009-06-14 20:42:33 +0000
commitf88360279f91387dc61725226ad38c3c95d3790a (patch)
tree66d21f3483914eb7e674c45f3497ab8912094ac0 /target/linux/goldfish/patches-2.6.30/0056-mm-Check-if-any-page-in-a-pageblock-is-reserved-bef.patch
parenta6d8f8be9e06c5ffb03f815c8c76ba743c64aa3d (diff)
downloadupstream-f88360279f91387dc61725226ad38c3c95d3790a.tar.gz
upstream-f88360279f91387dc61725226ad38c3c95d3790a.tar.bz2
upstream-f88360279f91387dc61725226ad38c3c95d3790a.zip
add the 'goldfish' target, useful for experimenting with virtual phone hardware (includes the emulator)
SVN-Revision: 16459
Diffstat (limited to 'target/linux/goldfish/patches-2.6.30/0056-mm-Check-if-any-page-in-a-pageblock-is-reserved-bef.patch')
-rw-r--r--target/linux/goldfish/patches-2.6.30/0056-mm-Check-if-any-page-in-a-pageblock-is-reserved-bef.patch45
1 files changed, 45 insertions, 0 deletions
diff --git a/target/linux/goldfish/patches-2.6.30/0056-mm-Check-if-any-page-in-a-pageblock-is-reserved-bef.patch b/target/linux/goldfish/patches-2.6.30/0056-mm-Check-if-any-page-in-a-pageblock-is-reserved-bef.patch
new file mode 100644
index 0000000000..63a9bcd492
--- /dev/null
+++ b/target/linux/goldfish/patches-2.6.30/0056-mm-Check-if-any-page-in-a-pageblock-is-reserved-bef.patch
@@ -0,0 +1,45 @@
+From a4eb204a8029320c2dd748daf4f51fd48d337c3d Mon Sep 17 00:00:00 2001
+From: =?utf-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= <arve@android.com>
+Date: Wed, 18 Mar 2009 17:27:31 -0700
+Subject: [PATCH 056/134] mm: Check if any page in a pageblock is reserved before marking it MIGRATE_RESERVE
+
+This fixes a problem where the first pageblock got marked MIGRATE_RESERVE even
+though it only had a few free pages. This in turn caused no contiguous memory
+to be reserved and frequent kswapd wakeups that emptied the caches to get more
+contiguous memory.
+---
+ mm/page_alloc.c | 16 +++++++++++++++-
+ 1 files changed, 15 insertions(+), 1 deletions(-)
+
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -2545,6 +2545,20 @@ static inline unsigned long wait_table_b
+ #define LONG_ALIGN(x) (((x)+(sizeof(long))-1)&~((sizeof(long))-1))
+
+ /*
++ * Check if a pageblock contains reserved pages
++ */
++static int pageblock_is_reserved(unsigned long start_pfn)
++{
++ unsigned long end_pfn = start_pfn + pageblock_nr_pages;
++ unsigned long pfn;
++
++ for (pfn = start_pfn; pfn < end_pfn; pfn++)
++ if (PageReserved(pfn_to_page(pfn)))
++ return 1;
++ return 0;
++}
++
++/*
+ * Mark a number of pageblocks as MIGRATE_RESERVE. The number
+ * of blocks reserved is based on zone->pages_min. The memory within the
+ * reserve will tend to store contiguous free pages. Setting min_free_kbytes
+@@ -2573,7 +2587,7 @@ static void setup_zone_migrate_reserve(s
+ continue;
+
+ /* Blocks with reserved pages will never free, skip them. */
+- if (PageReserved(page))
++ if (pageblock_is_reserved(pfn))
+ continue;
+
+ block_migratetype = get_pageblock_migratetype(page);