diff options
| -rw-r--r-- | include/linux/backing-dev.h | 1 | ||||
| -rw-r--r-- | mm/backing-dev.c | 15 | ||||
| -rw-r--r-- | mm/page-writeback.c | 1 | 
3 files changed, 12 insertions, 5 deletions
diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h index ff8bac63213..e6e0cb5437e 100644 --- a/include/linux/backing-dev.h +++ b/include/linux/backing-dev.h @@ -109,6 +109,7 @@ void bdi_start_writeback(struct backing_dev_info *bdi, struct super_block *sb,  				long nr_pages, int sb_locked);  int bdi_writeback_task(struct bdi_writeback *wb);  int bdi_has_dirty_io(struct backing_dev_info *bdi); +void bdi_arm_supers_timer(void);  extern spinlock_t bdi_lock;  extern struct list_head bdi_list; diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 707d0dc6da0..660a87a2251 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -48,7 +48,6 @@ static struct timer_list sync_supers_timer;  static int bdi_sync_supers(void *);  static void sync_supers_timer_fn(unsigned long); -static void arm_supers_timer(void);  static void bdi_add_default_flusher_task(struct backing_dev_info *bdi); @@ -252,7 +251,7 @@ static int __init default_bdi_init(void)  	init_timer(&sync_supers_timer);  	setup_timer(&sync_supers_timer, sync_supers_timer_fn, 0); -	arm_supers_timer(); +	bdi_arm_supers_timer();  	err = bdi_init(&default_backing_dev_info);  	if (!err) @@ -374,10 +373,13 @@ static int bdi_sync_supers(void *unused)  	return 0;  } -static void arm_supers_timer(void) +void bdi_arm_supers_timer(void)  {  	unsigned long next; +	if (!dirty_writeback_interval) +		return; +  	next = msecs_to_jiffies(dirty_writeback_interval * 10) + jiffies;  	mod_timer(&sync_supers_timer, round_jiffies_up(next));  } @@ -385,7 +387,7 @@ static void arm_supers_timer(void)  static void sync_supers_timer_fn(unsigned long unused)  {  	wake_up_process(sync_supers_tsk); -	arm_supers_timer(); +	bdi_arm_supers_timer();  }  static int bdi_forker_task(void *ptr) @@ -428,7 +430,10 @@ static int bdi_forker_task(void *ptr)  			spin_unlock_bh(&bdi_lock);  			wait = msecs_to_jiffies(dirty_writeback_interval * 10); -			schedule_timeout(wait); +			if (wait) +				schedule_timeout(wait); +			else +				schedule();  			try_to_freeze();  			continue;  		} diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 53b2fcf2d28..0d7bbe85955 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -690,6 +690,7 @@ int dirty_writeback_centisecs_handler(ctl_table *table, int write,  	void __user *buffer, size_t *length, loff_t *ppos)  {  	proc_dointvec(table, write, buffer, length, ppos); +	bdi_arm_supers_timer();  	return 0;  }  |