On Fri, Nov 12, 2021 at 06:28:16PM +0000, Andrew Cooper wrote:
> powernow_register_driver() is currently written with a K&R type definition;
> I'm surprised that compilers don't object to a mismatch with its declaration,
> which is written in an ANSI-C compatible way.
> 
> Furthermore, its sole caller is cpufreq_driver_init() which is a pre-smp
> initcall.  There are no other online CPUs, and even if there were, checking
> the BSP's CPUID data $N times is pointless.  Simplify registration to only
> look at the BSP.

I guess an extra safety would be to add some check for the cpuid bit
in the AP boot path if the cpufreq driver is enabled.

> 
> While at it, drop obviously unused includes.  Also rewrite the expression in
> cpufreq_driver_init() for clarity.
> 
> Signed-off-by: Andrew Cooper <andrew.coop...@citrix.com>
> ---
> CC: Jan Beulich <jbeul...@suse.com>
> CC: Roger Pau Monné <roger....@citrix.com>
> CC: Wei Liu <w...@xen.org>
> ---
>  xen/arch/x86/acpi/cpufreq/cpufreq.c  | 20 +++++++++++++-------
>  xen/arch/x86/acpi/cpufreq/powernow.c | 28 ++++++----------------------
>  2 files changed, 19 insertions(+), 29 deletions(-)
> 
> diff --git a/xen/arch/x86/acpi/cpufreq/cpufreq.c 
> b/xen/arch/x86/acpi/cpufreq/cpufreq.c
> index f1f3c6923fb3..2251c87f9e42 100644
> --- a/xen/arch/x86/acpi/cpufreq/cpufreq.c
> +++ b/xen/arch/x86/acpi/cpufreq/cpufreq.c
> @@ -640,13 +640,19 @@ static int __init cpufreq_driver_init(void)
>  {
>      int ret = 0;
>  
> -    if ((cpufreq_controller == FREQCTL_xen) &&
> -        (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL))
> -        ret = cpufreq_register_driver(&acpi_cpufreq_driver);
> -    else if ((cpufreq_controller == FREQCTL_xen) &&
> -        (boot_cpu_data.x86_vendor &
> -         (X86_VENDOR_AMD | X86_VENDOR_HYGON)))
> -        ret = powernow_register_driver();
> +    if ( cpufreq_controller == FREQCTL_xen )
> +    {
> +        switch ( boot_cpu_data.x86_vendor )
> +        {
> +        case X86_VENDOR_INTEL:
> +            ret = cpufreq_register_driver(&acpi_cpufreq_driver);
> +            break;
> +
> +        case X86_VENDOR_AMD | X86_VENDOR_HYGON:

This should be two separate case statements.

With this fixed:

Reviewed-by: Roger Pau Monné <roger....@citrix.com>

One rant below about getting rid of powernow_register_driver.

> +            ret = powernow_register_driver();
> +            break;
> +        }
> +    }
>  
>      return ret;
>  }
> diff --git a/xen/arch/x86/acpi/cpufreq/powernow.c 
> b/xen/arch/x86/acpi/cpufreq/powernow.c
> index f620bebc7e91..80095dfd14b4 100644
> --- a/xen/arch/x86/acpi/cpufreq/powernow.c
> +++ b/xen/arch/x86/acpi/cpufreq/powernow.c
> @@ -24,13 +24,9 @@
>  #include <xen/types.h>
>  #include <xen/errno.h>
>  #include <xen/init.h>
> -#include <xen/delay.h>
>  #include <xen/cpumask.h>
> -#include <xen/timer.h>
>  #include <xen/xmalloc.h>
> -#include <asm/bug.h>
>  #include <asm/msr.h>
> -#include <asm/io.h>
>  #include <asm/processor.h>
>  #include <asm/cpufeature.h>
>  #include <acpi/acpi.h>
> @@ -353,25 +349,13 @@ static const struct cpufreq_driver __initconstrel 
> powernow_cpufreq_driver = {
>      .update = powernow_cpufreq_update
>  };
>  
> -unsigned int __init powernow_register_driver()
> +unsigned int __init powernow_register_driver(void)
>  {
> -    unsigned int i, ret = 0;
> +    if ( !(boot_cpu_data.x86_vendor & (X86_VENDOR_AMD | X86_VENDOR_HYGON)) )
> +        return -ENODEV;
>  
> -    for_each_online_cpu(i) {
> -        struct cpuinfo_x86 *c = &cpu_data[i];
> -        if (!(c->x86_vendor & (X86_VENDOR_AMD | X86_VENDOR_HYGON)))
> -            ret = -ENODEV;
> -        else
> -        {
> -            u32 eax, ebx, ecx, edx;
> -            cpuid(CPUID_FREQ_VOLT_CAPABILITIES, &eax, &ebx, &ecx, &edx);
> -            if ((edx & USE_HW_PSTATE) != USE_HW_PSTATE)
> -                ret = -ENODEV;
> -        }
> -        if (ret)
> -            return ret;
> -    }
> +    if ( !(cpuid_edx(CPUID_FREQ_VOLT_CAPABILITIES) & USE_HW_PSTATE) )
> +        return -ENODEV;

I wonder if we could move this check into cpufreq_driver_init and get
rid of powernow_register_driver.

Thanks, Roger.

Reply via email to