[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v5 8/9] x86/intel_pstate: support the use of intel_pstate in pmstat.c



On 26/10/2015 15:03,  Jan Beulich wrote:
> >>> "Wang, Wei W" <wei.w.wang@xxxxxxxxx> 10/26/15 7:27 AM >>>
> >On 08/10/2015 12:11,  Jan Beulich wrote:
> >> >>> On 14.09.15 at 04:32, <wei.w.wang@xxxxxxxxx> wrote:
> >> > -    new_policy.governor = __find_governor(op-
> >u.set_gov.scaling_governor);
> >> > -    if (new_policy.governor == NULL)
> >> > -        return -EINVAL;
> >> > +    if ( internal_gov && internal_gov->cur_gov )
> >> > +    {
> >> > +        if ( !strnicmp(op->u.set_gov.scaling_governor,
> >> > +                       "performance", CPUFREQ_NAME_LEN) )
> >> > +            internal_gov->cur_gov = INTERNAL_GOV_PERFORMANCE;
> >> > +        else if ( !strnicmp(op->u.set_gov.scaling_governor,
> >> > +                       "powersave", CPUFREQ_NAME_LEN) )
> >> > +            internal_gov->cur_gov = INTERNAL_GOV_POWERSAVE;
> >> > +        else if ( !strnicmp(op->u.set_gov.scaling_governor,
> >> > +                       "userspace", CPUFREQ_NAME_LEN) )
> >> > +            internal_gov->cur_gov = INTERNAL_GOV_USERSPACE;
> >> > +        else if ( !strnicmp(op->u.set_gov.scaling_governor,
> >> > +                       "ondemand", CPUFREQ_NAME_LEN) )
> >> > +            internal_gov->cur_gov = INTERNAL_GOV_ONDEMAND;
> >>
> >> Wouldn't this better be done by the internal governor's code, so it
> >> can also for itself decide which of the kinds it may not want to support?
> >
> >I think it should be pmstat.c-'s job here to set "
> >internal_gov->cur_gov", which  is later passed to the internal
> >governor's implementation code, who then  decides how to deal with the
> requested governor in "internal_gov->cur_gov".
> 
> Which it then is able to communicate in which way? Without itself adjusting
> ->cur_gov again?
 
In this way: 
pmstat.c gets the string-represented governor adjusting request from the upper 
layer, parses it to the number-represented value (INTERNAL_GOV_), and feeds the 
number-represented one to the driver's internal governor implementation. If the 
internal governor implementation doesn't support the passed INTERNAL_GOV_XX, 
i.e. INTERNAL_GOV_XX goes to the "default:" section of the "switch()", which 
adjusts the internal_gov->cur_gov to the default one, e.g. 
INTERNAL_GOV_ONDEMAND.

> >> >  struct xen_get_cpufreq_para {
> >> >      /* IN/OUT variable */
> >> >      uint32_t cpu_num;
> >> >      uint32_t freq_num;
> >> >      uint32_t gov_num;
> >> > +    int32_t turbo_enabled;
> >> > +
> >> > +    uint32_t cpuinfo_cur_freq;
> >> > +    uint32_t cpuinfo_max_freq;
> >> > +    uint32_t cpuinfo_min_freq;
> >> > +    uint32_t scaling_cur_freq;
> >> > +
> >> > +    uint32_t scaling_turbo_pct;
> >> > +    uint32_t scaling_max_perf;
> >> > +    uint32_t scaling_min_perf;
> >> > +    enum perf_alias perf_alias;
> >> >
> >> >      /* for all governors */
> >> >      /* OUT variable */
> >> > @@ -309,23 +326,13 @@ struct xen_get_cpufreq_para {
> >> >      XEN_GUEST_HANDLE_64(uint32) scaling_available_frequencies;
> >> >      XEN_GUEST_HANDLE_64(char)   scaling_available_governors;
> >> >      char scaling_driver[CPUFREQ_NAME_LEN];
> >> > -
> >> > -    uint32_t cpuinfo_cur_freq;
> >> > -    uint32_t cpuinfo_max_freq;
> >> > -    uint32_t cpuinfo_min_freq;
> >> > -    uint32_t scaling_cur_freq;
> >> > -
> >> >      char scaling_governor[CPUFREQ_NAME_LEN];
> >> > -    uint32_t scaling_max_freq;
> >> > -    uint32_t scaling_min_freq;
> >> >
> >> >      /* for specific governor */
> >> >      union {
> >> >          struct  xen_userspace userspace;
> >> >          struct  xen_ondemand ondemand;
> >> >      } u;
> >> > -
> >> > -    int32_t turbo_enabled;
> >> >  };
> >>
> >> Is all of this re-arrangement really needed? Also can't turbo_enabled
> >> and scaling_turbo_pct be combined into a single field?
> >
> >Personally, we should not combine the two.
> > turbo_enabled is used by both the old pstate driver and intel_pstate,
> >but  scaling_turbo_pct is only used in intel_pstate. If we use
> "scaling_turbo_pct=0"
> > to represent "turbo_enabled=0", and "scaling_turbo_pct>0" to represent
> >" turbo_enabled=1", then we will need to modify the old driver to use
> >scaling_turbo_pct, i.e. changing the old driver to be aware of the 
> >"percentage"
> > concept, which is proposed in intel_pstate. On the other side, I think
> >keeping  turbo_enabled and scaling_turbo_pct separated makes the code
> easier to read.
> 
> Note that "combine" doesn't necessarily mean "eliminate the old one" - they
> could as well become field of a union. The basic question you should ask
> yourself in such cases is: "Do both fields have a meaning at the same time?" 
> If
> the answer is yes, then of course they should remain separate. If the answer 
> is
> no _and_ their purpose is reasonably similar, then combining them should at
> least be considered.

Ok. I will keep the two separated, since they do have their own meaning at the 
same time. 

Best,
Wei

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.