On Tuesday, December 08, 2015 12:29:05 PM Viresh Kumar wrote: > On 08-12-15, 01:39, Rafael J. Wysocki wrote: > > @@ -269,9 +259,6 @@ static void dbs_timer_handler(unsigned l > > { > > struct cpu_dbs_info *cdbs = (struct cpu_dbs_info *)data; > > struct cpu_common_dbs_info *shared = cdbs->shared; > > - unsigned long flags; > > - > > - spin_lock_irqsave(&shared->timer_lock, flags); > > > > /* > > * Timer handler isn't allowed to queue work at the moment, because: > > @@ -279,12 +266,10 @@ static void dbs_timer_handler(unsigned l > > * - We are stopping the governor > > * - Or we are updating the sampling rate of ondemand governor > > */ > > - if (!shared->skip_work) { > > - shared->skip_work++; > > + if (atomic_inc_return(&shared->skip_work) > 1) > > + atomic_dec(&shared->skip_work); > > + else > > queue_work(system_wq, &shared->work); > > - } > > As explained in the other email, this is wrong..
OK, but instead of relying on the spinlock to wait for the already running dbs_timer_handler() in gov_cancel_work() (which is really easy to overlook and should at least be mentioned in a comment) we can wait for it explicitly. That is, if the relevant code in gov_cancel_work() is like this: atomic_inc(&shared->skip_work); gov_cancel_timers(shared->policy); cancel_work_sync(&shared->work); gov_cancel_timers(shared->policy); atomic_set(&shared->skip_work, 0); then the work item should not be leaked behind the cancel_work_sync() any more AFAICS. Thanks, Rafael -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/