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

Re: [Xen-devel] [RFC PATCH v3 11/12] xen: arm: implement XEN_SYSCTL_cpufreq_op



On Sun, Oct 26, 2014 at 7:41 PM, Stefano Stabellini
<stefano.stabellini@xxxxxxxxxxxxx> wrote:
> On Thu, 23 Oct 2014, Oleksandr Dmytryshyn wrote:
>> Kernel uses this op to get some parameters for the
>> xen-cpufreq driver to change CPUs frequency.
>
> The commit message doesn't describe many of the changes introduced by
> this patch.
> For example it fails to mention that it is
> introducing notify_cpufreq_domains.
>
> We need a better commit message.
I'll extend a commit message in the next patch-set.

> Also doesn't notify_cpufreq_domains belong to the previous patch anyway?
I'll move this function to the previous patch in the next patch-set.

>> Signed-off-by: Oleksandr Dmytryshyn <oleksandr.dmytryshyn@xxxxxxxxxxxxxxx>
>> ---
>>  xen/common/sysctl.c                 |  8 ++++++
>>  xen/drivers/cpufreq/hwdom-cpufreq.c | 52 
>> +++++++++++++++++++++++++++++++++++++
>>  xen/include/public/sysctl.h         | 19 ++++++++++++++
>>  xen/include/xen/cpufreq.h           |  2 ++
>>  4 files changed, 81 insertions(+)
>>
>> diff --git a/xen/common/sysctl.c b/xen/common/sysctl.c
>> index 0dcf06a..fd0cd0d 100644
>> --- a/xen/common/sysctl.c
>> +++ b/xen/common/sysctl.c
>> @@ -27,6 +27,7 @@
>>  #include <xsm/xsm.h>
>>  #include <xen/pmstat.h>
>>  #include <xen/gcov.h>
>> +#include <xen/cpufreq.h>
>>
>>  long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl)
>>  {
>> @@ -362,6 +363,13 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) 
>> u_sysctl)
>>          break;
>>  #endif
>>
>> +#ifdef HAS_HWDOM_CPUFREQ
>> +    case XEN_SYSCTL_cpufreq_op:
>> +        ret = sysctl_cpufreq_op(&op->u.cpufreq_op);
>> +        copyback = 1;
>> +        break;
>> +#endif
>> +
>>      default:
>>          ret = arch_do_sysctl(op, u_sysctl);
>>          copyback = 0;
>> diff --git a/xen/drivers/cpufreq/hwdom-cpufreq.c 
>> b/xen/drivers/cpufreq/hwdom-cpufreq.c
>> index 67c9e1d..cc97f37 100644
>> --- a/xen/drivers/cpufreq/hwdom-cpufreq.c
>> +++ b/xen/drivers/cpufreq/hwdom-cpufreq.c
>> @@ -34,12 +34,53 @@ struct hwdom_cpufreq_data {
>>  };
>>
>>  static struct hwdom_cpufreq_data *hwdom_cpufreq_drv_data[NR_CPUS];
>> +static DEFINE_SPINLOCK(sysctl_cpufreq_lock);
>> +
>> +struct sysctl_cpufreq_data {
>> +    uint32_t cpu;
>> +    uint32_t freq;
>> +    uint32_t relation;
>> +    int32_t result;
>> +};
>> +
>> +static struct sysctl_cpufreq_data sysctl_cpufreq_data;
>>
>>  int cpufreq_cpu_init(unsigned int cpuid)
>>  {
>>      return cpufreq_add_cpu(cpuid);
>>  }
>>
>> +static void notify_cpufreq_domains(void)
>> +{
>> +    send_global_virq(VIRQ_CPUFREQ);
>> +}
>> +
>> +int sysctl_cpufreq_op(xen_sysctl_cpufreq_op_t *op)
>> +{
>> +    int ret = 0;
>> +    switch ( op->cmd )
>> +    {
>> +    case XEN_SYSCTL_CPUFREQ_get_target:
>> +        spin_lock(&sysctl_cpufreq_lock);
>> +        op->u.target.cpu = sysctl_cpufreq_data.cpu;
>> +        op->u.target.freq = sysctl_cpufreq_data.freq;
>> +        op->u.target.relation = sysctl_cpufreq_data.relation;
>> +        spin_unlock(&sysctl_cpufreq_lock);
>> +        break;
>> +
>> +    case XEN_SYSCTL_CPUFREQ_set_result:
>> +        spin_lock(&sysctl_cpufreq_lock);
>> +        sysctl_cpufreq_data.result = op->u.result;
>> +        spin_unlock(&sysctl_cpufreq_lock);
>> +        break;
>> +
>> +    default:
>> +        return -EOPNOTSUPP;
>> +        break;
>> +    }
>> +    return ret;
>> +}
>> +
>>  static int hwdom_cpufreq_verify(struct cpufreq_policy *policy)
>>  {
>>      struct hwdom_cpufreq_data *data;
>> @@ -97,6 +138,17 @@ static int hwdom_cpufreq_target(struct cpufreq_policy 
>> *policy,
>>      freqs.old = perf->states[perf->state].core_frequency * 1000;
>>      freqs.new = data->freq_table[next_state].frequency;
>>
>> +    /* Do send cmd for Dom0 */
>> +    spin_lock(&sysctl_cpufreq_lock);
>> +    /* return previous result */
>> +    ret = sysctl_cpufreq_data.result;
>> +
>> +    sysctl_cpufreq_data.cpu = policy->cpu;
>> +    sysctl_cpufreq_data.freq = freqs.new;
>> +    sysctl_cpufreq_data.relation = (uint32_t)relation;
>> +    spin_unlock(&sysctl_cpufreq_lock);
>> +    notify_cpufreq_domains();
>> +
>>      for_each_cpu( j, &online_policy_cpus )
>>          cpufreq_statistic_update(j, perf->state, next_perf_state);
>>
>> diff --git a/xen/include/public/sysctl.h b/xen/include/public/sysctl.h
>> index 8437d31..ecd4674 100644
>> --- a/xen/include/public/sysctl.h
>> +++ b/xen/include/public/sysctl.h
>> @@ -632,6 +632,23 @@ struct xen_sysctl_coverage_op {
>>  typedef struct xen_sysctl_coverage_op xen_sysctl_coverage_op_t;
>>  DEFINE_XEN_GUEST_HANDLE(xen_sysctl_coverage_op_t);
>>
>> +#define XEN_SYSCTL_CPUFREQ_get_target      0
>> +#define XEN_SYSCTL_CPUFREQ_set_result      1
>> +
>> +struct xen_sysctl_cpufreq_op {
>> +    uint32_t cmd;
>> +    union {
>> +        struct {
>> +            uint32_t cpu;
>> +            uint32_t freq;
>> +            uint32_t relation;
>> +        } target;
>> +        uint32_t result;
>> +    } u;
>> +};
>> +typedef struct xen_sysctl_cpufreq_op xen_sysctl_cpufreq_op_t;
>> +DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpufreq_op_t);
>> +
>>
>>  struct xen_sysctl {
>>      uint32_t cmd;
>> @@ -654,6 +671,7 @@ struct xen_sysctl {
>>  #define XEN_SYSCTL_cpupool_op                    18
>>  #define XEN_SYSCTL_scheduler_op                  19
>>  #define XEN_SYSCTL_coverage_op                   20
>> +#define XEN_SYSCTL_cpufreq_op                    21
>>      uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */
>>      union {
>>          struct xen_sysctl_readconsole       readconsole;
>> @@ -675,6 +693,7 @@ struct xen_sysctl {
>>          struct xen_sysctl_cpupool_op        cpupool_op;
>>          struct xen_sysctl_scheduler_op      scheduler_op;
>>          struct xen_sysctl_coverage_op       coverage_op;
>> +        struct xen_sysctl_cpufreq_op        cpufreq_op;
>>          uint8_t                             pad[128];
>>      } u;
>>  };
>> diff --git a/xen/include/xen/cpufreq.h b/xen/include/xen/cpufreq.h
>> index d7b6c34..0c8c19d 100644
>> --- a/xen/include/xen/cpufreq.h
>> +++ b/xen/include/xen/cpufreq.h
>> @@ -264,4 +264,6 @@ int write_userspace_scaling_setspeed(unsigned int cpu, 
>> unsigned int freq);
>>  void cpufreq_dbs_timer_suspend(void);
>>  void cpufreq_dbs_timer_resume(void);
>>
>> +int sysctl_cpufreq_op(xen_sysctl_cpufreq_op_t *op);
>> +
>>  #endif /* __XEN_CPUFREQ_PM_H__ */
>> --
>> 1.9.1
>>
>>
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@xxxxxxxxxxxxx
>> http://lists.xen.org/xen-devel
>>

_______________________________________________
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®.