[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] [retry 2] 3/3 Add support for AMD MPERF/APERF



This is patch 1/3 again, not patch 3/3. I would also like an Ack from Yu Ke
for patches 1/3 and 3/3 (when you resend it).

 Thanks,
 Keir

On 31/03/2010 01:58, "Mark Langsdorf" <mark.langsdorf@xxxxxxx> wrote:

> # HG changeset patch
> # User mark.langsdorf@xxxxxxx
> # Date 1270010993 18000
> # Node ID 9da598418e6da7758a799e116dc8bf3c3ed2f473
> # 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@xxxxxxx>
> 
> diff -r ebd84be3420a -r 9da598418e6d 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       Tue Mar 30 23:49:53 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 9da598418e6d tools/libxc/xenctrl.h
> --- a/tools/libxc/xenctrl.h     Tue Mar 30 18:31:39 2010 +0100
> +++ b/tools/libxc/xenctrl.h     Tue Mar 30 23:49:53 2010 -0500
> @@ -1276,6 +1276,7 @@
>      char scaling_governor[CPUFREQ_NAME_LEN];
>      uint32_t scaling_max_freq;
>      uint32_t scaling_min_freq;
> +    int32_t turbo_enabled;
> 
>      /* for specific governor */
>      union {
> diff -r ebd84be3420a -r 9da598418e6d tools/misc/xenpm.c
> --- a/tools/misc/xenpm.c        Tue Mar 30 18:31:39 2010 +0100
> +++ b/tools/misc/xenpm.c        Tue Mar 30 23:49:53 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 9da598418e6d 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       Tue Mar 30 23:49:53 2010 -0500
> @@ -410,6 +410,10 @@
>          return -ENODEV;
>      }
> 
> +    if (policy->turbo == -1)
> +        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 = 1;
> +            printk(XENLOG_INFO "Turbo Mode detected and enabled!\n");
> +        }
>      }
> 
>      /*
> diff -r ebd84be3420a -r 9da598418e6d 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 Tue Mar 30 23:49:53 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 9da598418e6d 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    Tue Mar 30 23:49:53 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 9da598418e6d 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     Tue Mar 30 23:49:53 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 9da598418e6d 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        Tue Mar 30 23:49:53 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 9da598418e6d 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 Tue Mar 30 23:49:53 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 9da598418e6d 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       Tue Mar 30 23:49:53 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;
> 
> @@ -328,6 +327,7 @@
>      char scaling_governor[CPUFREQ_NAME_LEN];
>      uint32_t scaling_max_freq;
>      uint32_t scaling_min_freq;
> +    int32_t turbo_enabled;
> 
>      /* for specific governor */
>      union {
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.