Message ID | 9d1ba8e29feddcfcee0b8a91be3d6950bfa00720.1718787627.git.perry.yuan@amd.com |
---|---|
State | Superseded |
Headers | show |
Series | AMD Pstate Driver Core Performance Boost | expand |
On 6/19/2024 04:16, Perry Yuan wrote: > Introduce a new init_boost callback in cpufreq to initialize the boost > state for specific pstate drivers. This initialization is required before > calling the set_boost interface for each CPU. > > The init_boost callback will set up and synchronize each CPU's current > boost state before invoking the set_boost function. Without this step, > the boost state may be inconsistent across CPUs. > > Signed-off-by: Perry Yuan <perry.yuan@amd.com> > --- > drivers/cpufreq/cpufreq.c | 13 +++++++++++-- > include/linux/cpufreq.h | 2 ++ > 2 files changed, 13 insertions(+), 2 deletions(-) > > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c > index 1fdabb660231..64c6770e24c8 100644 > --- a/drivers/cpufreq/cpufreq.c > +++ b/drivers/cpufreq/cpufreq.c > @@ -1429,8 +1429,17 @@ static int cpufreq_online(unsigned int cpu) > goto out_free_policy; > } > > - /* Let the per-policy boost flag mirror the cpufreq_driver boost during init */ > - policy->boost_enabled = cpufreq_boost_enabled() && policy_has_boost_freq(policy); > + /* init boost state to prepare set_boost callback for each CPU */ > + if (cpufreq_driver->init_boost) { > + ret = cpufreq_driver->init_boost(policy); > + if (ret) > + pr_debug("%s: %d: boost initialization failed\n", __func__, > + __LINE__); > + goto out_offline_policy; You've got a mistake here that you're missing curly braces around the "if (ret)" block. So what's going to happen with this code is that no matter if init_boost() succeeds then you'll still offline the policy. > + } else { > + /* Let the per-policy boost flag mirror the cpufreq_driver boost during init */ > + policy->boost_enabled = cpufreq_boost_enabled() && policy_has_boost_freq(policy); > + } > > /* > * The initialization has succeeded and the policy is online. > diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h > index 20f7e98ee8af..0698c0292d8f 100644 > --- a/include/linux/cpufreq.h > +++ b/include/linux/cpufreq.h > @@ -409,6 +409,8 @@ struct cpufreq_driver { > bool boost_enabled; > int (*set_boost)(struct cpufreq_policy *policy, int state); > > + /* initialize boost state to be consistent before calling set_boost */ > + int (*init_boost)(struct cpufreq_policy *policy); > /* > * Set by drivers that want to register with the energy model after the > * policy is properly initialized, but before the governor is started.
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 1fdabb660231..64c6770e24c8 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -1429,8 +1429,17 @@ static int cpufreq_online(unsigned int cpu) goto out_free_policy; } - /* Let the per-policy boost flag mirror the cpufreq_driver boost during init */ - policy->boost_enabled = cpufreq_boost_enabled() && policy_has_boost_freq(policy); + /* init boost state to prepare set_boost callback for each CPU */ + if (cpufreq_driver->init_boost) { + ret = cpufreq_driver->init_boost(policy); + if (ret) + pr_debug("%s: %d: boost initialization failed\n", __func__, + __LINE__); + goto out_offline_policy; + } else { + /* Let the per-policy boost flag mirror the cpufreq_driver boost during init */ + policy->boost_enabled = cpufreq_boost_enabled() && policy_has_boost_freq(policy); + } /* * The initialization has succeeded and the policy is online. diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 20f7e98ee8af..0698c0292d8f 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h @@ -409,6 +409,8 @@ struct cpufreq_driver { bool boost_enabled; int (*set_boost)(struct cpufreq_policy *policy, int state); + /* initialize boost state to be consistent before calling set_boost */ + int (*init_boost)(struct cpufreq_policy *policy); /* * Set by drivers that want to register with the energy model after the * policy is properly initialized, but before the governor is started.
Introduce a new init_boost callback in cpufreq to initialize the boost state for specific pstate drivers. This initialization is required before calling the set_boost interface for each CPU. The init_boost callback will set up and synchronize each CPU's current boost state before invoking the set_boost function. Without this step, the boost state may be inconsistent across CPUs. Signed-off-by: Perry Yuan <perry.yuan@amd.com> --- drivers/cpufreq/cpufreq.c | 13 +++++++++++-- include/linux/cpufreq.h | 2 ++ 2 files changed, 13 insertions(+), 2 deletions(-)