From: Viresh Kumar <viresh.kumar@linaro.org>
To: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: linux-pm@vger.kernel.org, linaro-kernel@lists.linaro.org,
ashwin.chaugule@linaro.org,
"Rafael J. Wysocki" <rafael.j.wysocki@intel.com>,
LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH][experimantal] cpufreq: governor: Use an atomic variable for synchronization
Date: Tue, 8 Dec 2015 19:06:33 +0530 [thread overview]
Message-ID: <20151208133633.GC3692@ubuntu> (raw)
In-Reply-To: <5461074.Yz9lhOaAu0@vostro.rjw.lan>
On 08-12-15, 14:30, Rafael J. Wysocki wrote:
> OK, but instead of relying on the spinlock to wait for the already running
That's the purpose of the spinlock, not a side-effect.
> 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.
I agree, and I will add explicit comment about it.
> 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);
Apart from it being *really* ugly (we should know exactly what should
be done, it rather looks like hit and try), it is still racy.
> atomic_set(&shared->skip_work, 0);
>
> then the work item should not be leaked behind the cancel_work_sync() any more
> AFAICS.
Suppose queue_work() isn't done within the spin lock.
CPU0 CPU1
cpufreq_governor_stop() dbs_timer_handler()
-> gov_cancel_work() -> lock
-> shared->skip_work++, as skip_work was 0. //skip_work=1
-> unlock
-> lock
-> shared->skip_work++; //skip_work=2
-> unlock
-> queue_work();
-> gov_cancel_timers(shared->policy);
dbs_work_handler();
-> queue-timers again (as we aren't checking skip_work here)
-> cancel_work_sync(&shared->work);
dbs_timer_handler()
-> lock
-> shared->skip_work++, as skip_work was 0. //skip_work=1
-> unlock
->queue_work()
-> gov_cancel_timers(shared->policy);
-> shared->skip_work = 0;
And we have the same situation again. I have thought of all this
before I wrote the initial patch, and really tried the ugly double
timer-cancel thing. But the current approach is really the right thing
to do.
I will send a patch adding the comment.
--
viresh
next prev parent reply other threads:[~2015-12-08 13:36 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-03 4:07 [PATCH V2 0/6] cpufreq: governor: replace per-cpu delayed work with timers Viresh Kumar
2015-12-03 4:07 ` [PATCH V2 1/6] cpufreq: ondemand: Update sampling rate only for concerned policies Viresh Kumar
2015-12-03 4:07 ` Viresh Kumar
2015-12-03 4:07 ` [PATCH V2 2/6] cpufreq: ondemand: Work is guaranteed to be pending Viresh Kumar
2015-12-03 4:07 ` Viresh Kumar
2015-12-03 4:07 ` [PATCH V2 3/6] cpufreq: governor: Pass policy as argument to ->gov_dbs_timer() Viresh Kumar
2015-12-03 4:07 ` Viresh Kumar
2015-12-03 4:07 ` [PATCH V2 4/6] cpufreq: governor: initialize/destroy timer_mutex with 'shared' Viresh Kumar
2015-12-03 4:07 ` Viresh Kumar
2015-12-03 4:07 ` [PATCH V2 5/6] cpufreq: governor: replace per-cpu delayed work with timers Viresh Kumar
2015-12-03 4:07 ` Viresh Kumar
2015-12-04 1:18 ` Rafael J. Wysocki
2015-12-04 6:11 ` Viresh Kumar
2015-12-05 2:14 ` Rafael J. Wysocki
2015-12-05 4:10 ` Viresh Kumar
2015-12-07 1:28 ` Rafael J. Wysocki
2015-12-07 7:50 ` Viresh Kumar
2015-12-07 22:43 ` Rafael J. Wysocki
2015-12-07 23:17 ` Rafael J. Wysocki
2015-12-08 0:39 ` [PATCH][experimantal] cpufreq: governor: Use an atomic variable for synchronization Rafael J. Wysocki
2015-12-08 6:59 ` Viresh Kumar
2015-12-08 13:30 ` Rafael J. Wysocki
2015-12-08 13:36 ` Viresh Kumar [this message]
2015-12-08 14:19 ` Rafael J. Wysocki
2015-12-08 13:55 ` Viresh Kumar
2015-12-08 14:30 ` Rafael J. Wysocki
2015-12-08 14:56 ` Viresh Kumar
2015-12-08 16:42 ` Rafael J. Wysocki
2015-12-08 16:34 ` Viresh Kumar
2015-12-08 6:46 ` [PATCH V2 5/6] cpufreq: governor: replace per-cpu delayed work with timers Viresh Kumar
2015-12-08 6:56 ` Viresh Kumar
2015-12-08 13:18 ` Rafael J. Wysocki
2015-12-08 13:30 ` Viresh Kumar
2015-12-08 14:04 ` Rafael J. Wysocki
2015-12-04 6:13 ` [PATCH V3 " Viresh Kumar
2015-12-04 6:13 ` Viresh Kumar
2015-12-09 2:04 ` [PATCH V4 " Viresh Kumar
2015-12-09 2:04 ` Viresh Kumar
2015-12-09 22:06 ` Rafael J. Wysocki
2015-12-10 2:36 ` Viresh Kumar
2015-12-10 22:17 ` Rafael J. Wysocki
2015-12-11 1:42 ` Viresh Kumar
2015-12-03 4:07 ` [PATCH V2 6/6] cpufreq: ondemand: update update_sampling_rate() to make it more efficient Viresh Kumar
2015-12-03 4:07 ` Viresh Kumar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20151208133633.GC3692@ubuntu \
--to=viresh.kumar@linaro.org \
--cc=ashwin.chaugule@linaro.org \
--cc=linaro-kernel@lists.linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=rafael.j.wysocki@intel.com \
--cc=rjw@rjwysocki.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.