> - pause = (HZ * pages_dirtied) / (task_ratelimit | 1); > + period = (HZ * pages_dirtied) / (task_ratelimit | 1); > + pause = current->dirty_paused_when + period - now; > + /* > + * For less than 1s think time (ext3/4 may block the dirtier > + * for up to 800ms from time to time on 1-HDD; so does xfs, > + * however at much less frequency), try to compensate it in > + * future periods by updating the virtual time; otherwise just > + * do a reset, as it may be a light dirtier. > + */ > + if (unlikely(pause <= 0)) { > + if (pause < -HZ) { > + current->dirty_paused_when = now; > + current->nr_dirtied = 0; > + } else if (period) { > + current->dirty_paused_when += period; > + current->nr_dirtied = 0; > + } > + pause = 1; /* avoid resetting nr_dirtied_pause below */ Note: the above comment is only effective with the planned max pause time adaption patch. Thanks, Fengguang > + break; > + } > pause = min(pause, (long)MAX_PAUSE); > > pause: > __set_current_state(TASK_UNINTERRUPTIBLE); > io_schedule_timeout(pause); > > + current->dirty_paused_when = now + pause; > + current->nr_dirtied = 0; > + > dirty_thresh = hard_dirty_limit(dirty_thresh); > /* > * max-pause area. If dirty exceeded but still within this > @@ -1017,7 +1046,6 @@ pause: > if (!dirty_exceeded && bdi->dirty_exceeded) > bdi->dirty_exceeded = 0; > > - current->nr_dirtied = 0; > current->nr_dirtied_pause = dirty_poll_interval(nr_dirty, dirty_thresh); > > if (writeback_in_progress(bdi)) > --- linux-next.orig/kernel/fork.c 2011-08-16 08:50:41.000000000 +0800 > +++ linux-next/kernel/fork.c 2011-08-16 08:54:13.000000000 +0800 > @@ -1303,6 +1303,7 @@ static struct task_struct *copy_process( > > p->nr_dirtied = 0; > p->nr_dirtied_pause = 128 >> (PAGE_SHIFT - 10); > + p->dirty_paused_when = 0; > > /* > * Ok, make it visible to the rest of the system. > -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html