|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 10/19] xen/sysctl: introduce CONFIG_PM_STATS
On 26.03.2025 06:50, Penny Zheng wrote:
> We intend to introduce CONFIG_PM_STATS for wrapping all operations
> regarding performance management statistics.
> The major codes reside in xen/drivers/acpi/pmstat.c, including two main
> pm-related sysctl op: do_get_pm_info() and do_pm_op().
> So This commit also makes CONFIG_PM_STATS depend on CONFIG_SYSCTL
>
> Signed-off-by: Penny Zheng <Penny.Zheng@xxxxxxx>
> ---
> v1 -> v2:
> - rename to CONFIG_PM_STATS
> - fix indention and stray semicolon
> - make code movements into a new commit
> - No need to wrap inline functions and declarations
> ---
> xen/arch/x86/acpi/cpu_idle.c | 2 ++
> xen/arch/x86/acpi/cpufreq/hwp.c | 6 ++++++
> xen/arch/x86/acpi/cpufreq/powernow.c | 4 ++++
> xen/common/Kconfig | 5 +++++
> xen/common/sysctl.c | 4 ++--
> xen/drivers/acpi/Makefile | 2 +-
> xen/drivers/cpufreq/cpufreq_misc_governors.c | 2 ++
> xen/drivers/cpufreq/cpufreq_ondemand.c | 2 ++
> xen/include/acpi/cpufreq/processor_perf.h | 14 ++++++++++++++
> 9 files changed, 38 insertions(+), 3 deletions(-)
>
> diff --git a/xen/arch/x86/acpi/cpu_idle.c b/xen/arch/x86/acpi/cpu_idle.c
> index 420198406d..b537ac4cd6 100644
> --- a/xen/arch/x86/acpi/cpu_idle.c
> +++ b/xen/arch/x86/acpi/cpu_idle.c
> @@ -1487,6 +1487,7 @@ static void amd_cpuidle_init(struct
> acpi_processor_power *power)
> vendor_override = -1;
> }
>
> +#ifdef CONFIG_PM_STATS
> uint32_t pmstat_get_cx_nr(unsigned int cpu)
> {
> return processor_powers[cpu] ? processor_powers[cpu]->count : 0;
> @@ -1606,6 +1607,7 @@ int pmstat_reset_cx_stat(unsigned int cpu)
> {
> return 0;
> }
> +#endif /* CONFIG_PM_STATS */
>
> void cpuidle_disable_deep_cstate(void)
> {
> diff --git a/xen/arch/x86/acpi/cpufreq/hwp.c b/xen/arch/x86/acpi/cpufreq/hwp.c
> index d5fa3d47ca..98e9d46890 100644
> --- a/xen/arch/x86/acpi/cpufreq/hwp.c
> +++ b/xen/arch/x86/acpi/cpufreq/hwp.c
> @@ -466,6 +466,7 @@ static int cf_check hwp_cpufreq_cpu_exit(struct
> cpufreq_policy *policy)
> return 0;
> }
>
> +#ifdef CONFIG_PM_STATS
> /*
> * The SDM reads like turbo should be disabled with MSR_IA32_PERF_CTL and
> * PERF_CTL_TURBO_DISENGAGE, but that does not seem to actually work, at
> least
> @@ -508,6 +509,7 @@ static int cf_check hwp_cpufreq_update(unsigned int cpu,
> struct cpufreq_policy *
>
> return per_cpu(hwp_drv_data, cpu)->ret;
> }
> +#endif /* CONFIG_PM_STATS */
>
> static const struct cpufreq_driver __initconst_cf_clobber
> hwp_cpufreq_driver = {
> @@ -516,9 +518,12 @@ hwp_cpufreq_driver = {
> .target = hwp_cpufreq_target,
> .init = hwp_cpufreq_cpu_init,
> .exit = hwp_cpufreq_cpu_exit,
> +#ifdef CONFIG_PM_STATS
> .update = hwp_cpufreq_update,
> +#endif
> };
Something's wrong here: The .update hook is actually making changes, so is
definitely not (only) about statistics. Same for the powernow driver.
> +#ifdef CONFIG_PM_STATS
> int get_hwp_para(unsigned int cpu,
> struct xen_cppc_para *cppc_para)
> {
> @@ -639,6 +644,7 @@ int set_hwp_para(struct cpufreq_policy *policy,
>
> return hwp_cpufreq_target(policy, 0, 0);
> }
> +#endif /* CONFIG_PM_STATS */
This also isn't about statistics, but about getting / setting parameters.
> --- a/xen/common/Kconfig
> +++ b/xen/common/Kconfig
> @@ -557,4 +557,9 @@ config SYSCTL
> to reduce Xen footprint.
> endmenu
>
> +config PM_STATS
> + bool "Enable Performance Management Statistics"
> + depends on ACPI && HAS_CPUFREQ && SYSCTL
> + default y
As per above - either name, prompt and the description that Stefano suggested
are wrong, or it is too much that is being covered by this new control.
> --- a/xen/drivers/cpufreq/cpufreq_misc_governors.c
> +++ b/xen/drivers/cpufreq/cpufreq_misc_governors.c
> @@ -64,6 +64,7 @@ static int cf_check cpufreq_governor_userspace(
> return ret;
> }
>
> +#ifdef CONFIG_PM_STATS
> int write_userspace_scaling_setspeed(unsigned int cpu, unsigned int freq)
> {
> struct cpufreq_policy *policy;
> @@ -80,6 +81,7 @@ int write_userspace_scaling_setspeed(unsigned int cpu,
> unsigned int freq)
>
> return __cpufreq_driver_target(policy, freq, CPUFREQ_RELATION_L);
> }
> +#endif /* CONFIG_PM_STATS */
Here the name of the function also makes pretty clear that it isn't about
statistics.
> --- a/xen/drivers/cpufreq/cpufreq_ondemand.c
> +++ b/xen/drivers/cpufreq/cpufreq_ondemand.c
> @@ -57,6 +57,7 @@ static struct dbs_tuners {
>
> static DEFINE_PER_CPU(struct timer, dbs_timer);
>
> +#ifdef CONFIG_PM_STATS
> int write_ondemand_sampling_rate(unsigned int sampling_rate)
> {
> if ( (sampling_rate > MAX_SAMPLING_RATE / MICROSECS(1)) ||
> @@ -93,6 +94,7 @@ int get_cpufreq_ondemand_para(uint32_t *sampling_rate_max,
>
> return 0;
> }
> +#endif /* CONFIG_PM_STATS */
Same for the ones here.
> --- a/xen/include/acpi/cpufreq/processor_perf.h
> +++ b/xen/include/acpi/cpufreq/processor_perf.h
> @@ -9,9 +9,23 @@
>
> unsigned int powernow_register_driver(void);
> unsigned int get_measured_perf(unsigned int cpu, unsigned int flag);
> +#ifdef CONFIG_PM_STATS
> void cpufreq_statistic_update(unsigned int cpu, uint8_t from, uint8_t to);
> int cpufreq_statistic_init(unsigned int cpu);
> void cpufreq_statistic_exit(unsigned int cpu);
> +#else
> +static inline void cpufreq_statistic_update(unsigned int cpu, uint8_t from,
> + uint8_t to)
> +{
> +}
This could do with both braces moved to the line with the closing parenthesis.
> +static inline int cpufreq_statistic_init(unsigned int cpu)
> +{
> + return 0;
> +}
> +static inline void cpufreq_statistic_exit(unsigned int cpu)
> +{
> +}
Same here.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |