Mark Langsdorf
2010-Mar-31 19:24 UTC
[Xen-devel] [PATCH] [retry 3] Refactor Xen support for Intel Turbo Boost
# HG changeset patch # User mark.langsdorf@amd.com # Date 1270061893 18000 # Node ID e86769595f59664124dcc5fef3d10e08338a3ef1 # Parent ebd84be3420a4453b3024d3378d8d84b81f44118 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. Signed-off-by: Mark Langsdorf <mark.langsdorf@amd.com> diff -r ebd84be3420a -r e86769595f59 tools/libxc/xc_pm.c --- a/tools/libxc/xc_pm.c Tue Mar 30 18:31:39 2010 +0100 +++ b/tools/libxc/xc_pm.c Wed Mar 31 13:58:13 2010 -0500 @@ -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); diff -r ebd84be3420a -r e86769595f59 tools/libxc/xenctrl.h --- a/tools/libxc/xenctrl.h Tue Mar 30 18:31:39 2010 +0100 +++ b/tools/libxc/xenctrl.h Wed Mar 31 13:58:13 2010 -0500 @@ -1281,7 +1281,10 @@ union { xc_userspace_t userspace; xc_ondemand_t ondemand; + uint32_t pad[4]; } u; + + int32_t turbo_enabled; }; int xc_get_cpufreq_para(int xc_handle, int cpuid, diff -r ebd84be3420a -r e86769595f59 tools/misc/xenpm.c --- a/tools/misc/xenpm.c Tue Mar 30 18:31:39 2010 +0100 +++ b/tools/misc/xenpm.c Wed Mar 31 13:58:13 2010 -0500 @@ -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 { diff -r ebd84be3420a -r e86769595f59 xen/arch/x86/acpi/cpufreq/cpufreq.c --- a/xen/arch/x86/acpi/cpufreq/cpufreq.c Tue Mar 30 18:31:39 2010 +0100 +++ b/xen/arch/x86/acpi/cpufreq/cpufreq.c Wed Mar 31 13:58:13 2010 -0500 @@ -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"); + } } /* diff -r ebd84be3420a -r e86769595f59 xen/drivers/acpi/pmstat.c --- a/xen/drivers/acpi/pmstat.c Tue Mar 30 18:31:39 2010 +0100 +++ b/xen/drivers/acpi/pmstat.c Wed Mar 31 13:58:13 2010 -0500 @@ -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; } diff -r ebd84be3420a -r e86769595f59 xen/drivers/cpufreq/cpufreq_ondemand.c --- a/xen/drivers/cpufreq/cpufreq_ondemand.c Tue Mar 30 18:31:39 2010 +0100 +++ b/xen/drivers/cpufreq/cpufreq_ondemand.c Wed Mar 31 13:58:13 2010 -0500 @@ -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; -} - diff -r ebd84be3420a -r e86769595f59 xen/drivers/cpufreq/utility.c --- a/xen/drivers/cpufreq/utility.c Tue Mar 30 18:31:39 2010 +0100 +++ b/xen/drivers/cpufreq/utility.c Wed Mar 31 13:58:13 2010 -0500 @@ -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 * diff -r ebd84be3420a -r e86769595f59 xen/include/acpi/cpufreq/cpufreq.h --- a/xen/include/acpi/cpufreq/cpufreq.h Tue Mar 30 18:31:39 2010 +0100 +++ b/xen/include/acpi/cpufreq/cpufreq.h Wed Mar 31 13:58:13 2010 -0500 @@ -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 2 extern 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__ */ diff -r ebd84be3420a -r e86769595f59 xen/include/acpi/cpufreq/processor_perf.h --- a/xen/include/acpi/cpufreq/processor_perf.h Tue Mar 30 18:31:39 2010 +0100 +++ b/xen/include/acpi/cpufreq/processor_perf.h Wed Mar 31 13:58:13 2010 -0500 @@ -9,6 +9,7 @@ int get_cpu_id(u8); int powernow_cpufreq_init(void); unsigned int powernow_register_driver(void); +unsigned int get_measured_perf(unsigned int cpu, unsigned int flag); void cpufreq_residency_update(unsigned int, uint8_t); void cpufreq_statistic_update(unsigned int, uint8_t, uint8_t); diff -r ebd84be3420a -r e86769595f59 xen/include/public/sysctl.h --- a/xen/include/public/sysctl.h Tue Mar 30 18:31:39 2010 +0100 +++ b/xen/include/public/sysctl.h Wed Mar 31 13:58:13 2010 -0500 @@ -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 { _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Yu, Ke
2010-Apr-01 04:44 UTC
[Xen-devel] RE: [PATCH] [retry 3] Refactor Xen support for Intel Turbo Boost
> -----Original Message----- > From: Mark Langsdorf [mailto:mark.langsdorf@amd.com] > Sent: Thursday, April 01, 2010 3:25 AM > To: xen-devel@lists.xensource.com; Yu, Ke > Subject: [PATCH] [retry 3] Refactor Xen support for Intel Turbo Boost > > diff -r ebd84be3420a -r e86769595f59 tools/libxc/xenctrl.h > --- a/tools/libxc/xenctrl.h Tue Mar 30 18:31:39 2010 +0100 > +++ b/tools/libxc/xenctrl.h Wed Mar 31 13:58:13 2010 -0500 > @@ -1281,7 +1281,10 @@ > union { > xc_userspace_t userspace; > xc_ondemand_t ondemand; > + uint32_t pad[4]; > } u; > + > + int32_t turbo_enabled; > };xen_get_cpufreq_para.u and xc_get_cpufreq_para.u should have the same definition, since current code (xc_get_cpufreq_para function) use memcpy to transfer data between xen_get_cpufreq_para.u and xc_get_cpufreq_para.u. So padding is not needed here, as we discussed in previous email.> > int xc_get_cpufreq_para(int xc_handle, int cpuid, > diff -r ebd84be3420a -r e86769595f59 > xen/include/acpi/cpufreq/processor_perf.h > --- a/xen/include/acpi/cpufreq/processor_perf.h Tue Mar 30 18:31:39 > 2010 +0100 > +++ b/xen/include/acpi/cpufreq/processor_perf.h Wed Mar 31 13:58:13 > 2010 -0500 > @@ -9,6 +9,7 @@ > int get_cpu_id(u8); > int powernow_cpufreq_init(void); > unsigned int powernow_register_driver(void); > +unsigned int get_measured_perf(unsigned int cpu, unsigned int flag);Shouldn''t this be in patch 3? _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel