|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [PATCH v6 11/19] xen/x86: introduce "cpufreq=amd-cppc" xen cmdline and amd-cppc driver
[Public]
> -----Original Message-----
> From: Jan Beulich <jbeulich@xxxxxxxx>
> Sent: Thursday, July 17, 2025 12:00 AM
> To: Penny, Zheng <penny.zheng@xxxxxxx>
> Cc: Huang, Ray <Ray.Huang@xxxxxxx>; Andrew Cooper
> <andrew.cooper3@xxxxxxxxxx>; Anthony PERARD <anthony.perard@xxxxxxxxxx>;
> Orzel, Michal <Michal.Orzel@xxxxxxx>; Julien Grall <julien@xxxxxxx>; Roger Pau
> Monné <roger.pau@xxxxxxxxxx>; Stefano Stabellini <sstabellini@xxxxxxxxxx>;
> xen-
> devel@xxxxxxxxxxxxxxxxxxxx
> Subject: Re: [PATCH v6 11/19] xen/x86: introduce "cpufreq=amd-cppc" xen
> cmdline
> and amd-cppc driver
>
> On 11.07.2025 05:50, Penny Zheng wrote:
> > --- a/xen/arch/x86/acpi/cpufreq/cpufreq.c
> > +++ b/xen/arch/x86/acpi/cpufreq/cpufreq.c
> > @@ -128,12 +128,14 @@ static int __init cf_check
> > cpufreq_driver_init(void)
> >
> > if ( cpufreq_controller == FREQCTL_xen )
> > {
> > + unsigned int i = 0;
>
> Pointless initializer; both for() loops set i to 0. But also see further down.
>
> > @@ -157,9 +164,70 @@ static int __init cf_check
> > cpufreq_driver_init(void)
> >
> > case X86_VENDOR_AMD:
> > case X86_VENDOR_HYGON:
> > - ret = IS_ENABLED(CONFIG_AMD) ? powernow_register_driver() : -
> ENODEV;
> > + if ( !IS_ENABLED(CONFIG_AMD) )
> > + {
> > + ret = -ENODEV;
> > + break;
> > + }
> > + ret = -ENOENT;
>
> The code structure is sufficiently different from the Intel counterpart for
> this to
> perhaps better move ...
>
> > + for ( i = 0; i < cpufreq_xen_cnt; i++ )
> > + {
> > + switch ( cpufreq_xen_opts[i] )
> > + {
> > + case CPUFREQ_xen:
> > + ret = powernow_register_driver();
> > + break;
> > +
> > + case CPUFREQ_amd_cppc:
> > + ret = amd_cppc_register_driver();
> > + break;
> > +
> > + case CPUFREQ_none:
> > + ret = 0;
> > + break;
> > +
> > + default:
> > + printk(XENLOG_WARNING
> > + "Unsupported cpufreq driver for vendor AMD or
> > Hygon\n");
> > + break;
>
> ... here.
>
Are we suggesting moving
"
if ( !IS_ENABLED(CONFIG_AMD) )
{
ret = -ENODEV;
break;
}
" here? In which case, When CONFIG_AMD=n and users doesn't provide
"cpufreq=xxx", we will have cpufreq_xen_cnt initialized as 1 and
cpufreq_xen_opts[0] = CPUFREQ_xen. powernow_register_driver() hence gets
invoked. The thing is that we don't have stub for it and it is compiled under
CONFIG_AMD
I suggest to change to use #ifdef CONFIG_AMD code wrapping
> > + }
> > +
> > + if ( !ret || ret == -EBUSY )
> > + break;
> > + }
> > +
> > break;
> > }
> > +
> > + /*
> > + * After successful cpufreq driver registeration,
> XEN_PROCESSOR_PM_CPPC
> > + * and XEN_PROCESSOR_PM_PX shall become exclusive flags.
> > + */
> > + if ( !ret )
> > + {
> > + ASSERT(i < cpufreq_xen_cnt);
> > + switch ( cpufreq_xen_opts[i] )
>
> Hmm, this is using the the initializer of i that I commented on. I think
> there's
> another default: case missing, where you simply "return 0" (to retain prior
> behavior).
> But again see also yet further down.
>
>
> > + /*
> > + * No cpufreq driver gets registered, clear both
> > + * XEN_PROCESSOR_PM_CPPC and XEN_PROCESSOR_PM_PX
> > + */
> > + xen_processor_pmbits &= ~(XEN_PROCESSOR_PM_CPPC |
> > + XEN_PROCESSOR_PM_PX);
>
> Yet more hmm - this path you want to get through for the case mentioned above.
> But only this code; specifically not the "switch ( cpufreq_xen_opts[i] )",
> which really
> is "switch ( cpufreq_xen_opts[0] )" in that case, and that's pretty clearly
> wrong to
> evaluate in then.
>
Correct me if I understand you wrongly:
The above "case missing" , are we talking about is entering "case CPUFREQ_none"
?
IMO, it may never be entered. If users doesn't provide "cpufreq=xxx", we will
have cpufreq_xen_cnt initialized as 1 and cpufreq_xen_opts[0] = CPUFREQ_xen.
That is, we will have px states as default driver. Even if we have failed
px-driver initialization, with cpufreq_xen_cnt limited to 1, we will not enter
CPUFREQ_none.
CPUFREQ_none only could be set when users explicitly set
"cpufreq=disabled/none/0", but in which case, cpufreq_controller will be set
with FREQCTL_none. And the whole cpufreq_driver_init() is under "
cpufreq_controller == FREQCTL_xen " condition
Or "case missing" is referring entering default case? In which case, we will
have -ENOENT errno. As we have ret=-ENOENT in the very beginning
> Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |