* [PATCH v3 0/3] fixed mediatek-cpufreq has multi policy concurrency issue
@ 2025-02-14 7:43 Mark Tseng
2025-02-14 7:43 ` [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition Mark Tseng
` (2 more replies)
0 siblings, 3 replies; 21+ messages in thread
From: Mark Tseng @ 2025-02-14 7:43 UTC (permalink / raw)
To: Rafael J . Wysocki, Viresh Kumar, MyungJoo Ham, Kyungmin Park,
Chanwoo Choi, Matthias Brugger, AngeloGioacchino Del Regno
Cc: linux-pm, linux-kernel, linux-arm-kernel, linux-mediatek,
Project_Global_Chrome_Upstream_Group, chun-jen.tseng
For multi cluster SoC, the cpufreq->target_index() is re-enter function
for each policy to change CPU frequency. In the cirtical session must
use glocal mutex lock to avoid get wrong OPP.
Changes since v2:
- seperate more patch for detail change.
- remove CCI transition_delay patch
Mark Tseng (3):
cpufreq: mediatek: using global lock avoid race condition
cpufreq: mediatek: Add CPUFREQ_ASYNC_NOTIFICATION flag
cpufreq: mediatek: data safety protect
drivers/cpufreq/mediatek-cpufreq.c | 63 ++++++++++++++++++++++--------
1 file changed, 46 insertions(+), 17 deletions(-)
--
2.45.2
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition
2025-02-14 7:43 [PATCH v3 0/3] fixed mediatek-cpufreq has multi policy concurrency issue Mark Tseng
@ 2025-02-14 7:43 ` Mark Tseng
2025-02-19 5:42 ` Viresh Kumar
2025-02-19 7:23 ` Dan Carpenter
2025-02-14 7:43 ` [PATCH v3 2/3] cpufreq: mediatek: Add CPUFREQ_ASYNC_NOTIFICATION flag Mark Tseng
2025-02-14 7:43 ` [PATCH v3 3/3] cpufreq: mediatek: data safety protect Mark Tseng
2 siblings, 2 replies; 21+ messages in thread
From: Mark Tseng @ 2025-02-14 7:43 UTC (permalink / raw)
To: Rafael J . Wysocki, Viresh Kumar, MyungJoo Ham, Kyungmin Park,
Chanwoo Choi, Matthias Brugger, AngeloGioacchino Del Regno
Cc: linux-pm, linux-kernel, linux-arm-kernel, linux-mediatek,
Project_Global_Chrome_Upstream_Group, chun-jen.tseng
In mtk_cpufreq_set_target() is re-enter function but the mutex lock
decalre in mtk_cpu_dvfs_info structure for each policy. It should
change to global variable for critical session avoid race condition
with 2 or more policy.
add mtk_cpufreq_get() replace cpufreq_generic_get() and use global lock
avoid return wrong clock.
Signed-off-by: Mark Tseng <chun-jen.tseng@mediatek.com>
---
drivers/cpufreq/mediatek-cpufreq.c | 39 ++++++++++++++++++++++--------
1 file changed, 29 insertions(+), 10 deletions(-)
diff --git a/drivers/cpufreq/mediatek-cpufreq.c b/drivers/cpufreq/mediatek-cpufreq.c
index 2656b88db378..07d5958e106a 100644
--- a/drivers/cpufreq/mediatek-cpufreq.c
+++ b/drivers/cpufreq/mediatek-cpufreq.c
@@ -49,8 +49,6 @@ struct mtk_cpu_dvfs_info {
bool need_voltage_tracking;
int vproc_on_boot;
int pre_vproc;
- /* Avoid race condition for regulators between notify and policy */
- struct mutex reg_lock;
struct notifier_block opp_nb;
unsigned int opp_cpu;
unsigned long current_freq;
@@ -59,6 +57,9 @@ struct mtk_cpu_dvfs_info {
bool ccifreq_bound;
};
+/* Avoid race condition for regulators between notify and policy */
+static DEFINE_MUTEX(mtk_policy_lock);
+
static struct platform_device *cpufreq_pdev;
static LIST_HEAD(dvfs_info_list);
@@ -209,12 +210,12 @@ static int mtk_cpufreq_set_target(struct cpufreq_policy *policy,
long freq_hz, pre_freq_hz;
int vproc, pre_vproc, inter_vproc, target_vproc, ret;
+ mutex_lock(&mtk_policy_lock);
+
inter_vproc = info->intermediate_voltage;
pre_freq_hz = clk_get_rate(cpu_clk);
- mutex_lock(&info->reg_lock);
-
if (unlikely(info->pre_vproc <= 0))
pre_vproc = regulator_get_voltage(info->proc_reg);
else
@@ -308,7 +309,7 @@ static int mtk_cpufreq_set_target(struct cpufreq_policy *policy,
info->current_freq = freq_hz;
out:
- mutex_unlock(&info->reg_lock);
+ mutex_unlock(&mtk_policy_lock);
return ret;
}
@@ -316,19 +317,20 @@ static int mtk_cpufreq_set_target(struct cpufreq_policy *policy,
static int mtk_cpufreq_opp_notifier(struct notifier_block *nb,
unsigned long event, void *data)
{
- struct dev_pm_opp *opp = data;
+ struct dev_pm_opp *opp;
struct dev_pm_opp *new_opp;
struct mtk_cpu_dvfs_info *info;
unsigned long freq, volt;
struct cpufreq_policy *policy;
int ret = 0;
+ mutex_lock(&mtk_policy_lock);
+ opp = data;
info = container_of(nb, struct mtk_cpu_dvfs_info, opp_nb);
if (event == OPP_EVENT_ADJUST_VOLTAGE) {
freq = dev_pm_opp_get_freq(opp);
- mutex_lock(&info->reg_lock);
if (info->current_freq == freq) {
volt = dev_pm_opp_get_voltage(opp);
ret = mtk_cpufreq_set_voltage(info, volt);
@@ -336,7 +338,6 @@ static int mtk_cpufreq_opp_notifier(struct notifier_block *nb,
dev_err(info->cpu_dev,
"failed to scale voltage: %d\n", ret);
}
- mutex_unlock(&info->reg_lock);
} else if (event == OPP_EVENT_DISABLE) {
freq = dev_pm_opp_get_freq(opp);
@@ -361,6 +362,7 @@ static int mtk_cpufreq_opp_notifier(struct notifier_block *nb,
}
}
}
+ mutex_unlock(&mtk_policy_lock);
return notifier_from_errno(ret);
}
@@ -495,7 +497,6 @@ static int mtk_cpu_dvfs_info_init(struct mtk_cpu_dvfs_info *info, int cpu)
info->intermediate_voltage = dev_pm_opp_get_voltage(opp);
dev_pm_opp_put(opp);
- mutex_init(&info->reg_lock);
info->current_freq = clk_get_rate(info->cpu_clk);
info->opp_cpu = cpu;
@@ -607,13 +608,31 @@ static void mtk_cpufreq_exit(struct cpufreq_policy *policy)
dev_pm_opp_free_cpufreq_table(info->cpu_dev, &policy->freq_table);
}
+static unsigned int mtk_cpufreq_get(unsigned int cpu)
+{
+ struct mtk_cpu_dvfs_info *info;
+ unsigned long current_freq;
+
+ mutex_lock(&mtk_policy_lock);
+ info = mtk_cpu_dvfs_info_lookup(cpu);
+ if (!info) {
+ mutex_unlock(&mtk_policy_lock);
+ return 0;
+ }
+
+ current_freq = info->current_freq / 1000;
+ mutex_unlock(&mtk_policy_lock);
+
+ return current_freq;
+}
+
static struct cpufreq_driver mtk_cpufreq_driver = {
.flags = CPUFREQ_NEED_INITIAL_FREQ_CHECK |
CPUFREQ_HAVE_GOVERNOR_PER_POLICY |
CPUFREQ_IS_COOLING_DEV,
.verify = cpufreq_generic_frequency_table_verify,
.target_index = mtk_cpufreq_set_target,
- .get = cpufreq_generic_get,
+ .get = mtk_cpufreq_get,
.init = mtk_cpufreq_init,
.exit = mtk_cpufreq_exit,
.register_em = cpufreq_register_em_with_opp,
--
2.45.2
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v3 2/3] cpufreq: mediatek: Add CPUFREQ_ASYNC_NOTIFICATION flag
2025-02-14 7:43 [PATCH v3 0/3] fixed mediatek-cpufreq has multi policy concurrency issue Mark Tseng
2025-02-14 7:43 ` [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition Mark Tseng
@ 2025-02-14 7:43 ` Mark Tseng
2025-02-19 5:45 ` Viresh Kumar
2025-02-14 7:43 ` [PATCH v3 3/3] cpufreq: mediatek: data safety protect Mark Tseng
2 siblings, 1 reply; 21+ messages in thread
From: Mark Tseng @ 2025-02-14 7:43 UTC (permalink / raw)
To: Rafael J . Wysocki, Viresh Kumar, MyungJoo Ham, Kyungmin Park,
Chanwoo Choi, Matthias Brugger, AngeloGioacchino Del Regno
Cc: linux-pm, linux-kernel, linux-arm-kernel, linux-mediatek,
Project_Global_Chrome_Upstream_Group, chun-jen.tseng
Add CPUFREQ_ASYNC_NOTIFICATION flages for cpufreq policy because some of
process will get CPU frequency by cpufreq sysfs node. It may get wrong
frequency then call cpufreq_out_of_sync() to fixed frequency.
Signed-off-by: Mark Tseng <chun-jen.tseng@mediatek.com>
---
drivers/cpufreq/mediatek-cpufreq.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/cpufreq/mediatek-cpufreq.c b/drivers/cpufreq/mediatek-cpufreq.c
index 07d5958e106a..68fcb6fcbe48 100644
--- a/drivers/cpufreq/mediatek-cpufreq.c
+++ b/drivers/cpufreq/mediatek-cpufreq.c
@@ -209,12 +209,12 @@ static int mtk_cpufreq_set_target(struct cpufreq_policy *policy,
struct dev_pm_opp *opp;
long freq_hz, pre_freq_hz;
int vproc, pre_vproc, inter_vproc, target_vproc, ret;
+ struct cpufreq_freqs freqs;
mutex_lock(&mtk_policy_lock);
inter_vproc = info->intermediate_voltage;
-
- pre_freq_hz = clk_get_rate(cpu_clk);
+ pre_freq_hz = policy->cur * 1000;
if (unlikely(info->pre_vproc <= 0))
pre_vproc = regulator_get_voltage(info->proc_reg);
@@ -307,6 +307,10 @@ static int mtk_cpufreq_set_target(struct cpufreq_policy *policy,
}
info->current_freq = freq_hz;
+ freqs.old = policy->cur;
+ freqs.new = freq_table[index].frequency;
+ cpufreq_freq_transition_begin(policy, &freqs);
+ cpufreq_freq_transition_end(policy, &freqs, false);
out:
mutex_unlock(&mtk_policy_lock);
@@ -629,6 +633,7 @@ static unsigned int mtk_cpufreq_get(unsigned int cpu)
static struct cpufreq_driver mtk_cpufreq_driver = {
.flags = CPUFREQ_NEED_INITIAL_FREQ_CHECK |
CPUFREQ_HAVE_GOVERNOR_PER_POLICY |
+ CPUFREQ_ASYNC_NOTIFICATION |
CPUFREQ_IS_COOLING_DEV,
.verify = cpufreq_generic_frequency_table_verify,
.target_index = mtk_cpufreq_set_target,
--
2.45.2
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v3 3/3] cpufreq: mediatek: data safety protect
2025-02-14 7:43 [PATCH v3 0/3] fixed mediatek-cpufreq has multi policy concurrency issue Mark Tseng
2025-02-14 7:43 ` [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition Mark Tseng
2025-02-14 7:43 ` [PATCH v3 2/3] cpufreq: mediatek: Add CPUFREQ_ASYNC_NOTIFICATION flag Mark Tseng
@ 2025-02-14 7:43 ` Mark Tseng
2025-02-19 5:49 ` Viresh Kumar
2 siblings, 1 reply; 21+ messages in thread
From: Mark Tseng @ 2025-02-14 7:43 UTC (permalink / raw)
To: Rafael J . Wysocki, Viresh Kumar, MyungJoo Ham, Kyungmin Park,
Chanwoo Choi, Matthias Brugger, AngeloGioacchino Del Regno
Cc: linux-pm, linux-kernel, linux-arm-kernel, linux-mediatek,
Project_Global_Chrome_Upstream_Group, chun-jen.tseng
get policy data in global lock session avoid get wrong data.
Signed-off-by: Mark Tseng <chun-jen.tseng@mediatek.com>
---
drivers/cpufreq/mediatek-cpufreq.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/drivers/cpufreq/mediatek-cpufreq.c b/drivers/cpufreq/mediatek-cpufreq.c
index 68fcb6fcbe48..37b929e81f70 100644
--- a/drivers/cpufreq/mediatek-cpufreq.c
+++ b/drivers/cpufreq/mediatek-cpufreq.c
@@ -201,11 +201,11 @@ static bool is_ccifreq_ready(struct mtk_cpu_dvfs_info *info)
static int mtk_cpufreq_set_target(struct cpufreq_policy *policy,
unsigned int index)
{
- struct cpufreq_frequency_table *freq_table = policy->freq_table;
- struct clk *cpu_clk = policy->clk;
- struct clk *armpll = clk_get_parent(cpu_clk);
- struct mtk_cpu_dvfs_info *info = policy->driver_data;
- struct device *cpu_dev = info->cpu_dev;
+ struct cpufreq_frequency_table *freq_table;
+ struct clk *cpu_clk;
+ struct clk *armpll;
+ struct mtk_cpu_dvfs_info *info;
+ struct device *cpu_dev;
struct dev_pm_opp *opp;
long freq_hz, pre_freq_hz;
int vproc, pre_vproc, inter_vproc, target_vproc, ret;
@@ -213,6 +213,11 @@ static int mtk_cpufreq_set_target(struct cpufreq_policy *policy,
mutex_lock(&mtk_policy_lock);
+ freq_table = policy->freq_table;
+ cpu_clk = policy->clk;
+ armpll = clk_get_parent(cpu_clk);
+ info = policy->driver_data;
+ cpu_dev = info->cpu_dev;
inter_vproc = info->intermediate_voltage;
pre_freq_hz = policy->cur * 1000;
--
2.45.2
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition
2025-02-14 7:43 ` [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition Mark Tseng
@ 2025-02-19 5:42 ` Viresh Kumar
2025-03-20 8:22 ` Chun-Jen Tseng (曾俊仁)
2025-02-19 7:23 ` Dan Carpenter
1 sibling, 1 reply; 21+ messages in thread
From: Viresh Kumar @ 2025-02-19 5:42 UTC (permalink / raw)
To: Mark Tseng
Cc: Rafael J . Wysocki, MyungJoo Ham, Kyungmin Park, Chanwoo Choi,
Matthias Brugger, AngeloGioacchino Del Regno, linux-pm,
linux-kernel, linux-arm-kernel, linux-mediatek,
Project_Global_Chrome_Upstream_Group
On 14-02-25, 15:43, Mark Tseng wrote:
> In mtk_cpufreq_set_target() is re-enter function but the mutex lock
> decalre in mtk_cpu_dvfs_info structure for each policy. It should
> change to global variable for critical session avoid race condition
> with 2 or more policy.
And what exactly is the race condition here ? Can you please explain that ?
Since the struct mtk_cpu_dvfs_info instance is per-policy, I don't think there
is any race here.
The lock was introduced earlier to avoid a potential race with notifiers, but it
has nothing to do with calling target simultaneously.
commit c210063b40ac ("cpufreq: mediatek: Add opp notification support")
--
viresh
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 2/3] cpufreq: mediatek: Add CPUFREQ_ASYNC_NOTIFICATION flag
2025-02-14 7:43 ` [PATCH v3 2/3] cpufreq: mediatek: Add CPUFREQ_ASYNC_NOTIFICATION flag Mark Tseng
@ 2025-02-19 5:45 ` Viresh Kumar
2025-03-20 8:34 ` Chun-Jen Tseng (曾俊仁)
0 siblings, 1 reply; 21+ messages in thread
From: Viresh Kumar @ 2025-02-19 5:45 UTC (permalink / raw)
To: Mark Tseng
Cc: Rafael J . Wysocki, MyungJoo Ham, Kyungmin Park, Chanwoo Choi,
Matthias Brugger, AngeloGioacchino Del Regno, linux-pm,
linux-kernel, linux-arm-kernel, linux-mediatek,
Project_Global_Chrome_Upstream_Group
On 14-02-25, 15:43, Mark Tseng wrote:
> Add CPUFREQ_ASYNC_NOTIFICATION flages for cpufreq policy because some of
> process will get CPU frequency by cpufreq sysfs node. It may get wrong
> frequency then call cpufreq_out_of_sync() to fixed frequency.
That's not why CPUFREQ_ASYNC_NOTIFICATION is used. It is used only for the cases
where the target()/target_index() callback defers the work to some other entity
(like a workqueue) and it is not guaranteed that the frequency will be changed
before these helpers return.
I don't think your patch is required.
--
viresh
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 3/3] cpufreq: mediatek: data safety protect
2025-02-14 7:43 ` [PATCH v3 3/3] cpufreq: mediatek: data safety protect Mark Tseng
@ 2025-02-19 5:49 ` Viresh Kumar
0 siblings, 0 replies; 21+ messages in thread
From: Viresh Kumar @ 2025-02-19 5:49 UTC (permalink / raw)
To: Mark Tseng
Cc: Rafael J . Wysocki, MyungJoo Ham, Kyungmin Park, Chanwoo Choi,
Matthias Brugger, AngeloGioacchino Del Regno, linux-pm,
linux-kernel, linux-arm-kernel, linux-mediatek,
Project_Global_Chrome_Upstream_Group
On 14-02-25, 15:43, Mark Tseng wrote:
> get policy data in global lock session avoid get wrong data.
>
> Signed-off-by: Mark Tseng <chun-jen.tseng@mediatek.com>
> ---
> drivers/cpufreq/mediatek-cpufreq.c | 15 ++++++++++-----
> 1 file changed, 10 insertions(+), 5 deletions(-)
I think there is some confusion on why exactly locking is required and where
exactly you need it. This patch is incorrect.
If you really think some locking issue is present here, please explain in
detail how a race can happen between different threads.
--
viresh
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition
2025-02-14 7:43 ` [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition Mark Tseng
2025-02-19 5:42 ` Viresh Kumar
@ 2025-02-19 7:23 ` Dan Carpenter
2025-03-20 8:25 ` Chun-Jen Tseng (曾俊仁)
1 sibling, 1 reply; 21+ messages in thread
From: Dan Carpenter @ 2025-02-19 7:23 UTC (permalink / raw)
To: oe-kbuild, Mark Tseng, Rafael J . Wysocki, Viresh Kumar,
MyungJoo Ham, Kyungmin Park, Chanwoo Choi, Matthias Brugger,
AngeloGioacchino Del Regno
Cc: lkp, oe-kbuild-all, linux-pm, linux-kernel, linux-arm-kernel,
linux-mediatek, Project_Global_Chrome_Upstream_Group,
chun-jen.tseng
Hi Mark,
kernel test robot noticed the following build warnings:
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Mark-Tseng/cpufreq-mediatek-using-global-lock-avoid-race-condition/20250214-154521
base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next
patch link: https://lore.kernel.org/r/20250214074353.1169864-2-chun-jen.tseng%40mediatek.com
patch subject: [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition
config: sparc-randconfig-r071-20250218 (https://download.01.org/0day-ci/archive/20250219/202502190807.fz6fs2jz-lkp@intel.com/config)
compiler: sparc64-linux-gcc (GCC) 14.2.0
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
| Closes: https://lore.kernel.org/r/202502190807.fz6fs2jz-lkp@intel.com/
smatch warnings:
drivers/cpufreq/mediatek-cpufreq.c:367 mtk_cpufreq_opp_notifier() warn: inconsistent returns 'global &mtk_policy_lock'.
vim +367 drivers/cpufreq/mediatek-cpufreq.c
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 317 static int mtk_cpufreq_opp_notifier(struct notifier_block *nb,
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 318 unsigned long event, void *data)
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 319 {
5f81d7eeae239d drivers/cpufreq/mediatek-cpufreq.c Mark Tseng 2025-02-14 320 struct dev_pm_opp *opp;
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 321 struct dev_pm_opp *new_opp;
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 322 struct mtk_cpu_dvfs_info *info;
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 323 unsigned long freq, volt;
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 324 struct cpufreq_policy *policy;
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 325 int ret = 0;
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 326
5f81d7eeae239d drivers/cpufreq/mediatek-cpufreq.c Mark Tseng 2025-02-14 327 mutex_lock(&mtk_policy_lock);
5f81d7eeae239d drivers/cpufreq/mediatek-cpufreq.c Mark Tseng 2025-02-14 328 opp = data;
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 329 info = container_of(nb, struct mtk_cpu_dvfs_info, opp_nb);
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 330
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 331 if (event == OPP_EVENT_ADJUST_VOLTAGE) {
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 332 freq = dev_pm_opp_get_freq(opp);
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 333
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 334 if (info->current_freq == freq) {
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 335 volt = dev_pm_opp_get_voltage(opp);
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 336 ret = mtk_cpufreq_set_voltage(info, volt);
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 337 if (ret)
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 338 dev_err(info->cpu_dev,
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 339 "failed to scale voltage: %d\n", ret);
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 340 }
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 341 } else if (event == OPP_EVENT_DISABLE) {
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 342 freq = dev_pm_opp_get_freq(opp);
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 343
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 344 /* case of current opp item is disabled */
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 345 if (info->current_freq == freq) {
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 346 freq = 1;
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 347 new_opp = dev_pm_opp_find_freq_ceil(info->cpu_dev,
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 348 &freq);
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 349 if (IS_ERR(new_opp)) {
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 350 dev_err(info->cpu_dev,
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 351 "all opp items are disabled\n");
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 352 ret = PTR_ERR(new_opp);
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 353 return notifier_from_errno(ret);
mutex_unlock(&mtk_policy_lock) before returning.
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 354 }
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 355
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 356 dev_pm_opp_put(new_opp);
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 357 policy = cpufreq_cpu_get(info->opp_cpu);
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 358 if (policy) {
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 359 cpufreq_driver_target(policy, freq / 1000,
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 360 CPUFREQ_RELATION_L);
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 361 cpufreq_cpu_put(policy);
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 362 }
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 363 }
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 364 }
5f81d7eeae239d drivers/cpufreq/mediatek-cpufreq.c Mark Tseng 2025-02-14 365 mutex_unlock(&mtk_policy_lock);
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 366
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 @367 return notifier_from_errno(ret);
c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-05-05 368 }
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition
2025-02-19 5:42 ` Viresh Kumar
@ 2025-03-20 8:22 ` Chun-Jen Tseng (曾俊仁)
2025-03-21 4:56 ` Viresh Kumar
0 siblings, 1 reply; 21+ messages in thread
From: Chun-Jen Tseng (曾俊仁) @ 2025-03-20 8:22 UTC (permalink / raw)
To: viresh.kumar@linaro.org
Cc: cw00.choi@samsung.com, rafael@kernel.org,
Project_Global_Chrome_Upstream_Group, AngeloGioacchino Del Regno,
myungjoo.ham@samsung.com, linux-kernel@vger.kernel.org,
kyungmin.park@samsung.com, linux-arm-kernel@lists.infradead.org,
matthias.bgg@gmail.com, linux-pm@vger.kernel.org,
linux-mediatek@lists.infradead.org
Hi viresh,
Thanks your review and reply.
The struct mtk_cpu_dvfs_info instance is per-policy and the reg_lock is
also in this structure. when I have two "policy-0" and "policy-6" use
the same mtk_cpufreq_set_target() function but the info->reg_lock
is from 2 instance(policy-0 and policy-6). when the policy-0 and
policy-6 call set_target target, the mutex_lock is locked by per-
policy. So, I change to global lock avoid per-policy lock.
BRs,
Mark Tseng
On Wed, 2025-02-19 at 11:12 +0530, Viresh Kumar wrote:
>
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>
>
> On 14-02-25, 15:43, Mark Tseng wrote:
> > In mtk_cpufreq_set_target() is re-enter function but the mutex lock
> > decalre in mtk_cpu_dvfs_info structure for each policy. It should
> > change to global variable for critical session avoid race condition
> > with 2 or more policy.
>
> And what exactly is the race condition here ? Can you please explain
> that ?
> Since the struct mtk_cpu_dvfs_info instance is per-policy, I don't
> think there
> is any race here.
>
> The lock was introduced earlier to avoid a potential race with
> notifiers, but it
> has nothing to do with calling target simultaneously.
>
> commit c210063b40ac ("cpufreq: mediatek: Add opp notification
> support")
>
> --
> viresh
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition
2025-02-19 7:23 ` Dan Carpenter
@ 2025-03-20 8:25 ` Chun-Jen Tseng (曾俊仁)
0 siblings, 0 replies; 21+ messages in thread
From: Chun-Jen Tseng (曾俊仁) @ 2025-03-20 8:25 UTC (permalink / raw)
To: viresh.kumar@linaro.org, dan.carpenter@linaro.org,
cw00.choi@samsung.com, rafael@kernel.org,
AngeloGioacchino Del Regno, myungjoo.ham@samsung.com,
kyungmin.park@samsung.com, matthias.bgg@gmail.com,
oe-kbuild@lists.linux.dev
Cc: linux-arm-kernel@lists.infradead.org,
linux-mediatek@lists.infradead.org, linux-pm@vger.kernel.org,
Project_Global_Chrome_Upstream_Group,
linux-kernel@vger.kernel.org, lkp@intel.com,
oe-kbuild-all@lists.linux.dev
Hi Dan,
Thanks your remind. I will be careful and fix it before submit new
patch.
BRs,
Mark Tseng
On Wed, 2025-02-19 at 10:23 +0300, Dan Carpenter wrote:
>
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>
>
> Hi Mark,
>
> kernel test robot noticed the following build warnings:
>
> https://urldefense.com/v3/__https://git-scm.com/docs/git-format-patch*_base_tree_information__;Iw!!CTRNKA9wMg0ARbw!ixPI3aPvvJSSIiRSm4TttWZyeSNnZsdzX-4zYkY7Ax1faRLZBJ7JW3Fmf7O8BYXiyHlxDC6aauOslVt8KEW_jViJAkm7uw$
> ]
>
> url:
> https://urldefense.com/v3/__https://github.com/intel-lab-lkp/linux/commits/Mark-Tseng/cpufreq-mediatek-using-global-lock-avoid-race-condition/20250214-154521__;!!CTRNKA9wMg0ARbw!ixPI3aPvvJSSIiRSm4TttWZyeSNnZsdzX-4zYkY7Ax1faRLZBJ7JW3Fmf7O8BYXiyHlxDC6aauOslVt8KEW_jVj9Egobdw$
> base:
> https://urldefense.com/v3/__https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git__;!!CTRNKA9wMg0ARbw!ixPI3aPvvJSSIiRSm4TttWZyeSNnZsdzX-4zYkY7Ax1faRLZBJ7JW3Fmf7O8BYXiyHlxDC6aauOslVt8KEW_jVg7ujqlQw$
> linux-next
> patch link:
> https://lore.kernel.org/r/20250214074353.1169864-2-chun-jen.tseng%40mediatek.com
> patch subject: [PATCH v3 1/3] cpufreq: mediatek: using global lock
> avoid race condition
> config: sparc-randconfig-r071-20250218
> (https://urldefense.com/v3/__https://download.01.org/0day-ci/archive/
> 20250219/202502190807.fz6fs2jz-lkp@intel.com/config__;!!CTRNKA9wMg0AR
> bw!ixPI3aPvvJSSIiRSm4TttWZyeSNnZsdzX-
> 4zYkY7Ax1faRLZBJ7JW3Fmf7O8BYXiyHlxDC6aauOslVt8KEW_jVhUidk_DA$ )
> compiler: sparc64-linux-gcc (GCC) 14.2.0
>
> If you fix the issue in a separate patch/commit (i.e. not just a new
> version of
> the same patch/commit), kindly add following tags
> > Reported-by: kernel test robot <lkp@intel.com>
> > Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
> > Closes:
> > https://lore.kernel.org/r/202502190807.fz6fs2jz-lkp@intel.com/
>
> smatch warnings:
> drivers/cpufreq/mediatek-cpufreq.c:367 mtk_cpufreq_opp_notifier()
> warn: inconsistent returns 'global &mtk_policy_lock'.
>
> vim +367 drivers/cpufreq/mediatek-cpufreq.c
>
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 317 static int mtk_cpufreq_opp_notifier(struct notifier_block
> *nb,
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 318 unsigned long event,
> void *data)
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 319 {
> 5f81d7eeae239d drivers/cpufreq/mediatek-cpufreq.c Mark Tseng 2025-
> 02-14 320 struct dev_pm_opp *opp;
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 321 struct dev_pm_opp *new_opp;
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 322 struct mtk_cpu_dvfs_info *info;
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 323 unsigned long freq, volt;
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 324 struct cpufreq_policy *policy;
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 325 int ret = 0;
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 326
> 5f81d7eeae239d drivers/cpufreq/mediatek-cpufreq.c Mark Tseng 2025-
> 02-14 327 mutex_lock(&mtk_policy_lock);
> 5f81d7eeae239d drivers/cpufreq/mediatek-cpufreq.c Mark Tseng 2025-
> 02-14 328 opp = data;
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 329 info = container_of(nb, struct mtk_cpu_dvfs_info,
> opp_nb);
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 330
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 331 if (event == OPP_EVENT_ADJUST_VOLTAGE) {
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 332 freq = dev_pm_opp_get_freq(opp);
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 333
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 334 if (info->current_freq == freq) {
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 335 volt =
> dev_pm_opp_get_voltage(opp);
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 336 ret =
> mtk_cpufreq_set_voltage(info, volt);
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 337 if (ret)
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 338 dev_err(info->cpu_dev,
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 339 "failed to scale
> voltage: %d\n", ret);
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 340 }
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 341 } else if (event == OPP_EVENT_DISABLE) {
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 342 freq = dev_pm_opp_get_freq(opp);
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 343
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 344 /* case of current opp item is disabled */
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 345 if (info->current_freq == freq) {
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 346 freq = 1;
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 347 new_opp =
> dev_pm_opp_find_freq_ceil(info->cpu_dev,
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05
> 348
> &freq);
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 349 if (IS_ERR(new_opp)) {
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 350 dev_err(info->cpu_dev,
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 351 "all opp items are
> disabled\n");
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 352 ret = PTR_ERR(new_opp);
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 353 return
> notifier_from_errno(ret);
>
> mutex_unlock(&mtk_policy_lock) before returning.
>
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 354 }
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 355
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 356 dev_pm_opp_put(new_opp);
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 357 policy = cpufreq_cpu_get(info-
> >opp_cpu);
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 358 if (policy) {
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 359
> cpufreq_driver_target(policy, freq / 1000,
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 360
> CPUFREQ_RELATION_L);
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 361 cpufreq_cpu_put(policy);
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 362 }
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 363 }
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 364 }
> 5f81d7eeae239d drivers/cpufreq/mediatek-cpufreq.c Mark Tseng 2025-
> 02-14 365 mutex_unlock(&mtk_policy_lock);
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 366
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 @367 return notifier_from_errno(ret);
> c210063b40acab drivers/cpufreq/mediatek-cpufreq.c Rex-BC Chen 2022-
> 05-05 368 }
>
> --
> 0-DAY CI Kernel Test Service
> https://urldefense.com/v3/__https://github.com/intel/lkp-tests/wiki__;!!CTRNKA9wMg0ARbw!ixPI3aPvvJSSIiRSm4TttWZyeSNnZsdzX-4zYkY7Ax1faRLZBJ7JW3Fmf7O8BYXiyHlxDC6aauOslVt8KEW_jVii1cx6tQ$
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 2/3] cpufreq: mediatek: Add CPUFREQ_ASYNC_NOTIFICATION flag
2025-02-19 5:45 ` Viresh Kumar
@ 2025-03-20 8:34 ` Chun-Jen Tseng (曾俊仁)
2025-03-21 4:59 ` Viresh Kumar
0 siblings, 1 reply; 21+ messages in thread
From: Chun-Jen Tseng (曾俊仁) @ 2025-03-20 8:34 UTC (permalink / raw)
To: viresh.kumar@linaro.org
Cc: cw00.choi@samsung.com, rafael@kernel.org,
Project_Global_Chrome_Upstream_Group, AngeloGioacchino Del Regno,
myungjoo.ham@samsung.com, linux-kernel@vger.kernel.org,
kyungmin.park@samsung.com, linux-arm-kernel@lists.infradead.org,
matthias.bgg@gmail.com, linux-pm@vger.kernel.org,
linux-mediatek@lists.infradead.org
Hi viresh,
For CCI and ARMPLL in different driver, I need to change ARMPLL first
then use cpufreq notify CCI driver. it can avoid CCI driver get wrong
ARMPLL frequency and choose WRONG frequency.
BRs,
Mark Tseng
On Wed, 2025-02-19 at 11:15 +0530, Viresh Kumar wrote:
>
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>
>
> On 14-02-25, 15:43, Mark Tseng wrote:
> > Add CPUFREQ_ASYNC_NOTIFICATION flages for cpufreq policy because
> > some of
> > process will get CPU frequency by cpufreq sysfs node. It may get
> > wrong
> > frequency then call cpufreq_out_of_sync() to fixed frequency.
>
> That's not why CPUFREQ_ASYNC_NOTIFICATION is used. It is used only
> for the cases
> where the target()/target_index() callback defers the work to some
> other entity
> (like a workqueue) and it is not guaranteed that the frequency will
> be changed
> before these helpers return.
>
> I don't think your patch is required.
>
> --
> viresh
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition
2025-03-20 8:22 ` Chun-Jen Tseng (曾俊仁)
@ 2025-03-21 4:56 ` Viresh Kumar
2025-03-21 5:32 ` Chun-Jen Tseng (曾俊仁)
0 siblings, 1 reply; 21+ messages in thread
From: Viresh Kumar @ 2025-03-21 4:56 UTC (permalink / raw)
To: Chun-Jen Tseng (曾俊仁)
Cc: cw00.choi@samsung.com, rafael@kernel.org,
Project_Global_Chrome_Upstream_Group, AngeloGioacchino Del Regno,
myungjoo.ham@samsung.com, linux-kernel@vger.kernel.org,
kyungmin.park@samsung.com, linux-arm-kernel@lists.infradead.org,
matthias.bgg@gmail.com, linux-pm@vger.kernel.org,
linux-mediatek@lists.infradead.org
On 20-03-25, 08:22, Chun-Jen Tseng (曾俊仁) wrote:
> The struct mtk_cpu_dvfs_info instance is per-policy and the reg_lock is
> also in this structure. when I have two "policy-0" and "policy-6" use
> the same mtk_cpufreq_set_target() function but the info->reg_lock
> is from 2 instance(policy-0 and policy-6). when the policy-0 and
> policy-6 call set_target target, the mutex_lock is locked by per-
> policy. So, I change to global lock avoid per-policy lock.
Yes, that's what you are doing. I am asking why a global lock is required here ?
I think the per-policy lock is all you need.
--
viresh
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 2/3] cpufreq: mediatek: Add CPUFREQ_ASYNC_NOTIFICATION flag
2025-03-20 8:34 ` Chun-Jen Tseng (曾俊仁)
@ 2025-03-21 4:59 ` Viresh Kumar
0 siblings, 0 replies; 21+ messages in thread
From: Viresh Kumar @ 2025-03-21 4:59 UTC (permalink / raw)
To: Chun-Jen Tseng (曾俊仁)
Cc: cw00.choi@samsung.com, rafael@kernel.org,
Project_Global_Chrome_Upstream_Group, AngeloGioacchino Del Regno,
myungjoo.ham@samsung.com, linux-kernel@vger.kernel.org,
kyungmin.park@samsung.com, linux-arm-kernel@lists.infradead.org,
matthias.bgg@gmail.com, linux-pm@vger.kernel.org,
linux-mediatek@lists.infradead.org
On 20-03-25, 08:34, Chun-Jen Tseng (曾俊仁) wrote:
> For CCI and ARMPLL in different driver, I need to change ARMPLL first
> then use cpufreq notify CCI driver. it can avoid CCI driver get wrong
> ARMPLL frequency and choose WRONG frequency.
That flag is only required if mtk_cpufreq_set_target() isn't able to complete
the freq transition. Which isn't the case here. I don't think your patch is
correct.
--
viresh
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition
2025-03-21 4:56 ` Viresh Kumar
@ 2025-03-21 5:32 ` Chun-Jen Tseng (曾俊仁)
2025-03-21 6:01 ` Viresh Kumar
0 siblings, 1 reply; 21+ messages in thread
From: Chun-Jen Tseng (曾俊仁) @ 2025-03-21 5:32 UTC (permalink / raw)
To: viresh.kumar@linaro.org
Cc: cw00.choi@samsung.com, rafael@kernel.org,
Project_Global_Chrome_Upstream_Group, AngeloGioacchino Del Regno,
myungjoo.ham@samsung.com, linux-kernel@vger.kernel.org,
kyungmin.park@samsung.com, linux-arm-kernel@lists.infradead.org,
matthias.bgg@gmail.com, linux-pm@vger.kernel.org,
linux-mediatek@lists.infradead.org
Hi viresh,
I add a global lock related to the CCI driver.
This is because the CCI needs to obtain the frequencies of policy-0 and
policy-6 to determine its own frequency.
If policy-0 and policy-6 are set simultaneously, it may cause the CCI
to select the wrong frequency.
Therefore, I hope to change the setting flow to the following:
policy-0 or policy-6 -> set frequency -> CCI receives notification -
> set CCI frequency
BRs,
Mark Tseng
On Fri, 2025-03-21 at 10:26 +0530, Viresh Kumar wrote:
>
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>
>
> On 20-03-25, 08:22, Chun-Jen Tseng (曾俊仁) wrote:
> > The struct mtk_cpu_dvfs_info instance is per-policy and the
> > reg_lock is
> > also in this structure. when I have two "policy-0" and "policy-6"
> > use
> > the same mtk_cpufreq_set_target() function but the info->reg_lock
> > is from 2 instance(policy-0 and policy-6). when the policy-0 and
> > policy-6 call set_target target, the mutex_lock is locked by per-
> > policy. So, I change to global lock avoid per-policy lock.
>
> Yes, that's what you are doing. I am asking why a global lock is
> required here ?
> I think the per-policy lock is all you need.
>
> --
> viresh
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition
2025-03-21 5:32 ` Chun-Jen Tseng (曾俊仁)
@ 2025-03-21 6:01 ` Viresh Kumar
2025-03-24 3:21 ` Chun-Jen Tseng (曾俊仁)
0 siblings, 1 reply; 21+ messages in thread
From: Viresh Kumar @ 2025-03-21 6:01 UTC (permalink / raw)
To: Chun-Jen Tseng (曾俊仁)
Cc: cw00.choi@samsung.com, rafael@kernel.org,
Project_Global_Chrome_Upstream_Group, AngeloGioacchino Del Regno,
myungjoo.ham@samsung.com, linux-kernel@vger.kernel.org,
kyungmin.park@samsung.com, linux-arm-kernel@lists.infradead.org,
matthias.bgg@gmail.com, linux-pm@vger.kernel.org,
linux-mediatek@lists.infradead.org
On 21-03-25, 05:32, Chun-Jen Tseng (曾俊仁) wrote:
> I add a global lock related to the CCI driver.
>
> This is because the CCI needs to obtain the frequencies of policy-0 and
> policy-6 to determine its own frequency.
>
> If policy-0 and policy-6 are set simultaneously, it may cause the CCI
> to select the wrong frequency.
>
> Therefore, I hope to change the setting flow to the following:
> policy-0 or policy-6 -> set frequency -> CCI receives notification -
> set CCI frequency
Can you please point to the code where this race exists ? I am not
sure I fully understand it as of now. If the race is present in
another driver, CCI ?, then shouldn't it be fixed there instead ?
--
viresh
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition
2025-03-21 6:01 ` Viresh Kumar
@ 2025-03-24 3:21 ` Chun-Jen Tseng (曾俊仁)
2025-03-24 5:43 ` Viresh Kumar
0 siblings, 1 reply; 21+ messages in thread
From: Chun-Jen Tseng (曾俊仁) @ 2025-03-24 3:21 UTC (permalink / raw)
To: viresh.kumar@linaro.org
Cc: cw00.choi@samsung.com, rafael@kernel.org,
Project_Global_Chrome_Upstream_Group, AngeloGioacchino Del Regno,
myungjoo.ham@samsung.com, linux-kernel@vger.kernel.org,
kyungmin.park@samsung.com, linux-arm-kernel@lists.infradead.org,
matthias.bgg@gmail.com, linux-pm@vger.kernel.org,
linux-mediatek@lists.infradead.org
Hi viresh,
I think the best configuration sequence is as follows:
cpufreq policy -> set frequency -> CCI governor get
CPUFREQ_POSTCHANGE NB -> choose CCI frequency -> set CCI frequency
However, in drivers/devfreq/governor_passive.c#L77,
get_target_freq_with_cpufreq() retrieves the current frequency of each
policy,
and it determines the CCI frequency based on the frequency of each
policy.
But if policy-0 and policy-6 enter simultaneously, the CCI governor
might get an incorrect frequency.
cpufreq policy-0 -> set frequency -> CCI governor get
CPUFREQ_POSTCHANGE NB -> choose CCI frequency -> set CCI frequency
=> during this time, the CCI governor gets policy-0 and policy-6, BUT
policy-6 may change frequency by cpufreq driver at the same time.
Therefore, I want to change it so that only one policy can perform the
set frequency action at a time to avoid CCI running at the wrong
frequency.
BRs,
Mark Tseng
On Fri, 2025-03-21 at 11:31 +0530, Viresh Kumar wrote:
>
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>
>
> On 21-03-25, 05:32, Chun-Jen Tseng (曾俊仁) wrote:
> > I add a global lock related to the CCI driver.
> >
> > This is because the CCI needs to obtain the frequencies of policy-0
> > and
> > policy-6 to determine its own frequency.
> >
> > If policy-0 and policy-6 are set simultaneously, it may cause the
> > CCI
> > to select the wrong frequency.
> >
> > Therefore, I hope to change the setting flow to the following:
> > policy-0 or policy-6 -> set frequency -> CCI receives
> > notification -
> > set CCI frequency
>
> Can you please point to the code where this race exists ? I am not
> sure I fully understand it as of now. If the race is present in
> another driver, CCI ?, then shouldn't it be fixed there instead ?
>
> --
> viresh
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition
2025-03-24 3:21 ` Chun-Jen Tseng (曾俊仁)
@ 2025-03-24 5:43 ` Viresh Kumar
2025-04-14 8:42 ` Chun-Jen Tseng (曾俊仁)
0 siblings, 1 reply; 21+ messages in thread
From: Viresh Kumar @ 2025-03-24 5:43 UTC (permalink / raw)
To: Chun-Jen Tseng (曾俊仁)
Cc: cw00.choi@samsung.com, rafael@kernel.org,
Project_Global_Chrome_Upstream_Group, AngeloGioacchino Del Regno,
myungjoo.ham@samsung.com, linux-kernel@vger.kernel.org,
kyungmin.park@samsung.com, linux-arm-kernel@lists.infradead.org,
matthias.bgg@gmail.com, linux-pm@vger.kernel.org,
linux-mediatek@lists.infradead.org
Hi,
Thanks for sharing the details this time, it makes it much clearer
now.
On 24-03-25, 03:21, Chun-Jen Tseng (曾俊仁) wrote:
> I think the best configuration sequence is as follows:
> cpufreq policy -> set frequency -> CCI governor get
> CPUFREQ_POSTCHANGE NB -> choose CCI frequency -> set CCI frequency
>
> However, in drivers/devfreq/governor_passive.c#L77,
> get_target_freq_with_cpufreq() retrieves the current frequency of each
> policy,
> and it determines the CCI frequency based on the frequency of each
> policy.
>
> But if policy-0 and policy-6 enter simultaneously, the CCI governor
> might get an incorrect frequency.
Yes it may fetch the current frequency (or last known one), but that
shouldn't be a problem as the postchange notification for policy-6
should get called right after and should fix the issue. Right ?
I don't think this is a race and if this requires fixing. clk_get()
for any device, will always return the last configured value, while
the clock might be changing at the same time.
What's important is that you don't get an incorrect frequency (as in
based on intermediate values of registers, etc). Note that the last
configured frequency isn't an incorrect frequency.
> cpufreq policy-0 -> set frequency -> CCI governor get
> CPUFREQ_POSTCHANGE NB -> choose CCI frequency -> set CCI frequency
> => during this time, the CCI governor gets policy-0 and policy-6, BUT
> policy-6 may change frequency by cpufreq driver at the same time.
Sure, and I don't see a problem with that. The issue is there only if
we can reach a state where CCI is left configured in the wrong state.
Which I don't think would happen here as the postchange notifier will
get called again, forcing a switch of frequency again.
--
viresh
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition
2025-03-24 5:43 ` Viresh Kumar
@ 2025-04-14 8:42 ` Chun-Jen Tseng (曾俊仁)
2025-04-16 8:05 ` Viresh Kumar
0 siblings, 1 reply; 21+ messages in thread
From: Chun-Jen Tseng (曾俊仁) @ 2025-04-14 8:42 UTC (permalink / raw)
To: viresh.kumar@linaro.org
Cc: cw00.choi@samsung.com, rafael@kernel.org,
Project_Global_Chrome_Upstream_Group, AngeloGioacchino Del Regno,
myungjoo.ham@samsung.com, linux-kernel@vger.kernel.org,
kyungmin.park@samsung.com, linux-arm-kernel@lists.infradead.org,
matthias.bgg@gmail.com, linux-pm@vger.kernel.org,
linux-mediatek@lists.infradead.org
Hi Viresh,
The CCI level choose by Max_Level(LCPU & BCPU frequency) in devfreq
driver.
without global lock, It may choose wrong CCI level and cause system
stall.
I hope this flow is serial setting like, BCPU / LCPU set frequency ->
set CCI level -> BCPU / LCPU set frequency -> set CCI level -> ......
without global lock, it could be LCPU / BCPU set frequency -> set CCI
level(during this time, it may change BCPU / LCPU frequency and cause
system stall.
I also can only do global lock on ccifreq_support SoC.
BRs,
Mark Tseng
On Mon, 2025-03-24 at 11:13 +0530, Viresh Kumar wrote:
>
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>
>
> Hi,
>
> Thanks for sharing the details this time, it makes it much clearer
> now.
>
> On 24-03-25, 03:21, Chun-Jen Tseng (曾俊仁) wrote:
> > I think the best configuration sequence is as follows:
> > cpufreq policy -> set frequency -> CCI governor get
> > CPUFREQ_POSTCHANGE NB -> choose CCI frequency -> set CCI frequency
> >
> > However, in drivers/devfreq/governor_passive.c#L77,
> > get_target_freq_with_cpufreq() retrieves the current frequency of
> > each
> > policy,
> > and it determines the CCI frequency based on the frequency of each
> > policy.
> >
> > But if policy-0 and policy-6 enter simultaneously, the CCI governor
> > might get an incorrect frequency.
>
> Yes it may fetch the current frequency (or last known one), but that
> shouldn't be a problem as the postchange notification for policy-6
> should get called right after and should fix the issue. Right ?
>
> I don't think this is a race and if this requires fixing. clk_get()
> for any device, will always return the last configured value, while
> the clock might be changing at the same time.
>
> What's important is that you don't get an incorrect frequency (as in
> based on intermediate values of registers, etc). Note that the last
> configured frequency isn't an incorrect frequency.
>
> > cpufreq policy-0 -> set frequency -> CCI governor get
> > CPUFREQ_POSTCHANGE NB -> choose CCI frequency -> set CCI frequency
> > => during this time, the CCI governor gets policy-0 and policy-6,
> > BUT
> > policy-6 may change frequency by cpufreq driver at the same time.
>
> Sure, and I don't see a problem with that. The issue is there only if
> we can reach a state where CCI is left configured in the wrong state.
> Which I don't think would happen here as the postchange notifier will
> get called again, forcing a switch of frequency again.
>
> --
> viresh
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition
2025-04-14 8:42 ` Chun-Jen Tseng (曾俊仁)
@ 2025-04-16 8:05 ` Viresh Kumar
2025-08-28 13:26 ` Chen-Yu Tsai
0 siblings, 1 reply; 21+ messages in thread
From: Viresh Kumar @ 2025-04-16 8:05 UTC (permalink / raw)
To: Chun-Jen Tseng (曾俊仁)
Cc: cw00.choi@samsung.com, rafael@kernel.org,
Project_Global_Chrome_Upstream_Group, AngeloGioacchino Del Regno,
myungjoo.ham@samsung.com, linux-kernel@vger.kernel.org,
kyungmin.park@samsung.com, linux-arm-kernel@lists.infradead.org,
matthias.bgg@gmail.com, linux-pm@vger.kernel.org,
linux-mediatek@lists.infradead.org
On 14-04-25, 08:42, Chun-Jen Tseng (曾俊仁) wrote:
> Hi Viresh,
>
> The CCI level choose by Max_Level(LCPU & BCPU frequency) in devfreq
> driver.
> without global lock, It may choose wrong CCI level and cause system
> stall.
>
> I hope this flow is serial setting like, BCPU / LCPU set frequency ->
> set CCI level -> BCPU / LCPU set frequency -> set CCI level -> ......
>
> without global lock, it could be LCPU / BCPU set frequency -> set CCI
> level(during this time, it may change BCPU / LCPU frequency and cause
> system stall.
>
> I also can only do global lock on ccifreq_support SoC.
As explained earlier, I don't think there is a race here. May be I am
wrong. And so I need a clear code path example from you, which proves
that there is a race here.
--
viresh
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition
2025-04-16 8:05 ` Viresh Kumar
@ 2025-08-28 13:26 ` Chen-Yu Tsai
2025-08-29 5:47 ` Viresh Kumar
0 siblings, 1 reply; 21+ messages in thread
From: Chen-Yu Tsai @ 2025-08-28 13:26 UTC (permalink / raw)
To: Viresh Kumar, myungjoo.ham@samsung.com, kyungmin.park@samsung.com,
cw00.choi@samsung.com
Cc: Chun-Jen Tseng (曾俊仁), rafael@kernel.org,
Project_Global_Chrome_Upstream_Group, AngeloGioacchino Del Regno,
linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org, matthias.bgg@gmail.com,
linux-pm@vger.kernel.org, linux-mediatek@lists.infradead.org
On Wed, Apr 16, 2025 at 4:07 PM Viresh Kumar <viresh.kumar@linaro.org> wrote:
>
> On 14-04-25, 08:42, Chun-Jen Tseng (曾俊仁) wrote:
> > Hi Viresh,
> >
> > The CCI level choose by Max_Level(LCPU & BCPU frequency) in devfreq
> > driver.
> > without global lock, It may choose wrong CCI level and cause system
> > stall.
> >
> > I hope this flow is serial setting like, BCPU / LCPU set frequency ->
> > set CCI level -> BCPU / LCPU set frequency -> set CCI level -> ......
> >
> > without global lock, it could be LCPU / BCPU set frequency -> set CCI
> > level(during this time, it may change BCPU / LCPU frequency and cause
> > system stall.
> >
> > I also can only do global lock on ccifreq_support SoC.
>
> As explained earlier, I don't think there is a race here. May be I am
> wrong. And so I need a clear code path example from you, which proves
> that there is a race here.
Maybe a different set of eyes will help. I talked to Chun-Jen offline,
and I'll try to explain what I understand.
First of all, the issue lies not in cpufreq, but in the CCI devfreq,
and how the passive devfreq governor is linked to cpufreq.
The CCI hardware unit on the MT8186 is sensitive to frequency changes.
If the performance level of the CCI unit is much lower than either
of the CPU clusters, it will hard hang the whole system. So the CCI
devfreq must always take into account the performance level of both
clusters, or in other words the settings of both cpufreq policies.
Since the cpufreq policies only serialize with themselves, it is possible
for one policy to change and trigger a devfreq update, and when the
CCI devfreq driver is doing its calculations, the other policy changes
and causes a big deviation from the assumed performance levels, leaving the
CCI into a non-matching performance level and causing a system hang.
So I think we need to handle CPUFREQ_PRECHANGE events for the frequency
increase direction, as well as enlarging the devfreq mutex to cover
the CPU frequency tracking bits in the passive governor.
I hope that makes sense.
Thanks
ChenYu
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition
2025-08-28 13:26 ` Chen-Yu Tsai
@ 2025-08-29 5:47 ` Viresh Kumar
0 siblings, 0 replies; 21+ messages in thread
From: Viresh Kumar @ 2025-08-29 5:47 UTC (permalink / raw)
To: Chen-Yu Tsai
Cc: myungjoo.ham@samsung.com, kyungmin.park@samsung.com,
cw00.choi@samsung.com, Chun-Jen Tseng (曾俊仁),
rafael@kernel.org, Project_Global_Chrome_Upstream_Group,
AngeloGioacchino Del Regno, linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org, matthias.bgg@gmail.com,
linux-pm@vger.kernel.org, linux-mediatek@lists.infradead.org
On 28-08-25, 15:26, Chen-Yu Tsai wrote:
> Maybe a different set of eyes will help. I talked to Chun-Jen offline,
> and I'll try to explain what I understand.
>
> First of all, the issue lies not in cpufreq, but in the CCI devfreq,
> and how the passive devfreq governor is linked to cpufreq.
>
> The CCI hardware unit on the MT8186 is sensitive to frequency changes.
> If the performance level of the CCI unit is much lower than either
> of the CPU clusters, it will hard hang the whole system. So the CCI
> devfreq must always take into account the performance level of both
> clusters, or in other words the settings of both cpufreq policies.
>
> Since the cpufreq policies only serialize with themselves, it is possible
> for one policy to change and trigger a devfreq update, and when the
> CCI devfreq driver is doing its calculations, the other policy changes
> and causes a big deviation from the assumed performance levels, leaving the
> CCI into a non-matching performance level and causing a system hang.
>
> So I think we need to handle CPUFREQ_PRECHANGE events for the frequency
> increase direction, as well as enlarging the devfreq mutex to cover
> the CPU frequency tracking bits in the passive governor.
>
> I hope that makes sense.
If some sort of serialization is required in the CCI driver, then a
lock must be present there to prevent the issues.
--
viresh
^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2025-08-29 5:56 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-14 7:43 [PATCH v3 0/3] fixed mediatek-cpufreq has multi policy concurrency issue Mark Tseng
2025-02-14 7:43 ` [PATCH v3 1/3] cpufreq: mediatek: using global lock avoid race condition Mark Tseng
2025-02-19 5:42 ` Viresh Kumar
2025-03-20 8:22 ` Chun-Jen Tseng (曾俊仁)
2025-03-21 4:56 ` Viresh Kumar
2025-03-21 5:32 ` Chun-Jen Tseng (曾俊仁)
2025-03-21 6:01 ` Viresh Kumar
2025-03-24 3:21 ` Chun-Jen Tseng (曾俊仁)
2025-03-24 5:43 ` Viresh Kumar
2025-04-14 8:42 ` Chun-Jen Tseng (曾俊仁)
2025-04-16 8:05 ` Viresh Kumar
2025-08-28 13:26 ` Chen-Yu Tsai
2025-08-29 5:47 ` Viresh Kumar
2025-02-19 7:23 ` Dan Carpenter
2025-03-20 8:25 ` Chun-Jen Tseng (曾俊仁)
2025-02-14 7:43 ` [PATCH v3 2/3] cpufreq: mediatek: Add CPUFREQ_ASYNC_NOTIFICATION flag Mark Tseng
2025-02-19 5:45 ` Viresh Kumar
2025-03-20 8:34 ` Chun-Jen Tseng (曾俊仁)
2025-03-21 4:59 ` Viresh Kumar
2025-02-14 7:43 ` [PATCH v3 3/3] cpufreq: mediatek: data safety protect Mark Tseng
2025-02-19 5:49 ` Viresh Kumar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).