|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 03/15] xen/x86: introduce new sub-hypercall to propagate CPPC data
On 06.05.2025 11:11, Penny, Zheng wrote:
>> -----Original Message-----
>> From: Jan Beulich <jbeulich@xxxxxxxx>
>> Sent: Monday, April 28, 2025 11:57 PM
>>
>> On 14.04.2025 09:40, Penny Zheng wrote:
>>> + if ( cppc_data->flags & XEN_CPPC_CPC )
>>> + {
>>> + if ( cppc_data->cpc.highest_perf == 0 ||
>>> + cppc_data->cpc.highest_perf > UINT8_MAX ||
>>> + cppc_data->cpc.nominal_perf == 0 ||
>>> + cppc_data->cpc.nominal_perf > UINT8_MAX ||
>>> + cppc_data->cpc.lowest_nonlinear_perf == 0 ||
>>> + cppc_data->cpc.lowest_nonlinear_perf > UINT8_MAX ||
>>> + cppc_data->cpc.lowest_perf == 0 ||
>>> + cppc_data->cpc.lowest_perf > UINT8_MAX ||
>>> + cppc_data->cpc.lowest_perf >
>>> + cppc_data->cpc.lowest_nonlinear_perf ||
>>
>> Where's this ordering spelled out in the spec?
>>
>
> Clip a snippet from description on lowest performance[1], we may deduce that
> ```
> Selecting a performance level lower than the lowest nonlinear performance
> level may actually cause an efficiency penalty,
> but should reduce the instantaneous power consumption of the processor
> ```
> lowest is smaller than lowest nonlinear
I can't imply that from the quoted sentence. It describes what happens in that
situation, but it doesn't exclude the opposite relationship (in which case the
described situation simply can't occur).
>>> + cppc_data->cpc.lowest_nonlinear_perf >
>>> + cppc_data->cpc.nominal_perf ||
>>> + cppc_data->cpc.nominal_perf > cppc_data->cpc.highest_perf )
>>> + /*
>>> + * Right now, Xen doesn't actually use perf values
>>> + * in ACPI _CPC table, warning is enough.
>>> + */
>>> + printk(XENLOG_WARNING
>>> + "Broken CPPC perf values: lowest(%u),
>>> nonlinear_lowest(%u),
>> nominal(%u), highest(%u)\n",
>>> + cppc_data->cpc.lowest_perf,
>>> + cppc_data->cpc.lowest_nonlinear_perf,
>>> + cppc_data->cpc.nominal_perf,
>>> + cppc_data->cpc.highest_perf);
>>
>> If this warning was to ever surface, it would likely surface for every CPU.
>> That's unnecessarily verbose, I guess. Please consider using printk_once()
>> here.
>>
>
> Understood
>
>> Also, is "right now" (as the comment says) still going to be true by the end
>> of the
>> series? Didn't I see you use the values in earlier versions?
>>
>
> The reason why I added this comment is that in current implementation, we
> actually
> don't use values read from ACPI _CPC table for lowest_perf,
> lowest_nonlinear_perf,
> nominal_perf, and highest_perf.
> We read CPPC capability MSR to get these four values.
Oh, okay. Could you slightly extend that comment to include this detail?
>>> + if ( cppc_data->flags == (XEN_CPPC_PSD | XEN_CPPC_CPC) )
>>
>> If either flag may be clear, ...
>>
>>> + {
>>> + pm_info->cppc_data = *cppc_data;
>>> + if ( cpufreq_verbose )
>>> + {
>>> + print_PSD(&pm_info->cppc_data.domain_info);
>>> + print_CPPC(&pm_info->cppc_data);
>>
>> ... why unconditionally loog both?
>>
>>> + }
>>> +
>>> + pm_info->init = XEN_CPPC_INIT;
>>
>> Plus is it correct to set this flag if either of the incoming flags was
>> clear?
>
> Hmm, I may not understand what you mean here...
> I log and set this flag only when both flags are set (cppc_data->flags ==
> (XEN_CPPC_PSD | XEN_CPPC_CPC))
> _PSD entry and _CPC entry are both mandatory
> Did you suggest that we shall give warning message when either flag is clear?
Oh, sorry - I read & where you have == actually. Hence why I thought only
one of the flags may be set. Please disregard those comments of mine.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |