On Wed, Jun 27, 2007 at 05:25:45PM +0200, Patrick McHardy wrote: ... > Additionally there are a few more related problems that seem to be > relicts from the timer when the estimator was qdisc specific and > could rely on the rtnl or dev->qdisc_lock: > > - the check whether the list is empty and a timer needs to be started > when adding a new estimator doesn't take the lock, so it races > against concurrent additions, which can result in the timer beeing > added twice or getting reinitialized after being added. > > - the new estimator's next pointer is also set without holding the > lock, again racing against concurrent additions with possible > list corruption as a result. > > - the timer deletion when killing an estimator is also not under > the lock and races against timer arming when adding a new estimator. > > Fix by holding the lock around the entire list addition and initial > timer arming. Removal is not done explicitly anymore, instead the > timer function only rearms the timer when there are still estimators > present. ... > @@ -202,7 +201,6 @@ void gen_kill_estimator(struct gnet_stats_basic *bstats, > struct gen_estimator *est, **pest; > > for (idx=0; idx <= EST_MAX_INTERVAL; idx++) { > - int killed = 0; > pest = &elist[idx].list; > while ((est=*pest) != NULL) {
So, maybe this list walking here needs some locking too? Jarek P. - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html