|
[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
On 05.08.2025 08:31, Penny, Zheng wrote:
> [Public]
>
>> -----Original Message-----
>> From: Jan Beulich <jbeulich@xxxxxxxx>
>> Sent: Monday, August 4, 2025 4:48 PM
>> 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 04.08.2025 10:09, Penny, Zheng wrote:
>>> [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
>>
>> Sorry, this is hard to follow. Plus I think I made the main requirement quite
>> clear: You want to "retain prior behavior" for all cases you don't
>> deliberately change
>> to accommodate the new driver. Plus you want to watch out for pre- existing
>> incorrect behavior: Rather than proliferating any, such would want adjusting.
>>
>
> I was trying to follow "there's another default: case missing, where you
> simply "return 0" (to retain prior behavior ) ",
> The missing "default :" is referring the one for "switch (
> boot_cpu_data.x86_vendor )"? (I thought it referred " switch (
> cpufreq_xen_opts[i] ) " ....)
> It is a pre- existing incorrect behavior which I shall create a new commit to
> fix it firstly
> I'll add an -ENOENTRY initializer for ret at the very beginning , and
> complement the missing default: entry with "Unsupported vendor..." error log
Yes, I was referring to pre-existing code which I think wants adjusting in
order to then accommodate your changes there.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |