[PATCH] Represent dirty_*_centisecs as jiffies internally
authorBart Samwel <bart@samwel.tk>
Fri, 24 Mar 2006 11:15:48 +0000 (03:15 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Fri, 24 Mar 2006 15:33:20 +0000 (07:33 -0800)
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: Bart Samwel <bart@samwel.tk>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
include/linux/writeback.h
kernel/sysctl.c
mm/page-writeback.c

index beaef5c7a0eacaadfb0d2f590dbf75c498f81eb0..60956596149495d363dadc0b423412947ce39b02 100644 (file)
@@ -88,8 +88,8 @@ void throttle_vm_writeout(void);
 /* These are exported to sysctl. */
 extern int dirty_background_ratio;
 extern int vm_dirty_ratio;
-extern int dirty_writeback_centisecs;
-extern int dirty_expire_centisecs;
+extern int dirty_writeback_interval;
+extern int dirty_expire_interval;
 extern int block_dump;
 extern int laptop_mode;
 
index 32b48e8ee36e8aaa6334a3979317eaf2b8848725..817ba25517ebe71ad0166735d8b8bed3a36a375c 100644 (file)
@@ -742,18 +742,18 @@ static ctl_table vm_table[] = {
        {
                .ctl_name       = VM_DIRTY_WB_CS,
                .procname       = "dirty_writeback_centisecs",
-               .data           = &dirty_writeback_centisecs,
-               .maxlen         = sizeof(dirty_writeback_centisecs),
+               .data           = &dirty_writeback_interval,
+               .maxlen         = sizeof(dirty_writeback_interval),
                .mode           = 0644,
                .proc_handler   = &dirty_writeback_centisecs_handler,
        },
        {
                .ctl_name       = VM_DIRTY_EXPIRE_CS,
                .procname       = "dirty_expire_centisecs",
-               .data           = &dirty_expire_centisecs,
-               .maxlen         = sizeof(dirty_expire_centisecs),
+               .data           = &dirty_expire_interval,
+               .maxlen         = sizeof(dirty_expire_interval),
                .mode           = 0644,
-               .proc_handler   = &proc_dointvec,
+               .proc_handler   = &proc_dointvec_userhz_jiffies,
        },
        {
                .ctl_name       = VM_NR_PDFLUSH_THREADS,
index 945559fb63d208bb5c10543aece7b117e84d3e97..e79107991d20e59fb1482852cd7513ff0da6b89d 100644 (file)
@@ -75,12 +75,12 @@ int vm_dirty_ratio = 40;
  * The interval between `kupdate'-style writebacks, in centiseconds
  * (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
  */
-int dirty_expire_centisecs = 30 * 100;
+int dirty_expire_interval = 30 * HZ;
 
 /*
  * 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);
  * just walks the superblock inode list, writing back any inodes which are
  * older than a specific point in time.
  *
- * Try to run once per dirty_writeback_centisecs.  But if a writeback event
- * takes longer than a dirty_writeback_centisecs interval, then leave a
+ * Try to run once per dirty_writeback_interval.  But if a writeback event
+ * takes longer than a dirty_writeback_interval interval, then leave a
  * one-second gap.
  *
  * 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)
        sync_supers();
 
        get_writeback_state(&wbs);
-       oldest_jif = jiffies - (dirty_expire_centisecs * HZ) / 100;
+       oldest_jif = jiffies - dirty_expire_interval;
        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 +
                        (inodes_stat.nr_inodes - inodes_stat.nr_unused);
        while (nr_to_write > 0) {
@@ -425,7 +425,7 @@ static void wb_kupdate(unsigned long arg)
        }
        if (time_before(next_jif, jiffies + HZ))
                next_jif = jiffies + HZ;
-       if (dirty_writeback_centisecs)
+       if (dirty_writeback_interval)
                mod_timer(&wb_timer, next_jif);
 }
 
@@ -435,11 +435,11 @@ static void wb_kupdate(unsigned long arg)
 int dirty_writeback_centisecs_handler(ctl_table *table, int write,
                struct file *file, void __user *buffer, size_t *length, loff_t *ppos)
 {
-       proc_dointvec(table, write, file, buffer, length, ppos);
-       if (dirty_writeback_centisecs) {
+       proc_dointvec_userhz_jiffies(table, write, file, buffer, length, ppos);
+       if (dirty_writeback_interval) {
                mod_timer(&wb_timer,
-                       jiffies + (dirty_writeback_centisecs * HZ) / 100);
-       } else {
+                       jiffies + dirty_writeback_interval);
+               } else {
                del_timer(&wb_timer);
        }
        return 0;
@@ -544,7 +544,7 @@ void __init page_writeback_init(void)
                if (vm_dirty_ratio <= 0)
                        vm_dirty_ratio = 1;
        }
-       mod_timer(&wb_timer, jiffies + (dirty_writeback_centisecs * HZ) / 100);
+       mod_timer(&wb_timer, jiffies + dirty_writeback_interval);
        set_ratelimit();
        register_cpu_notifier(&ratelimit_nb);
 }