Commit f6ef9438 authored by Bart Samwel's avatar Bart Samwel Committed by Linus Torvalds

[PATCH] Represent dirty_*_centisecs as jiffies internally

Make that the internal values for:

/proc/sys/vm/dirty_writeback_centisecs
/proc/sys/vm/dirty_expire_centisecs

are stored as jiffies instead of centiseconds.  Let the sysctl interface do
the conversions with full precision using clock_t_to_jiffies, instead of
doing overflow-sensitive on-the-fly conversions every time the values are
used.

Cons: apparent precision loss if HZ is not a multiple of 100, because of
conversion back and forth.  This is a common problem for all sysctl values
that use proc_dointvec_userhz_jiffies.  (There is only one other in-tree
use, in net/core/neighbour.c.)
Signed-off-by: default avatarBart Samwel <bart@samwel.tk>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 36f57413
...@@ -88,8 +88,8 @@ void throttle_vm_writeout(void); ...@@ -88,8 +88,8 @@ void throttle_vm_writeout(void);
/* These are exported to sysctl. */ /* These are exported to sysctl. */
extern int dirty_background_ratio; extern int dirty_background_ratio;
extern int vm_dirty_ratio; extern int vm_dirty_ratio;
extern int dirty_writeback_centisecs; extern int dirty_writeback_interval;
extern int dirty_expire_centisecs; extern int dirty_expire_interval;
extern int block_dump; extern int block_dump;
extern int laptop_mode; extern int laptop_mode;
......
...@@ -742,18 +742,18 @@ static ctl_table vm_table[] = { ...@@ -742,18 +742,18 @@ static ctl_table vm_table[] = {
{ {
.ctl_name = VM_DIRTY_WB_CS, .ctl_name = VM_DIRTY_WB_CS,
.procname = "dirty_writeback_centisecs", .procname = "dirty_writeback_centisecs",
.data = &dirty_writeback_centisecs, .data = &dirty_writeback_interval,
.maxlen = sizeof(dirty_writeback_centisecs), .maxlen = sizeof(dirty_writeback_interval),
.mode = 0644, .mode = 0644,
.proc_handler = &dirty_writeback_centisecs_handler, .proc_handler = &dirty_writeback_centisecs_handler,
}, },
{ {
.ctl_name = VM_DIRTY_EXPIRE_CS, .ctl_name = VM_DIRTY_EXPIRE_CS,
.procname = "dirty_expire_centisecs", .procname = "dirty_expire_centisecs",
.data = &dirty_expire_centisecs, .data = &dirty_expire_interval,
.maxlen = sizeof(dirty_expire_centisecs), .maxlen = sizeof(dirty_expire_interval),
.mode = 0644, .mode = 0644,
.proc_handler = &proc_dointvec, .proc_handler = &proc_dointvec_userhz_jiffies,
}, },
{ {
.ctl_name = VM_NR_PDFLUSH_THREADS, .ctl_name = VM_NR_PDFLUSH_THREADS,
......
...@@ -75,12 +75,12 @@ int vm_dirty_ratio = 40; ...@@ -75,12 +75,12 @@ int vm_dirty_ratio = 40;
* The interval between `kupdate'-style writebacks, in centiseconds * The interval between `kupdate'-style writebacks, in centiseconds
* (hundredths of a second) * (hundredths of a second)
*/ */
int dirty_writeback_centisecs = 5 * 100; int dirty_writeback_interval = 5 * HZ;
/* /*
* The longest number of centiseconds for which data is allowed to remain dirty * The longest number of centiseconds for which data is allowed to remain dirty
*/ */
int dirty_expire_centisecs = 30 * 100; int dirty_expire_interval = 30 * HZ;
/* /*
* Flag that makes the machine dump writes/reads and block dirtyings. * Flag that makes the machine dump writes/reads and block dirtyings.
...@@ -380,8 +380,8 @@ static DEFINE_TIMER(laptop_mode_wb_timer, laptop_timer_fn, 0, 0); ...@@ -380,8 +380,8 @@ static DEFINE_TIMER(laptop_mode_wb_timer, laptop_timer_fn, 0, 0);
* just walks the superblock inode list, writing back any inodes which are * just walks the superblock inode list, writing back any inodes which are
* older than a specific point in time. * older than a specific point in time.
* *
* Try to run once per dirty_writeback_centisecs. But if a writeback event * Try to run once per dirty_writeback_interval. But if a writeback event
* takes longer than a dirty_writeback_centisecs interval, then leave a * takes longer than a dirty_writeback_interval interval, then leave a
* one-second gap. * one-second gap.
* *
* older_than_this takes precedence over nr_to_write. So we'll only write back * older_than_this takes precedence over nr_to_write. So we'll only write back
...@@ -406,9 +406,9 @@ static void wb_kupdate(unsigned long arg) ...@@ -406,9 +406,9 @@ static void wb_kupdate(unsigned long arg)
sync_supers(); sync_supers();
get_writeback_state(&wbs); get_writeback_state(&wbs);
oldest_jif = jiffies - (dirty_expire_centisecs * HZ) / 100; oldest_jif = jiffies - dirty_expire_interval;
start_jif = jiffies; start_jif = jiffies;
next_jif = start_jif + (dirty_writeback_centisecs * HZ) / 100; next_jif = start_jif + dirty_writeback_interval;
nr_to_write = wbs.nr_dirty + wbs.nr_unstable + nr_to_write = wbs.nr_dirty + wbs.nr_unstable +
(inodes_stat.nr_inodes - inodes_stat.nr_unused); (inodes_stat.nr_inodes - inodes_stat.nr_unused);
while (nr_to_write > 0) { while (nr_to_write > 0) {
...@@ -425,7 +425,7 @@ static void wb_kupdate(unsigned long arg) ...@@ -425,7 +425,7 @@ static void wb_kupdate(unsigned long arg)
} }
if (time_before(next_jif, jiffies + HZ)) if (time_before(next_jif, jiffies + HZ))
next_jif = jiffies + HZ; next_jif = jiffies + HZ;
if (dirty_writeback_centisecs) if (dirty_writeback_interval)
mod_timer(&wb_timer, next_jif); mod_timer(&wb_timer, next_jif);
} }
...@@ -435,11 +435,11 @@ static void wb_kupdate(unsigned long arg) ...@@ -435,11 +435,11 @@ static void wb_kupdate(unsigned long arg)
int dirty_writeback_centisecs_handler(ctl_table *table, int write, int dirty_writeback_centisecs_handler(ctl_table *table, int write,
struct file *file, void __user *buffer, size_t *length, loff_t *ppos) struct file *file, void __user *buffer, size_t *length, loff_t *ppos)
{ {
proc_dointvec(table, write, file, buffer, length, ppos); proc_dointvec_userhz_jiffies(table, write, file, buffer, length, ppos);
if (dirty_writeback_centisecs) { if (dirty_writeback_interval) {
mod_timer(&wb_timer, mod_timer(&wb_timer,
jiffies + (dirty_writeback_centisecs * HZ) / 100); jiffies + dirty_writeback_interval);
} else { } else {
del_timer(&wb_timer); del_timer(&wb_timer);
} }
return 0; return 0;
...@@ -544,7 +544,7 @@ void __init page_writeback_init(void) ...@@ -544,7 +544,7 @@ void __init page_writeback_init(void)
if (vm_dirty_ratio <= 0) if (vm_dirty_ratio <= 0)
vm_dirty_ratio = 1; vm_dirty_ratio = 1;
} }
mod_timer(&wb_timer, jiffies + (dirty_writeback_centisecs * HZ) / 100); mod_timer(&wb_timer, jiffies + dirty_writeback_interval);
set_ratelimit(); set_ratelimit();
register_cpu_notifier(&ratelimit_nb); register_cpu_notifier(&ratelimit_nb);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment