aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mm/page-writeback.c93
1 files changed, 47 insertions, 46 deletions
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 9ab6de82d8e..433fa990fe8 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -146,6 +146,7 @@ static struct prop_descriptor vm_completions;
146 * We make sure that the background writeout level is below the adjusted 146 * We make sure that the background writeout level is below the adjusted
147 * clamping level. 147 * clamping level.
148 */ 148 */
149
149static unsigned long highmem_dirtyable_memory(unsigned long total) 150static unsigned long highmem_dirtyable_memory(unsigned long total)
150{ 151{
151#ifdef CONFIG_HIGHMEM 152#ifdef CONFIG_HIGHMEM
@@ -172,12 +173,12 @@ static unsigned long highmem_dirtyable_memory(unsigned long total)
172} 173}
173 174
174/** 175/**
175 * determine_dirtyable_memory - amount of memory that may be used 176 * global_dirtyable_memory - number of globally dirtyable pages
176 * 177 *
177 * Returns the numebr of pages that can currently be freed and used 178 * Returns the global number of pages potentially available for dirty
178 * by the kernel for direct mappings. 179 * page cache. This is the base value for the global dirty limits.
179 */ 180 */
180static unsigned long determine_dirtyable_memory(void) 181unsigned long global_dirtyable_memory(void)
181{ 182{
182 unsigned long x; 183 unsigned long x;
183 184
@@ -191,6 +192,47 @@ static unsigned long determine_dirtyable_memory(void)
191} 192}
192 193
193/* 194/*
195 * global_dirty_limits - background-writeback and dirty-throttling thresholds
196 *
197 * Calculate the dirty thresholds based on sysctl parameters
198 * - vm.dirty_background_ratio or vm.dirty_background_bytes
199 * - vm.dirty_ratio or vm.dirty_bytes
200 * The dirty limits will be lifted by 1/4 for PF_LESS_THROTTLE (ie. nfsd) and
201 * real-time tasks.
202 */
203void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty)
204{
205 unsigned long background;
206 unsigned long dirty;
207 unsigned long uninitialized_var(available_memory);
208 struct task_struct *tsk;
209
210 if (!vm_dirty_bytes || !dirty_background_bytes)
211 available_memory = global_dirtyable_memory();
212
213 if (vm_dirty_bytes)
214 dirty = DIV_ROUND_UP(vm_dirty_bytes, PAGE_SIZE);
215 else
216 dirty = (vm_dirty_ratio * available_memory) / 100;
217
218 if (dirty_background_bytes)
219 background = DIV_ROUND_UP(dirty_background_bytes, PAGE_SIZE);
220 else
221 background = (dirty_background_ratio * available_memory) / 100;
222
223 if (background >= dirty)
224 background = dirty / 2;
225 tsk = current;
226 if (tsk->flags & PF_LESS_THROTTLE || rt_task(tsk)) {
227 background += background / 4;
228 dirty += dirty / 4;
229 }
230 *pbackground = background;
231 *pdirty = dirty;
232 trace_global_dirty_state(background, dirty);
233}
234
235/*
194 * couple the period to the dirty_ratio: 236 * couple the period to the dirty_ratio:
195 * 237 *
196 * period/2 ~ roundup_pow_of_two(dirty limit) 238 * period/2 ~ roundup_pow_of_two(dirty limit)
@@ -202,7 +244,7 @@ static int calc_period_shift(void)
202 if (vm_dirty_bytes) 244 if (vm_dirty_bytes)
203 dirty_total = vm_dirty_bytes / PAGE_SIZE; 245 dirty_total = vm_dirty_bytes / PAGE_SIZE;
204 else 246 else
205 dirty_total = (vm_dirty_ratio * determine_dirtyable_memory()) / 247 dirty_total = (vm_dirty_ratio * global_dirtyable_memory()) /
206 100; 248 100;
207 return 2 + ilog2(dirty_total - 1); 249 return 2 + ilog2(dirty_total - 1);
208} 250}
@@ -362,47 +404,6 @@ static unsigned long hard_dirty_limit(unsigned long thresh)
362 return max(thresh, global_dirty_limit); 404 return max(thresh, global_dirty_limit);
363} 405}
364 406
365/*
366 * global_dirty_limits - background-writeback and dirty-throttling thresholds
367 *
368 * Calculate the dirty thresholds based on sysctl parameters
369 * - vm.dirty_background_ratio or vm.dirty_background_bytes
370 * - vm.dirty_ratio or vm.dirty_bytes
371 * The dirty limits will be lifted by 1/4 for PF_LESS_THROTTLE (ie. nfsd) and
372 * real-time tasks.
373 */
374void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty)
375{
376 unsigned long background;
377 unsigned long dirty;
378 unsigned long uninitialized_var(available_memory);
379 struct task_struct *tsk;
380
381 if (!vm_dirty_bytes || !dirty_background_bytes)
382 available_memory = determine_dirtyable_memory();
383
384 if (vm_dirty_bytes)
385 dirty = DIV_ROUND_UP(vm_dirty_bytes, PAGE_SIZE);
386 else
387 dirty = (vm_dirty_ratio * available_memory) / 100;
388
389 if (dirty_background_bytes)
390 background = DIV_ROUND_UP(dirty_background_bytes, PAGE_SIZE);
391 else
392 background = (dirty_background_ratio * available_memory) / 100;
393
394 if (background >= dirty)
395 background = dirty / 2;
396 tsk = current;
397 if (tsk->flags & PF_LESS_THROTTLE || rt_task(tsk)) {
398 background += background / 4;
399 dirty += dirty / 4;
400 }
401 *pbackground = background;
402 *pdirty = dirty;
403 trace_global_dirty_state(background, dirty);
404}
405
406/** 407/**
407 * bdi_dirty_limit - @bdi's share of dirty throttling threshold 408 * bdi_dirty_limit - @bdi's share of dirty throttling threshold
408 * @bdi: the backing_dev_info to query 409 * @bdi: the backing_dev_info to query