Skip to content

Commit 704503d

Browse files
Alexey Dobriyantorvalds
authored andcommitted
mm: fix proc_dointvec_userhz_jiffies "breakage"
Addresses http://bugzilla.kernel.org/show_bug.cgi?id=9838 On i386, HZ=1000, jiffies_to_clock_t() converts time in a somewhat strange way from the user's point of view: # echo 500 >/proc/sys/vm/dirty_writeback_centisecs # cat /proc/sys/vm/dirty_writeback_centisecs 499 So, we have 5000 jiffies converted to only 499 clock ticks and reported back. TICK_NSEC = 999848 ACTHZ = 256039 Keeping in-kernel variable in units passed from userspace will fix issue of course, but this probably won't be right for every sysctl. [[email protected]: coding-style fixes] Signed-off-by: Alexey Dobriyan <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Nick Piggin <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 6a11f75 commit 704503d

File tree

3 files changed

+14
-12
lines changed

3 files changed

+14
-12
lines changed

include/linux/writeback.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ extern int dirty_background_ratio;
109109
extern unsigned long dirty_background_bytes;
110110
extern int vm_dirty_ratio;
111111
extern unsigned long vm_dirty_bytes;
112-
extern int dirty_writeback_interval;
113-
extern int dirty_expire_interval;
112+
extern unsigned int dirty_writeback_interval;
113+
extern unsigned int dirty_expire_interval;
114114
extern int vm_highmem_is_dirtyable;
115115
extern int block_dump;
116116
extern int laptop_mode;

kernel/sysctl.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1010,7 +1010,7 @@ static struct ctl_table vm_table[] = {
10101010
.data = &dirty_expire_interval,
10111011
.maxlen = sizeof(dirty_expire_interval),
10121012
.mode = 0644,
1013-
.proc_handler = &proc_dointvec_userhz_jiffies,
1013+
.proc_handler = &proc_dointvec,
10141014
},
10151015
{
10161016
.ctl_name = VM_NR_PDFLUSH_THREADS,

mm/page-writeback.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,14 @@ int vm_dirty_ratio = 20;
9292
unsigned long vm_dirty_bytes;
9393

9494
/*
95-
* The interval between `kupdate'-style writebacks, in jiffies
95+
* The interval between `kupdate'-style writebacks
9696
*/
97-
int dirty_writeback_interval = 5 * HZ;
97+
unsigned int dirty_writeback_interval = 5 * 100; /* sentiseconds */
9898

9999
/*
100-
* The longest number of jiffies for which data is allowed to remain dirty
100+
* The longest time for which data is allowed to remain dirty
101101
*/
102-
int dirty_expire_interval = 30 * HZ;
102+
unsigned int dirty_expire_interval = 30 * 100; /* sentiseconds */
103103

104104
/*
105105
* Flag that makes the machine dump writes/reads and block dirtyings.
@@ -770,9 +770,9 @@ static void wb_kupdate(unsigned long arg)
770770

771771
sync_supers();
772772

773-
oldest_jif = jiffies - dirty_expire_interval;
773+
oldest_jif = jiffies - msecs_to_jiffies(dirty_expire_interval);
774774
start_jif = jiffies;
775-
next_jif = start_jif + dirty_writeback_interval;
775+
next_jif = start_jif + msecs_to_jiffies(dirty_writeback_interval * 10);
776776
nr_to_write = global_page_state(NR_FILE_DIRTY) +
777777
global_page_state(NR_UNSTABLE_NFS) +
778778
(inodes_stat.nr_inodes - inodes_stat.nr_unused);
@@ -801,9 +801,10 @@ static void wb_kupdate(unsigned long arg)
801801
int dirty_writeback_centisecs_handler(ctl_table *table, int write,
802802
struct file *file, void __user *buffer, size_t *length, loff_t *ppos)
803803
{
804-
proc_dointvec_userhz_jiffies(table, write, file, buffer, length, ppos);
804+
proc_dointvec(table, write, file, buffer, length, ppos);
805805
if (dirty_writeback_interval)
806-
mod_timer(&wb_timer, jiffies + dirty_writeback_interval);
806+
mod_timer(&wb_timer, jiffies +
807+
msecs_to_jiffies(dirty_writeback_interval * 10));
807808
else
808809
del_timer(&wb_timer);
809810
return 0;
@@ -905,7 +906,8 @@ void __init page_writeback_init(void)
905906
{
906907
int shift;
907908

908-
mod_timer(&wb_timer, jiffies + dirty_writeback_interval);
909+
mod_timer(&wb_timer,
910+
jiffies + msecs_to_jiffies(dirty_writeback_interval * 10));
909911
writeback_set_ratelimit();
910912
register_cpu_notifier(&ratelimit_nb);
911913

0 commit comments

Comments
 (0)