1/3 Refactor Xen Support for Intel Turbo Boost
PATCH 1/1 1/3 Refactor Xen Support for Intel Turbo Boost
# HG changeset patch
# User [email protected]
# Date 1270762520 18000
# Node ID eb2bb327c7d33a3a2f2ed2ab56e1fa1045733f97
# Parent 3376c90960e83d9f1e34d51601a930290a128c09 Refactor the existing code that supports the Intel Turbo feature to move all the driver specific bits in the cpufreq driver. Create a tri-state interface for the Turbo feature that can distinguish amongst enabled Turbo, disabled Turbo, and processors that don't support Turbo at all.
tools/libxc/xc_pm.c +1 -0
@@ -247,6 +247,7 @@ user_para->scaling_cur_freq = sys_para->scaling_cur_freq; user_para->scaling_max_freq = sys_para->scaling_max_freq; user_para->scaling_min_freq = sys_para->scaling_min_freq; + user_para->turbo_enabled = sys_para->turbo_enabled;memcpy (user_para->scaling_driver, sys_para->scaling_driver,CPUFREQ_NAME_LEN );
tools/libxc/xenctrl.h +2 -0
@@ -1282,6 +1282,8 @@xc_userspace_t userspace;xc_ondemand_t ondemand; } u; + +int32_t turbo_enabled; }; int xc_get_cpufreq_para(int xc_handle, int cpuid,
tools/misc/xenpm.c +14 -4
@@ -30,6 +30,10 @@#define ARRAY_SIZE (a) (sizeof (a) / sizeof ((a)[0])) +#define CPUFREQ_TURBO_DISABLED -1 +#define CPUFREQ_TURBO_UNSUPPORTED 0 +#define CPUFREQ_TURBO_ENABLED 1 +static int xc_fd;static int max_cpu_nr;
@@ -62,8 +66,8 @@" set-max-cstate <num> set the C-State limitation (<num> >= 0)\n" " start [seconds] start collect Cx/Px statistics,\n" " output after CTRL-C or SIGINT or several seconds.\n" -" enable-turbo-mode [cpuid] enable Turbo Mode in DBS governor.\n" -" disable-turbo-mode [cpuid] disable Turbo Mode in DBS governor.\n" +" enable-turbo-mode [cpuid] enable Turbo Mode for processors that support it.\n" +" disable-turbo-mode [cpuid] disable Turbo Mode for processors that support it.\n" ); }/* wrapper function */
@@ -529,8 +533,6 @@ p_cpufreq->u.ondemand.sampling_rate);printf (" up_threshold : %u\n" , p_cpufreq->u.ondemand.up_threshold); -printf (" turbo mode : %s\n" , - p_cpufreq->u.ondemand.turbo_enabled ?"enabled" :"disabled" ); }printf ("scaling_avail_freq :" );
@@ -546,6 +548,13 @@ p_cpufreq->scaling_max_freq, p_cpufreq->scaling_min_freq, p_cpufreq->scaling_cur_freq); +if (p_cpufreq->turbo_enabled !=CPUFREQ_TURBO_UNSUPPORTED ) { +printf ("turbo mode : " ); +if (p_cpufreq->turbo_enabled ==CPUFREQ_TURBO_ENABLED ) +printf ("enabled\n" ); +else +printf ("disabled\n" ); + }printf ("\n" ); }
@@ -561,6 +570,7 @@ p_cpufreq->affected_cpus =NULL ; p_cpufreq->scaling_available_frequencies =NULL ; p_cpufreq->scaling_available_governors =NULL ; + p_cpufreq->turbo_enabled =0 ; do {
xen/arch/x86/acpi/cpufreq/cpufreq.c +12 -1
@@ -410,6 +410,10 @@return -ENODEV ; } +if (policy->turbo ==CPUFREQ_TURBO_DISABLED ) +if (target_freq > policy->cpuinfo.second_max_freq) + target_freq = policy->cpuinfo.second_max_freq; + perf = data->acpi_data; result = cpufreq_frequency_table_target(policy, data->freq_table,
@@ -610,12 +614,19 @@break ; } -/* Check for APERF/MPERF support in hardware */ +/* Check for APERF/MPERF support in hardware +* also check for boost support */ if (c->x86_vendor ==X86_VENDOR_INTEL && c->cpuid_level >=6 ) {unsigned int ecx; +unsigned int eax; ecx =cpuid_ecx (6 );if (ecx &CPUID_6_ECX_APERFMPERF_CAPABILITY ) acpi_cpufreq_driver.getavg = get_measured_perf; + eax =cpuid_eax (6 ); +if ( eax &0x2 ) { + policy->turbo =CPUFREQ_TURBO_ENABLED ; +printk (XENLOG_INFO "Turbo Mode detected and enabled!\n" ); + } }/*
xen/drivers/acpi/pmstat.c +3 -4
@@ -299,9 +299,8 @@ &op->u.get_para.u.ondemand.sampling_rate_min, &op->u.get_para.u.ondemand.sampling_rate, &op->u.get_para.u.ondemand.up_threshold); - op->u.get_para.u.ondemand.turbo_enabled = -cpufreq_dbs_get_turbo_status (op->cpuid); } + op->u.get_para.turbo_enabled =cpufreq_get_turbo_status (op->cpuid);return ret; }
@@ -553,13 +552,13 @@case XEN_SYSCTL_pm_op_enable_turbo: { -cpufreq_dbs_enable_turbo (op->cpuid); +cpufreq_enable_turbo (op->cpuid);break ; }case XEN_SYSCTL_pm_op_disable_turbo: { -cpufreq_dbs_disable_turbo (op->cpuid); +cpufreq_disable_turbo (op->cpuid);break ; }
xen/drivers/cpufreq/cpufreq_ondemand.c +0 -31
@@ -58,9 +58,6 @@static struct timer dbs_timer[NR_CPUS ]; -/* Turbo Mode */ -static int turbo_detected =0 ; -int write_ondemand_sampling_rate (unsigned int sampling_rate) { if ( (sampling_rate > MAX_SAMPLING_RATE / MICROSECS(1)) ||
@@ -111,10 +108,6 @@ policy = this_dbs_info->cur_policy; max = policy->max; -if (turbo_detected && !this_dbs_info->turbo_enabled) { -if (max > policy->cpuinfo.second_max_freq) - max = policy->cpuinfo.second_max_freq; - }if (unlikely (policy->resume)) {__cpufreq_driver_target (policy, max,CPUFREQ_RELATION_H );
@@ -276,7 +269,6 @@ }else dbs_tuners_ins.sampling_rate = usr_sampling_rate; } - this_dbs_info->turbo_enabled =1 ;dbs_timer_init (this_dbs_info);break ;
@@ -353,13 +345,6 @@static int __init cpufreq_gov_dbs_init (void ) { -#ifdef CONFIG_X86 -unsigned int eax =cpuid_eax (6 ); -if ( eax &0x2 ) { - turbo_detected =1 ; -printk (XENLOG_INFO "Turbo Mode detected!\n" ); - } -#endif return cpufreq_register_governor (&cpufreq_gov_dbs); }__initcall (cpufreq_gov_dbs_init);
@@ -404,19 +389,3 @@ } } } - -void cpufreq_dbs_enable_turbo (int cpuid) -{ -per_cpu (cpu_dbs_info, cpuid).turbo_enabled =1 ; -} - -void cpufreq_dbs_disable_turbo (int cpuid) -{ -per_cpu (cpu_dbs_info, cpuid).turbo_enabled =0 ; -} - -unsigned int cpufreq_dbs_get_turbo_status (int cpuid) -{ -return turbo_detected &&per_cpu (cpu_dbs_info, cpuid).turbo_enabled; -} -
xen/drivers/cpufreq/utility.c +25 -0
@@ -394,6 +394,31 @@return policy->cur; } +void cpufreq_enable_turbo (int cpuid) +{ +struct cpufreq_policy *policy; + + policy = cpufreq_cpu_policy[cpuid]; +if (policy->turbo !=CPUFREQ_TURBO_UNSUPPORTED ) + policy->turbo =CPUFREQ_TURBO_ENABLED ; +} + +void cpufreq_disable_turbo (int cpuid) +{ +struct cpufreq_policy *policy; + + policy = cpufreq_cpu_policy[cpuid]; +if (policy->turbo !=CPUFREQ_TURBO_UNSUPPORTED ) + policy->turbo =CPUFREQ_TURBO_DISABLED ; +} + +int cpufreq_get_turbo_status (int cpuid) +{ +struct cpufreq_policy *policy; + + policy = cpufreq_cpu_policy[cpuid]; +return policy->turbo; +}/********************************************************************* * POLICY *
xen/include/acpi/cpufreq/cpufreq.h +12 -3
@@ -55,6 +55,9 @@unsigned int resume;/* flag for cpufreq 1st run * S3 wakeup, hotplug cpu, etc */ +int turbo;/* tristate flag: 0 for unsupported +* -1 for disable, 1 for enabled +* See CPUFREQ_TURBO_* below for defines */ };extern struct cpufreq_policy *cpufreq_cpu_policy[NR_CPUS ];
@@ -114,6 +117,15 @@#define USR_GETAVG 2extern int cpufreq_driver_getavg (unsigned int cpu,unsigned int flag); +#define CPUFREQ_TURBO_DISABLED -1 +#define CPUFREQ_TURBO_UNSUPPORTED 0 +#define CPUFREQ_TURBO_ENABLED 1 + +extern void cpufreq_enable_turbo (int cpuid); +extern void cpufreq_disable_turbo (int cpuid); +extern int cpufreq_get_turbo_status (int cpuid); + +static __inline__int __cpufreq_governor (struct cpufreq_policy *policy,unsigned int event) {
@@ -241,7 +253,4 @@void cpufreq_dbs_timer_suspend (void );void cpufreq_dbs_timer_resume (void ); -void cpufreq_dbs_enable_turbo (int cpuid); -void cpufreq_dbs_disable_turbo (int cpuid); -unsigned int cpufreq_dbs_get_turbo_status (int cpuid);#endif /* __XEN_CPUFREQ_PM_H__ */
xen/include/acpi/cpufreq/processor_perf.h +0 -1
@@ -9,7 +9,6 @@int get_cpu_id (u8 );int powernow_cpufreq_init (void );unsigned int powernow_register_driver (void ); -void cpufreq_residency_update (unsigned int ,uint8_t );void cpufreq_statistic_update (unsigned int ,uint8_t ,uint8_t );int cpufreq_statistic_init (unsigned int );
xen/include/public/sysctl.h +2 -1
@@ -298,7 +298,6 @@uint32_t sampling_rate;uint32_t up_threshold; -uint32_t turbo_enabled; };typedef struct xen_ondemand xen_ondemand_t ;
@@ -334,6 +333,8 @@struct xen_userspace userspace;struct xen_ondemand ondemand; } u; + +int32_t turbo_enabled; };struct xen_set_cpufreq_gov {
It looks fine to me. Thanks for the refactoring.
Best Regards
Ke
-----Original Message-----
From: Mark Langsdorf [mailto:[email protected]]
Sent: Friday, April 09, 2010 1:50 AM
To: [email protected]; Yu, Ke
Subject: [PATCH] [retry 4] 1/3 Refactor Xen Support for Intel Turbo Boost
# HG changeset patch
# User [email protected]
# Date 1270762520 18000
# Node ID eb2bb327c7d33a3a2f2ed2ab56e1fa1045733f97
# Parent 3376c90960e83d9f1e34d51601a930290a128c09 Refactor the existing code that supports the Intel Turbo feature to move all the driver specific bits in the cpufreq driver. Create a tri-state interface for the Turbo feature that can distinguish amongst enabled Turbo, disabled Turbo, and processors that don't support Turbo at all.
tools/libxc/xc_pm.c +1 -0
@@ -247,6 +247,7 @@ user_para->scaling_cur_freq = sys_para->scaling_cur_freq; user_para->scaling_max_freq = sys_para->scaling_max_freq; user_para->scaling_min_freq = sys_para->scaling_min_freq; + user_para->turbo_enabled = sys_para->turbo_enabled;memcpy (user_para->scaling_driver, sys_para->scaling_driver,CPUFREQ_NAME_LEN );
tools/libxc/xenctrl.h +2 -0
@@ -1282,6 +1282,8 @@xc_userspace_t userspace;xc_ondemand_t ondemand; } u; + +int32_t turbo_enabled; }; int xc_get_cpufreq_para(int xc_handle, int cpuid,
tools/misc/xenpm.c +14 -4
@@ -30,6 +30,10 @@#define ARRAY_SIZE (a) (sizeof (a) / sizeof ((a)[0])) +#define CPUFREQ_TURBO_DISABLED -1 +#define CPUFREQ_TURBO_UNSUPPORTED 0 +#define CPUFREQ_TURBO_ENABLED 1 +static int xc_fd;static int max_cpu_nr;
@@ -62,8 +66,8 @@" set-max-cstate <num> set the C-State limitation (<num> >= 0)\n" " start [seconds] start collect Cx/Px statistics,\n" " output after CTRL-C or SIGINT or several seconds.\n" -" enable-turbo-mode [cpuid] enable Turbo Mode in DBS governor.\n" -" disable-turbo-mode [cpuid] disable Turbo Mode in DBS governor.\n" +" enable-turbo-mode [cpuid] enable Turbo Mode for processors that support it.\n" +" disable-turbo-mode [cpuid] disable Turbo Mode for processors that support it.\n" ); }/* wrapper function */
@@ -529,8 +533,6 @@ p_cpufreq->u.ondemand.sampling_rate);printf (" up_threshold : %u\n" , p_cpufreq->u.ondemand.up_threshold); -printf (" turbo mode : %s\n" , - p_cpufreq->u.ondemand.turbo_enabled ?"enabled" :"disabled" ); }printf ("scaling_avail_freq :" );
@@ -546,6 +548,13 @@ p_cpufreq->scaling_max_freq, p_cpufreq->scaling_min_freq, p_cpufreq->scaling_cur_freq); +if (p_cpufreq->turbo_enabled !=CPUFREQ_TURBO_UNSUPPORTED ) { +printf ("turbo mode : " ); +if (p_cpufreq->turbo_enabled ==CPUFREQ_TURBO_ENABLED ) +printf ("enabled\n" ); +else +printf ("disabled\n" ); + }printf ("\n" ); }
@@ -561,6 +570,7 @@ p_cpufreq->affected_cpus =NULL ; p_cpufreq->scaling_available_frequencies =NULL ; p_cpufreq->scaling_available_governors =NULL ; + p_cpufreq->turbo_enabled =0 ; do {
xen/arch/x86/acpi/cpufreq/cpufreq.c +12 -1
@@ -410,6 +410,10 @@return -ENODEV ; } +if (policy->turbo ==CPUFREQ_TURBO_DISABLED ) +if (target_freq > policy->cpuinfo.second_max_freq) + target_freq = policy->cpuinfo.second_max_freq; + perf = data->acpi_data; result = cpufreq_frequency_table_target(policy, data->freq_table,
@@ -610,12 +614,19 @@break ; } -/* Check for APERF/MPERF support in hardware */ +/* Check for APERF/MPERF support in hardware +* also check for boost support */ if (c->x86_vendor ==X86_VENDOR_INTEL && c->cpuid_level >=6 ) {unsigned int ecx; +unsigned int eax; ecx =cpuid_ecx (6 );if (ecx &CPUID_6_ECX_APERFMPERF_CAPABILITY ) acpi_cpufreq_driver.getavg = get_measured_perf; + eax =cpuid_eax (6 ); +if ( eax &0x2 ) { + policy->turbo =CPUFREQ_TURBO_ENABLED ; +printk (XENLOG_INFO "Turbo Mode detected and enabled!\n" ); + } }/*
xen/drivers/acpi/pmstat.c +3 -4
@@ -299,9 +299,8 @@ &op->u.get_para.u.ondemand.sampling_rate_min, &op->u.get_para.u.ondemand.sampling_rate, &op->u.get_para.u.ondemand.up_threshold); - op->u.get_para.u.ondemand.turbo_enabled = -cpufreq_dbs_get_turbo_status (op->cpuid); } + op->u.get_para.turbo_enabled =cpufreq_get_turbo_status (op->cpuid);return ret; }
@@ -553,13 +552,13 @@case XEN_SYSCTL_pm_op_enable_turbo: { -cpufreq_dbs_enable_turbo (op->cpuid); +cpufreq_enable_turbo (op->cpuid);break ; }case XEN_SYSCTL_pm_op_disable_turbo: { -cpufreq_dbs_disable_turbo (op->cpuid); +cpufreq_disable_turbo (op->cpuid);break ; }
xen/drivers/cpufreq/cpufreq_ondemand.c +0 -31
@@ -58,9 +58,6 @@static struct timer dbs_timer[NR_CPUS ]; -/* Turbo Mode */ -static int turbo_detected =0 ; -int write_ondemand_sampling_rate (unsigned int sampling_rate) { if ( (sampling_rate > MAX_SAMPLING_RATE / MICROSECS(1)) ||
@@ -111,10 +108,6 @@ policy = this_dbs_info->cur_policy; max = policy->max; -if (turbo_detected && !this_dbs_info->turbo_enabled) { -if (max > policy->cpuinfo.second_max_freq) - max = policy->cpuinfo.second_max_freq; - }if (unlikely (policy->resume)) {__cpufreq_driver_target (policy, max,CPUFREQ_RELATION_H );
@@ -276,7 +269,6 @@ }else dbs_tuners_ins.sampling_rate = usr_sampling_rate; } - this_dbs_info->turbo_enabled =1 ;dbs_timer_init (this_dbs_info);break ;
@@ -353,13 +345,6 @@static int __init cpufreq_gov_dbs_init (void ) { -#ifdef CONFIG_X86 -unsigned int eax =cpuid_eax (6 ); -if ( eax &0x2 ) { - turbo_detected =1 ; -printk (XENLOG_INFO "Turbo Mode detected!\n" ); - } -#endif return cpufreq_register_governor (&cpufreq_gov_dbs); }__initcall (cpufreq_gov_dbs_init);
@@ -404,19 +389,3 @@ } } } - -void cpufreq_dbs_enable_turbo (int cpuid) -{ -per_cpu (cpu_dbs_info, cpuid).turbo_enabled =1 ; -} - -void cpufreq_dbs_disable_turbo (int cpuid) -{ -per_cpu (cpu_dbs_info, cpuid).turbo_enabled =0 ; -} - -unsigned int cpufreq_dbs_get_turbo_status (int cpuid) -{ -return turbo_detected &&per_cpu (cpu_dbs_info, cpuid).turbo_enabled; -} -
xen/drivers/cpufreq/utility.c +25 -0
@@ -394,6 +394,31 @@return policy->cur; } +void cpufreq_enable_turbo (int cpuid) +{ +struct cpufreq_policy *policy; + + policy = cpufreq_cpu_policy[cpuid]; +if (policy->turbo !=CPUFREQ_TURBO_UNSUPPORTED ) + policy->turbo =CPUFREQ_TURBO_ENABLED ; +} + +void cpufreq_disable_turbo (int cpuid) +{ +struct cpufreq_policy *policy; + + policy = cpufreq_cpu_policy[cpuid]; +if (policy->turbo !=CPUFREQ_TURBO_UNSUPPORTED ) + policy->turbo =CPUFREQ_TURBO_DISABLED ; +} + +int cpufreq_get_turbo_status (int cpuid) +{ +struct cpufreq_policy *policy; + + policy = cpufreq_cpu_policy[cpuid]; +return policy->turbo; +}/********************************************************************* * POLICY *
xen/include/acpi/cpufreq/cpufreq.h +12 -3
@@ -55,6 +55,9 @@unsigned int resume;/* flag for cpufreq 1st run * S3 wakeup, hotplug cpu, etc */ +int turbo;/* tristate flag: 0 for unsupported +* -1 for disable, 1 for enabled +* See CPUFREQ_TURBO_* below for defines */ };extern struct cpufreq_policy *cpufreq_cpu_policy[NR_CPUS ];
@@ -114,6 +117,15 @@#define USR_GETAVG 2extern int cpufreq_driver_getavg (unsigned int cpu,unsigned int flag); +#define CPUFREQ_TURBO_DISABLED -1 +#define CPUFREQ_TURBO_UNSUPPORTED 0 +#define CPUFREQ_TURBO_ENABLED 1 + +extern void cpufreq_enable_turbo (int cpuid); +extern void cpufreq_disable_turbo (int cpuid); +extern int cpufreq_get_turbo_status (int cpuid); + +static __inline__int __cpufreq_governor (struct cpufreq_policy *policy,unsigned int event) {
@@ -241,7 +253,4 @@void cpufreq_dbs_timer_suspend (void );void cpufreq_dbs_timer_resume (void ); -void cpufreq_dbs_enable_turbo (int cpuid); -void cpufreq_dbs_disable_turbo (int cpuid); -unsigned int cpufreq_dbs_get_turbo_status (int cpuid);#endif /* __XEN_CPUFREQ_PM_H__ */
xen/include/acpi/cpufreq/processor_perf.h +0 -1
@@ -9,7 +9,6 @@int get_cpu_id (u8 );int powernow_cpufreq_init (void );unsigned int powernow_register_driver (void ); -void cpufreq_residency_update (unsigned int ,uint8_t );void cpufreq_statistic_update (unsigned int ,uint8_t ,uint8_t );int cpufreq_statistic_init (unsigned int );
xen/include/public/sysctl.h +2 -1
@@ -298,7 +298,6 @@uint32_t sampling_rate;uint32_t up_threshold; -uint32_t turbo_enabled; };typedef struct xen_ondemand xen_ondemand_t ;
@@ -334,6 +333,8 @@struct xen_userspace userspace;struct xen_ondemand ondemand; } u; + +int32_t turbo_enabled; };struct xen_set_cpufreq_gov {