On Wed, 5 Feb 2014 03:16:39 +0100, Andreas Rohner wrote: > This patch adds a flag, that enables the GC to skip the timeout in > certain situations. For example if the cleaning of some segments > was deferred to a later time, then no real progress has been > made. Apart from reading a few summary blocks, no data was read or > written to disk. In this situation it makes sense to skip the > normal timeout once and immediately try to clean the next set of > segments. > > Unfortunately it is not possible, to directly continue the cleaning > loop, because this would lead to an unresponsive GC process. > Therefore the timeout is simply set to 0 seconds. > > Signed-off-by: Andreas Rohner <andreas.rohner@xxxxxxx> > --- > sbin/cleanerd/cleanerd.c | 27 ++++++++++++++++----------- > 1 file changed, 16 insertions(+), 11 deletions(-) > > diff --git a/sbin/cleanerd/cleanerd.c b/sbin/cleanerd/cleanerd.c > index 1374e38..e1bd558 100644 > --- a/sbin/cleanerd/cleanerd.c > +++ b/sbin/cleanerd/cleanerd.c > @@ -167,6 +167,7 @@ struct nilfs_cleanerd { > int running; > int fallback; > int retry_cleaning; > + int no_timeout; Corresponding comment is missing for this one, too. > int shutdown; > long ncleansegs; > struct timeval cleaning_interval; > @@ -894,7 +895,7 @@ static int nilfs_cleanerd_recalc_interval(struct nilfs_cleanerd *cleanerd, > interval = nilfs_cleanerd_cleaning_interval(cleanerd); > /* timercmp() does not work for '>=' or '<='. */ > /* curr >= target */ > - if (!timercmp(&curr, &cleanerd->target, <)) { > + if (!timercmp(&curr, &cleanerd->target, <) || cleanerd->no_timeout) { > cleanerd->timeout.tv_sec = 0; > cleanerd->timeout.tv_usec = 0; > timeradd(&curr, interval, &cleanerd->target); > @@ -1395,6 +1396,7 @@ static int nilfs_cleanerd_clean_segments(struct nilfs_cleanerd *cleanerd, > "number: %m"); > goto out; > } > + cleanerd->no_timeout = 0; This one is needed for the else case of nilfs_cleanerd_clean_loop() ? if (ns > 0) { ret = nilfs_cleanerd_clean_segments( cleanerd, segnums, ns, sustat.ss_prot_seq, prottime, &ndone); if (ret < 0) return -1; } else { cleanerd->retry_cleaning = 0; + cleanerd->no_timeout = 0; } > > memset(&stat, 0, sizeof(stat)); > ret = nilfs_xreclaim_segment(cleanerd->nilfs, segnums, nsegs, 0, > @@ -1409,16 +1411,18 @@ static int nilfs_cleanerd_clean_segments(struct nilfs_cleanerd *cleanerd, > goto out; > } > > - if (stat.cleaned_segs > 0) { > - if (stat.deferred_segs > 0) { > - for (i = 0; i < stat.cleaned_segs; i++) > - syslog(LOG_DEBUG, "segment %llu deferred", > - (unsigned long long)segnums[i]); > - } else { > - for (i = 0; i < stat.cleaned_segs; i++) > - syslog(LOG_DEBUG, "segment %llu cleaned", > - (unsigned long long)segnums[i]); > - } > + if (stat.deferred_segs > 0) { > + for (i = 0; i < stat.cleaned_segs; i++) Should be stat.deferred_segs ? Looks like you took the meaning of stat.cleaned_segs differently. I meant stat.cleaned_segs is decreased if stat.deferred_segs > 0. So, the following relation will be fulfilled. cleaned_segs + deferred_segs + protected_segs == nsegs (number of requested segments) > + syslog(LOG_DEBUG, "segment %llu deferred", > + (unsigned long long)segnums[i]); > + nilfs_cleanerd_progress(cleanerd, stat.cleaned_segs); > + cleanerd->fallback = 0; > + cleanerd->retry_cleaning = 0; > + cleanerd->no_timeout = 1; So, I think this should be set only if stat.deferred_segs > 0 && stat.cleaned_segs == 0 Regards, Ryusuke Konishi > + } else if (stat.cleaned_segs > 0) { > + for (i = 0; i < stat.cleaned_segs; i++) > + syslog(LOG_DEBUG, "segment %llu cleaned", > + (unsigned long long)segnums[i]); > nilfs_cleanerd_progress(cleanerd, stat.cleaned_segs); > cleanerd->fallback = 0; > cleanerd->retry_cleaning = 0; > @@ -1475,6 +1479,7 @@ static int nilfs_cleanerd_clean_loop(struct nilfs_cleanerd *cleanerd) > cleanerd->running = 1; > cleanerd->fallback = 0; > cleanerd->retry_cleaning = 0; > + cleanerd->no_timeout = 0; > nilfs_cnoconv_reset(cleanerd->cnoconv); > nilfs_gc_logger = syslog; > > -- > 1.8.5.3 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-nilfs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-nilfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html