|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 6/9] x86/intel_pstate: the main boby of the intel_pstate driver
On 29/05/2015 16:46, Jan Beulich wrote
> >>> On 29.05.15 at 10:19, <wei.w.wang@xxxxxxxxx> wrote:
> > On 26/05/2015 21:58, Jan Beulich wrote
> >> >>> On 13.05.16 at 09:50, <wei.w.wang@xxxxxxxxx> wrote:
> >> > +static int intel_pstate_verify_policy(struct cpufreq_policy
> >> > +*policy) {
> >> > + cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq,
> >> > + policy->cpuinfo.max_freq);
> >> > +
> >> > + if ( policy->policy != CPUFREQ_POLICY_POWERSAVE &&
> >> > + policy->policy != CPUFREQ_POLICY_PERFORMANCE &&
> >> > + policy->policy != CPUFREQ_POLICY_USERSPACE &&
> >> > + policy->policy != CPUFREQ_POLICY_ONDEMAND )
> >>
> >> switch()
> >
> > How would we use switch() here?
>
> switch ( policy->policy )
> {
> case CPUFREQ_POLICY_POWERSAVE:
>
> etc. But I thought that to be obvious, so I'm not sure I understand what you
> don't understand.
I thought there would be a special usage of switch() here, but no.
So, using switch, we will have
switch ( policy->policy )
{
case CPUFREQ_POLICY_POWERSAVE:
case CPUFREQ_POLICY_PERFORMANCE:
case CPUFREQ_POLICY_USERSPACE:
case CPUFREQ_POLICY_ONDEMAND:
return 0;
case default:
return -EINVAL
}
Is there a particular reason why we need to change to this style? I think using
if() looks more straightforward, since this is just a condition check.
>
> >> > +static int intel_pstate_msrs_not_valid(void) {
> >> > + /* Check that all the msr's we are using are valid. */
> >> > + u64 aperf, mperf, tmp;
> >> > +
> >> > + rdmsrl(MSR_IA32_APERF, aperf);
> >> > + rdmsrl(MSR_IA32_MPERF, mperf);
> >> > +
> >> > + if (!pstate_funcs.get_max() ||
> >> > + !pstate_funcs.get_min() ||
> >> > + !pstate_funcs.get_turbo())
> >> > + return -ENODEV;
> >> > +
> >> > + rdmsrl(MSR_IA32_APERF, tmp);
> >> > + if (!(tmp - aperf))
> >>
> >> Why not "if(tmp == aperf)"? And - is it guaranteed that APERF (and
> >> MPERF
> >> below) incremented in the meantime?
> >
> > Will change it to "if (tmp == aperf)".
> > According to the SDM, IA32_MPERF MSR (E7H) increments in proportion to
> > a fixed frequency, and IA32_APERF MSR increments in proportion to
> > actual performance. So, as long as the two MSRs are valid, their
> > values will be increased.
>
> The "in proportion" is what makes me nervous: What if the proportion is 1 in
> every 1000 cycles?
Right, this may cause a problem. I will remove that part. Then, it will be:
static int intel_pstate_msrs_not_valid(void)
{
if ( !pstate_funcs.get_max() ||
!pstate_funcs.get_min() ||
!pstate_funcs.get_turbo())
return -ENODEV;
return 0;
}
>
> >> > +int __init intel_pstate_init(void) {
> >> > + int cpu, rc = 0;
> >> > + const struct x86_cpu_id *id;
> >> > + struct cpu_defaults *cpu_info;
> >> > +
> >> > + if (cpuid_ecx(6) & 0x1)
> >> > + set_bit(X86_FEATURE_APERFMPERF,
> >> > + &boot_cpu_data.x86_capability);
> >>
> >> This should be consolidated out of the other cpufreq drivers into
> >> cpu/common.c.
> >
> > How about moving it to the bottom of init_intel() in cpu/intel.c ?
>
> It's not Intel specific, so it belongs in cpu/common.c.
Ok, I will put it into the cpu_init() function there.
>
> >> > --- a/xen/include/asm-x86/acpi.h
> >> > +++ b/xen/include/asm-x86/acpi.h
> >> > @@ -32,6 +32,8 @@
> >> > #define COMPILER_DEPENDENT_INT64 long long
> >> > #define COMPILER_DEPENDENT_UINT64 unsigned long long
> >> >
> >> > +extern int intel_pstate_init(void);
> >>
> >> Why in acpi.h?
> >
> > I was thinking that p-state is part of ACPI. Do you prefer to create a
> > new .h called cpufreq.h, just like the cpuidle.h there?
>
> ACPI is a way to convey information about P- (and C- and T-) states, but the
> latter are imo not tied to ACPI. In fact your patch series here proves the
> opposite: You add code dealing with P-states without using information
> coming from ACPI. I think this should go into what currently is
> acpi/cpufreq/cpufreq.h, which is expected to be moved out of acpi/ anyway
> (I seem to even recall an ARM side series aiming at doing that).
Ok, I will move it back to acpi/cpufreq/cpufreq.h.
Best,
Wei
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |