aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorDavid Rientjes <rientjes@google.com>2009-01-06 17:39:31 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-01-06 18:59:03 -0500
commit2da02997e08d3efe8174c7a47696e6f7cbe69ba9 (patch)
tree2e52d9346c52dda83dc8cc9626cbe302e026ad9a /include
parent364aeb2849789b51bf4b9af2ddd02fee7285c54e (diff)
mm: add dirty_background_bytes and dirty_bytes sysctls
This change introduces two new sysctls to /proc/sys/vm: dirty_background_bytes and dirty_bytes. dirty_background_bytes is the counterpart to dirty_background_ratio and dirty_bytes is the counterpart to dirty_ratio. With growing memory capacities of individual machines, it's no longer sufficient to specify dirty thresholds as a percentage of the amount of dirtyable memory over the entire system. dirty_background_bytes and dirty_bytes specify quantities of memory, in bytes, that represent the dirty limits for the entire system. If either of these values is set, its value represents the amount of dirty memory that is needed to commence either background or direct writeback. When a `bytes' or `ratio' file is written, its counterpart becomes a function of the written value. For example, if dirty_bytes is written to be 8096, 8K of memory is required to commence direct writeback. dirty_ratio is then functionally equivalent to 8K / the amount of dirtyable memory: dirtyable_memory = free pages + mapped pages + file cache dirty_background_bytes = dirty_background_ratio * dirtyable_memory -or- dirty_background_ratio = dirty_background_bytes / dirtyable_memory AND dirty_bytes = dirty_ratio * dirtyable_memory -or- dirty_ratio = dirty_bytes / dirtyable_memory Only one of dirty_background_bytes and dirty_background_ratio may be specified at a time, and only one of dirty_bytes and dirty_ratio may be specified. When one sysctl is written, the other appears as 0 when read. The `bytes' files operate on a page size granularity since dirty limits are compared with ZVC values, which are in page units. Prior to this change, the minimum dirty_ratio was 5 as implemented by get_dirty_limits() although /proc/sys/vm/dirty_ratio would show any user written value between 0 and 100. This restriction is maintained, but dirty_bytes has a lower limit of only one page. Also prior to this change, the dirty_background_ratio could not equal or exceed dirty_ratio. This restriction is maintained in addition to restricting dirty_background_bytes. If either background threshold equals or exceeds that of the dirty threshold, it is implicitly set to half the dirty threshold. Acked-by: Peter Zijlstra <peterz@infradead.org> Cc: Dave Chinner <david@fromorbit.com> Cc: Christoph Lameter <cl@linux-foundation.org> Signed-off-by: David Rientjes <rientjes@google.com> Cc: Andrea Righi <righi.andrea@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include')
-rw-r--r--include/linux/writeback.h11
1 files changed, 11 insertions, 0 deletions
diff --git a/include/linux/writeback.h b/include/linux/writeback.h
index 259e9ea58cab..bb28c975c1d7 100644
--- a/include/linux/writeback.h
+++ b/include/linux/writeback.h
@@ -107,7 +107,9 @@ void throttle_vm_writeout(gfp_t gfp_mask);
107 107
108/* These are exported to sysctl. */ 108/* These are exported to sysctl. */
109extern int dirty_background_ratio; 109extern int dirty_background_ratio;
110extern unsigned long dirty_background_bytes;
110extern int vm_dirty_ratio; 111extern int vm_dirty_ratio;
112extern unsigned long vm_dirty_bytes;
111extern int dirty_writeback_interval; 113extern int dirty_writeback_interval;
112extern int dirty_expire_interval; 114extern int dirty_expire_interval;
113extern int vm_highmem_is_dirtyable; 115extern int vm_highmem_is_dirtyable;
@@ -116,9 +118,18 @@ extern int laptop_mode;
116 118
117extern unsigned long determine_dirtyable_memory(void); 119extern unsigned long determine_dirtyable_memory(void);
118 120
121extern int dirty_background_ratio_handler(struct ctl_table *table, int write,
122 struct file *filp, void __user *buffer, size_t *lenp,
123 loff_t *ppos);
124extern int dirty_background_bytes_handler(struct ctl_table *table, int write,
125 struct file *filp, void __user *buffer, size_t *lenp,
126 loff_t *ppos);
119extern int dirty_ratio_handler(struct ctl_table *table, int write, 127extern int dirty_ratio_handler(struct ctl_table *table, int write,
120 struct file *filp, void __user *buffer, size_t *lenp, 128 struct file *filp, void __user *buffer, size_t *lenp,
121 loff_t *ppos); 129 loff_t *ppos);
130extern int dirty_bytes_handler(struct ctl_table *table, int write,
131 struct file *filp, void __user *buffer, size_t *lenp,
132 loff_t *ppos);
122 133
123struct ctl_table; 134struct ctl_table;
124struct file; 135struct file;