Annotation of /trunk/kernel26-alx/patches-2.6.17-r6/0020-2.6.17-mm-lots_watermark.diff
Parent Directory | Revision Log
Revision 199 -
(hide annotations)
(download)
Fri May 18 11:04:36 2007 UTC (17 years, 4 months ago) by niro
File size: 4582 byte(s)
Fri May 18 11:04:36 2007 UTC (17 years, 4 months ago) by niro
File size: 4582 byte(s)
-import
1 | niro | 199 | The vm currently performs scanning when allocating ram once the watermarks |
2 | are below the pages_low value and tries to restore them to the pages_high | ||
3 | watermark. The disadvantage of this is that we are scanning most aggresssively | ||
4 | at the same time we are allocating ram regardless of the stress the vm is | ||
5 | under. Add a pages_lots watermark and allow the watermark to be relaxed | ||
6 | according to the stress the vm is at the time (according to the priority | ||
7 | value). Thus we have more in reserve next time we are allocating ram and end | ||
8 | up scanning less aggresssively. Note the actual pages_lots isn't used directly | ||
9 | in this code. | ||
10 | |||
11 | Signed-off-by: Con Kolivas <kernel@kolivas.org> | ||
12 | |||
13 | include/linux/mmzone.h | 2 +- | ||
14 | mm/page_alloc.c | 5 +++++ | ||
15 | mm/vmscan.c | 18 +++++++++++++++--- | ||
16 | 3 files changed, 21 insertions(+), 4 deletions(-) | ||
17 | |||
18 | Index: linux-ck-dev/include/linux/mmzone.h | ||
19 | =================================================================== | ||
20 | --- linux-ck-dev.orig/include/linux/mmzone.h 2006-06-18 15:20:12.000000000 +1000 | ||
21 | +++ linux-ck-dev/include/linux/mmzone.h 2006-06-18 15:25:00.000000000 +1000 | ||
22 | @@ -123,7 +123,7 @@ struct per_cpu_pageset { | ||
23 | struct zone { | ||
24 | /* Fields commonly accessed by the page allocator */ | ||
25 | unsigned long free_pages; | ||
26 | - unsigned long pages_min, pages_low, pages_high; | ||
27 | + unsigned long pages_min, pages_low, pages_high, pages_lots; | ||
28 | /* | ||
29 | * We don't know if the memory that we're going to allocate will be freeable | ||
30 | * or/and it will be released eventually, so to avoid totally wasting several | ||
31 | Index: linux-ck-dev/mm/page_alloc.c | ||
32 | =================================================================== | ||
33 | --- linux-ck-dev.orig/mm/page_alloc.c 2006-06-18 15:20:12.000000000 +1000 | ||
34 | +++ linux-ck-dev/mm/page_alloc.c 2006-06-18 15:25:00.000000000 +1000 | ||
35 | @@ -1461,6 +1461,7 @@ void show_free_areas(void) | ||
36 | " min:%lukB" | ||
37 | " low:%lukB" | ||
38 | " high:%lukB" | ||
39 | + " lots:%lukB" | ||
40 | " active:%lukB" | ||
41 | " inactive:%lukB" | ||
42 | " present:%lukB" | ||
43 | @@ -1472,6 +1473,7 @@ void show_free_areas(void) | ||
44 | K(zone->pages_min), | ||
45 | K(zone->pages_low), | ||
46 | K(zone->pages_high), | ||
47 | + K(zone->pages_lots), | ||
48 | K(zone->nr_active), | ||
49 | K(zone->nr_inactive), | ||
50 | K(zone->present_pages), | ||
51 | @@ -2261,6 +2263,7 @@ static int zoneinfo_show(struct seq_file | ||
52 | "\n min %lu" | ||
53 | "\n low %lu" | ||
54 | "\n high %lu" | ||
55 | + "\n lots %lu" | ||
56 | "\n active %lu" | ||
57 | "\n inactive %lu" | ||
58 | "\n scanned %lu (a: %lu i: %lu)" | ||
59 | @@ -2270,6 +2273,7 @@ static int zoneinfo_show(struct seq_file | ||
60 | zone->pages_min, | ||
61 | zone->pages_low, | ||
62 | zone->pages_high, | ||
63 | + zone->pages_lots, | ||
64 | zone->nr_active, | ||
65 | zone->nr_inactive, | ||
66 | zone->pages_scanned, | ||
67 | @@ -2609,6 +2613,7 @@ void setup_per_zone_pages_min(void) | ||
68 | |||
69 | zone->pages_low = zone->pages_min + (tmp >> 2); | ||
70 | zone->pages_high = zone->pages_min + (tmp >> 1); | ||
71 | + zone->pages_lots = zone->pages_min + tmp; | ||
72 | spin_unlock_irqrestore(&zone->lru_lock, flags); | ||
73 | } | ||
74 | |||
75 | Index: linux-ck-dev/mm/vmscan.c | ||
76 | =================================================================== | ||
77 | --- linux-ck-dev.orig/mm/vmscan.c 2006-06-18 15:24:58.000000000 +1000 | ||
78 | +++ linux-ck-dev/mm/vmscan.c 2006-06-18 15:25:00.000000000 +1000 | ||
79 | @@ -1095,6 +1095,7 @@ loop_again: | ||
80 | */ | ||
81 | for (i = pgdat->nr_zones - 1; i >= 0; i--) { | ||
82 | struct zone *zone = pgdat->node_zones + i; | ||
83 | + unsigned long watermark; | ||
84 | |||
85 | if (!populated_zone(zone)) | ||
86 | continue; | ||
87 | @@ -1102,11 +1103,18 @@ loop_again: | ||
88 | if (zone->all_unreclaimable && priority != DEF_PRIORITY) | ||
89 | continue; | ||
90 | |||
91 | - if (!zone_watermark_ok(zone, order, zone->pages_high, | ||
92 | - 0, 0)) { | ||
93 | + /* | ||
94 | + * The watermark is relaxed depending on the | ||
95 | + * level of "priority" till it drops to | ||
96 | + * pages_high. | ||
97 | + */ | ||
98 | + watermark = zone->pages_high + (zone->pages_high * | ||
99 | + priority / DEF_PRIORITY); | ||
100 | + if (!zone_watermark_ok(zone, order, watermark, 0, 0)) { | ||
101 | end_zone = i; | ||
102 | goto scan; | ||
103 | } | ||
104 | + | ||
105 | } | ||
106 | goto out; | ||
107 | scan: | ||
108 | @@ -1128,6 +1136,7 @@ scan: | ||
109 | for (i = 0; i <= end_zone; i++) { | ||
110 | struct zone *zone = pgdat->node_zones + i; | ||
111 | int nr_slab; | ||
112 | + unsigned long watermark; | ||
113 | |||
114 | if (!populated_zone(zone)) | ||
115 | continue; | ||
116 | @@ -1135,7 +1144,10 @@ scan: | ||
117 | if (zone->all_unreclaimable && priority != DEF_PRIORITY) | ||
118 | continue; | ||
119 | |||
120 | - if (!zone_watermark_ok(zone, order, zone->pages_high, | ||
121 | + watermark = zone->pages_high + (zone->pages_high * | ||
122 | + priority / DEF_PRIORITY); | ||
123 | + | ||
124 | + if (!zone_watermark_ok(zone, order, watermark, | ||
125 | end_zone, 0)) | ||
126 | all_zones_ok = 0; | ||
127 | zone->temp_priority = priority; |