From: Matthias Kaehlcke <mka@chromium.org>
To: Viresh Kumar <viresh.kumar@linaro.org>
Cc: Rafael Wysocki <rjw@rjwysocki.net>,
linux-pm@vger.kernel.org,
Vincent Guittot <vincent.guittot@linaro.org>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/2] cpufreq: stats: Fix concurrency issues while resetting stats
Date: Mon, 4 Feb 2019 14:31:31 -0800 [thread overview]
Message-ID: <20190204223131.GF117604@google.com> (raw)
In-Reply-To: <927dcc1de6acad3dd2cfae4e300e6fee4f665101.1549001732.git.viresh.kumar@linaro.org>
On Fri, Feb 01, 2019 at 11:45:45AM +0530, Viresh Kumar wrote:
> It is possible for cpufreq_stats_clear_table() and
> cpufreq_stats_record_transition() to get called concurrently and they
> will try to update same variables simultaneously and may lead to
> corruption of data.
>
> Prevent that with the help of existing spinlock.
>
> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
> ---
> drivers/cpufreq/cpufreq_stats.c | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c
> index 941e63e3e652..e2db5581489a 100644
> --- a/drivers/cpufreq/cpufreq_stats.c
> +++ b/drivers/cpufreq/cpufreq_stats.c
> @@ -31,20 +31,20 @@ static void cpufreq_stats_update(struct cpufreq_stats *stats)
> {
> unsigned long long cur_time = get_jiffies_64();
>
> - spin_lock(&cpufreq_stats_lock);
> stats->time_in_state[stats->last_index] += cur_time - stats->last_time;
> stats->last_time = cur_time;
> - spin_unlock(&cpufreq_stats_lock);
> }
>
> static void cpufreq_stats_clear_table(struct cpufreq_stats *stats)
> {
> unsigned int count = stats->max_state;
>
> + spin_lock(&cpufreq_stats_lock);
> memset(stats->time_in_state, 0, count * sizeof(u64));
> memset(stats->trans_table, 0, count * count * sizeof(int));
> stats->last_time = get_jiffies_64();
> stats->total_trans = 0;
> + spin_unlock(&cpufreq_stats_lock);
> }
>
> static ssize_t show_total_trans(struct cpufreq_policy *policy, char *buf)
> @@ -62,7 +62,10 @@ static ssize_t show_time_in_state(struct cpufreq_policy *policy, char *buf)
> if (policy->fast_switch_enabled)
> return 0;
>
> + spin_lock(&cpufreq_stats_lock);
> cpufreq_stats_update(stats);
> + spin_unlock(&cpufreq_stats_lock);
> +
> for (i = 0; i < stats->state_num; i++) {
> len += sprintf(buf + len, "%u %llu\n", stats->freq_table[i],
> (unsigned long long)
> @@ -239,9 +242,11 @@ void cpufreq_stats_record_transition(struct cpufreq_policy *policy,
> if (old_index == -1 || new_index == -1 || old_index == new_index)
> return;
>
> + spin_lock(&cpufreq_stats_lock);
> cpufreq_stats_update(stats);
>
> stats->last_index = new_index;
> stats->trans_table[old_index * stats->max_state + new_index]++;
> stats->total_trans++;
> + spin_unlock(&cpufreq_stats_lock);
> }
Reviewed-by: Matthias Kaehlcke <mka@chromium.org>
next prev parent reply other threads:[~2019-02-04 22:31 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-01 6:15 [PATCH 1/2] cpufreq: stats: Declare freq-attr right after their callbacks Viresh Kumar
2019-02-01 6:15 ` [PATCH 2/2] cpufreq: stats: Fix concurrency issues while resetting stats Viresh Kumar
2019-02-04 22:31 ` Matthias Kaehlcke [this message]
2019-02-06 10:29 ` [PATCH 1/2] cpufreq: stats: Declare freq-attr right after their callbacks Rafael J. Wysocki
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=20190204223131.GF117604@google.com \
--to=mka@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=rjw@rjwysocki.net \
--cc=vincent.guittot@linaro.org \
--cc=viresh.kumar@linaro.org \
/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.