lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Tue, 08 Dec 2015 14:30:51 +0100 From: "Rafael J. Wysocki" <rjw@...ysocki.net> To: Viresh Kumar <viresh.kumar@...aro.org> Cc: linux-pm@...r.kernel.org, linaro-kernel@...ts.linaro.org, ashwin.chaugule@...aro.org, "Rafael J. Wysocki" <rafael.j.wysocki@...el.com>, LKML <linux-kernel@...r.kernel.org> Subject: Re: [PATCH][experimantal] cpufreq: governor: Use an atomic variable for synchronization 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 majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists