Re: [PATCH 2/11] cpufreq: governor: Use common mutex for dbs_data protection

2016-02-04 Thread Rafael J. Wysocki
On Fri, Feb 5, 2016 at 4:24 AM, Viresh Kumar  wrote:
> On 05-02-16, 04:17, Rafael J. Wysocki wrote:
>> And don't we switch governors under policy->rwsem anyway?
>
> So ? That is blocking only a single policy only, but with the new
> change, we will block all policies from doing that concurrently.

No, it won't.  Again: one lock instead of two.  How much of a
difference this makes performance-wise?

And the price is the stupid dance we need to do to even get to those
locks!  Come on.

Thanks,
Rafael


Re: [PATCH 2/11] cpufreq: governor: Use common mutex for dbs_data protection

2016-02-04 Thread Viresh Kumar
On 05-02-16, 04:17, Rafael J. Wysocki wrote:
> And don't we switch governors under policy->rwsem anyway?

So ? That is blocking only a single policy only, but with the new
change, we will block all policies from doing that concurrently.

-- 
viresh


Re: [PATCH 2/11] cpufreq: governor: Use common mutex for dbs_data protection

2016-02-04 Thread Viresh Kumar
On 05-02-16, 04:06, Rafael J. Wysocki wrote:
> And why is this a big problem, actually?  Why do we want the switching
> of governors to be that efficient?

I am not saying its a big problem, just that its kind of a big lock,
which could have been finer.

-- 
viresh


Re: [PATCH 2/11] cpufreq: governor: Use common mutex for dbs_data protection

2016-02-04 Thread Rafael J. Wysocki
On Fri, Feb 5, 2016 at 4:15 AM, Rafael J. Wysocki  wrote:
> On Fri, Feb 5, 2016 at 4:06 AM, Rafael J. Wysocki  wrote:
>> On Fri, Feb 5, 2016 at 3:59 AM, Viresh Kumar  wrote:
>>> On 04-02-16, 17:46, Rafael J. Wysocki wrote:
 On Thu, Feb 4, 2016 at 6:09 AM, Viresh Kumar  
 wrote:
 > On 04-02-16, 00:16, Rafael J. Wysocki wrote:
 >> From: Rafael J. Wysocki 
 >>
 >> Every governor relying on the common code in cpufreq_governor.c
 >> has to provide its own mutex in struct common_dbs_data.  However,
 >> those mutexes are never used at the same time
 >
 > Why do you think so? I thought they can always be used in parallel.
 >
 > Consider 2 or more policies, one can have ondemand as the governor,
 > whereas other one can have conservative.
 >
 > If CPUs go online/offline or if governors are switching in parallel,
 > then cpufreq_governor_dbs() can very much run in parallel for ondemand
 > and conservative.
 >
 > Or am I missing something here ?

 Well, so perhaps the changelog is inaccurate.

 However, what's wrong with using a single mutex then?
>>>
>>> You are killing the possibility of running the code faster. Consider
>>> this:
>>> - A 16 policy system with N CPUs in every policy (IBM has something
>>>   similar only :) )..
>>> - 4 policies using ondemand, 4 using conservative, 4 using powersave
>>>   and 4 with performance.
>>> - Now if we try to change governors for all of them in parallel, only
>>>   one will be done at a time and others have to wait for this
>>>   BIG-kernel lock.
>>
>> And why is this a big problem, actually?  Why do we want the switching
>> of governors to be that efficient?
>
> In any case, we're talking about having one lock instead of two, mind
> you (out of the tree things don't count), because performance and
> powersave don't even use the code in question.
>
> I'm not really sure how much of a difference that would make on a
> really big system.

And don't we switch governors under policy->rwsem anyway?

Thanks,
Rafael


Re: [PATCH 2/11] cpufreq: governor: Use common mutex for dbs_data protection

2016-02-04 Thread Rafael J. Wysocki
On Fri, Feb 5, 2016 at 4:06 AM, Rafael J. Wysocki  wrote:
> On Fri, Feb 5, 2016 at 3:59 AM, Viresh Kumar  wrote:
>> On 04-02-16, 17:46, Rafael J. Wysocki wrote:
>>> On Thu, Feb 4, 2016 at 6:09 AM, Viresh Kumar  
>>> wrote:
>>> > On 04-02-16, 00:16, Rafael J. Wysocki wrote:
>>> >> From: Rafael J. Wysocki 
>>> >>
>>> >> Every governor relying on the common code in cpufreq_governor.c
>>> >> has to provide its own mutex in struct common_dbs_data.  However,
>>> >> those mutexes are never used at the same time
>>> >
>>> > Why do you think so? I thought they can always be used in parallel.
>>> >
>>> > Consider 2 or more policies, one can have ondemand as the governor,
>>> > whereas other one can have conservative.
>>> >
>>> > If CPUs go online/offline or if governors are switching in parallel,
>>> > then cpufreq_governor_dbs() can very much run in parallel for ondemand
>>> > and conservative.
>>> >
>>> > Or am I missing something here ?
>>>
>>> Well, so perhaps the changelog is inaccurate.
>>>
>>> However, what's wrong with using a single mutex then?
>>
>> You are killing the possibility of running the code faster. Consider
>> this:
>> - A 16 policy system with N CPUs in every policy (IBM has something
>>   similar only :) )..
>> - 4 policies using ondemand, 4 using conservative, 4 using powersave
>>   and 4 with performance.
>> - Now if we try to change governors for all of them in parallel, only
>>   one will be done at a time and others have to wait for this
>>   BIG-kernel lock.
>
> And why is this a big problem, actually?  Why do we want the switching
> of governors to be that efficient?

In any case, we're talking about having one lock instead of two, mind
you (out of the tree things don't count), because performance and
powersave don't even use the code in question.

I'm not really sure how much of a difference that would make on a
really big system.

Thanks,
Rafael


Re: [PATCH 2/11] cpufreq: governor: Use common mutex for dbs_data protection

2016-02-04 Thread Rafael J. Wysocki
On Fri, Feb 5, 2016 at 3:59 AM, Viresh Kumar  wrote:
> On 04-02-16, 17:46, Rafael J. Wysocki wrote:
>> On Thu, Feb 4, 2016 at 6:09 AM, Viresh Kumar  wrote:
>> > On 04-02-16, 00:16, Rafael J. Wysocki wrote:
>> >> From: Rafael J. Wysocki 
>> >>
>> >> Every governor relying on the common code in cpufreq_governor.c
>> >> has to provide its own mutex in struct common_dbs_data.  However,
>> >> those mutexes are never used at the same time
>> >
>> > Why do you think so? I thought they can always be used in parallel.
>> >
>> > Consider 2 or more policies, one can have ondemand as the governor,
>> > whereas other one can have conservative.
>> >
>> > If CPUs go online/offline or if governors are switching in parallel,
>> > then cpufreq_governor_dbs() can very much run in parallel for ondemand
>> > and conservative.
>> >
>> > Or am I missing something here ?
>>
>> Well, so perhaps the changelog is inaccurate.
>>
>> However, what's wrong with using a single mutex then?
>
> You are killing the possibility of running the code faster. Consider
> this:
> - A 16 policy system with N CPUs in every policy (IBM has something
>   similar only :) )..
> - 4 policies using ondemand, 4 using conservative, 4 using powersave
>   and 4 with performance.
> - Now if we try to change governors for all of them in parallel, only
>   one will be done at a time and others have to wait for this
>   BIG-kernel lock.

And why is this a big problem, actually?  Why do we want the switching
of governors to be that efficient?

Thanks,
Rafael


Re: [PATCH 2/11] cpufreq: governor: Use common mutex for dbs_data protection

2016-02-04 Thread Viresh Kumar
On 04-02-16, 17:46, Rafael J. Wysocki wrote:
> On Thu, Feb 4, 2016 at 6:09 AM, Viresh Kumar  wrote:
> > On 04-02-16, 00:16, Rafael J. Wysocki wrote:
> >> From: Rafael J. Wysocki 
> >>
> >> Every governor relying on the common code in cpufreq_governor.c
> >> has to provide its own mutex in struct common_dbs_data.  However,
> >> those mutexes are never used at the same time
> >
> > Why do you think so? I thought they can always be used in parallel.
> >
> > Consider 2 or more policies, one can have ondemand as the governor,
> > whereas other one can have conservative.
> >
> > If CPUs go online/offline or if governors are switching in parallel,
> > then cpufreq_governor_dbs() can very much run in parallel for ondemand
> > and conservative.
> >
> > Or am I missing something here ?
> 
> Well, so perhaps the changelog is inaccurate.
> 
> However, what's wrong with using a single mutex then?

You are killing the possibility of running the code faster. Consider
this:
- A 16 policy system with N CPUs in every policy (IBM has something
  similar only :) )..
- 4 policies using ondemand, 4 using conservative, 4 using powersave
  and 4 with performance.
- Now if we try to change governors for all of them in parallel, only
  one will be done at a time and others have to wait for this
  BIG-kernel lock.
- Ideally the lock shouldn't have been in cdata itself, but dbs_data
  only. But there was a specific race because of which we were
  required to move it to a higher level, i.e. cdata. And so we killed
  the possibility of parallelism of multiple governors of same type
  (ofcourse only of update-sampling-rate and cpufreq_governor_dbs()..

So, it makes thing much slower..

-- 
viresh


Re: [PATCH 2/11] cpufreq: governor: Use common mutex for dbs_data protection

2016-02-04 Thread Rafael J. Wysocki
On Thu, Feb 4, 2016 at 6:09 AM, Viresh Kumar  wrote:
> On 04-02-16, 00:16, Rafael J. Wysocki wrote:
>> From: Rafael J. Wysocki 
>>
>> Every governor relying on the common code in cpufreq_governor.c
>> has to provide its own mutex in struct common_dbs_data.  However,
>> those mutexes are never used at the same time
>
> Why do you think so? I thought they can always be used in parallel.
>
> Consider 2 or more policies, one can have ondemand as the governor,
> whereas other one can have conservative.
>
> If CPUs go online/offline or if governors are switching in parallel,
> then cpufreq_governor_dbs() can very much run in parallel for ondemand
> and conservative.
>
> Or am I missing something here ?

Well, so perhaps the changelog is inaccurate.

However, what's wrong with using a single mutex then?

Thanks,
Rafael


Re: [PATCH 2/11] cpufreq: governor: Use common mutex for dbs_data protection

2016-02-03 Thread Viresh Kumar
On 04-02-16, 00:16, Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki 
> 
> Every governor relying on the common code in cpufreq_governor.c
> has to provide its own mutex in struct common_dbs_data.  However,
> those mutexes are never used at the same time

Why do you think so? I thought they can always be used in parallel.

Consider 2 or more policies, one can have ondemand as the governor,
whereas other one can have conservative.

If CPUs go online/offline or if governors are switching in parallel,
then cpufreq_governor_dbs() can very much run in parallel for ondemand
and conservative.

Or am I missing something here ?

-- 
viresh


Re: [PATCH 2/11] cpufreq: governor: Use common mutex for dbs_data protection

2016-02-03 Thread Saravana Kannan

On 02/03/2016 03:16 PM, Rafael J. Wysocki wrote:

From: Rafael J. Wysocki 

Every governor relying on the common code in cpufreq_governor.c
has to provide its own mutex in struct common_dbs_data.  However,
those mutexes are never used at the same time and doing it this
way makes it rather difficult to follow the code.  Moreover,
if two governor modules are loaded we end up with two mutexes
used for the same purpose one at a time.

Introduce a single common mutex for that instead and drop the
mutex field from struct common_dbs_data.  That at least will
ensure that the mutex is always present and initialized regardless
of what the particular governors do.

Signed-off-by: Rafael J. Wysocki 
---
  drivers/cpufreq/cpufreq_conservative.c |1 -
  drivers/cpufreq/cpufreq_governor.c |7 +--
  drivers/cpufreq/cpufreq_governor.h |6 +-
  drivers/cpufreq/cpufreq_ondemand.c |5 ++---
  4 files changed, 8 insertions(+), 11 deletions(-)

Index: linux-pm/drivers/cpufreq/cpufreq_governor.c
===
--- linux-pm.orig/drivers/cpufreq/cpufreq_governor.c
+++ linux-pm/drivers/cpufreq/cpufreq_governor.c
@@ -22,6 +22,9 @@

  #include "cpufreq_governor.h"

+DEFINE_MUTEX(dbs_data_mutex);
+EXPORT_SYMBOL_GPL(dbs_data_mutex);
+
  static struct attribute_group *get_sysfs_attr(struct dbs_data *dbs_data)
  {
if (have_governor_per_policy())
@@ -542,7 +545,7 @@ int cpufreq_governor_dbs(struct cpufreq_
int ret;

/* Lock governor to block concurrent initialization of governor */
-   mutex_lock(&cdata->mutex);
+   mutex_lock(&dbs_data_mutex);

if (have_governor_per_policy())
dbs_data = policy->governor_data;
@@ -575,7 +578,7 @@ int cpufreq_governor_dbs(struct cpufreq_
}

  unlock:
-   mutex_unlock(&cdata->mutex);
+   mutex_unlock(&dbs_data_mutex);

return ret;
  }
Index: linux-pm/drivers/cpufreq/cpufreq_governor.h
===
--- linux-pm.orig/drivers/cpufreq/cpufreq_governor.h
+++ linux-pm/drivers/cpufreq/cpufreq_governor.h
@@ -223,11 +223,6 @@ struct common_dbs_data {

/* Governor specific ops, see below */
void *gov_ops;
-
-   /*
-* Protects governor's data (struct dbs_data and struct common_dbs_data)
-*/
-   struct mutex mutex;
  };

  /* Governor Per policy data */
@@ -272,6 +267,7 @@ static ssize_t show_sampling_rate_min_go
return sprintf(buf, "%u\n", dbs_data->min_sampling_rate);  \
  }

+extern struct mutex dbs_data_mutex;
  extern struct mutex cpufreq_governor_lock;
  void gov_set_update_util(struct cpu_common_dbs_info *shared,
 unsigned int delay_us);
Index: linux-pm/drivers/cpufreq/cpufreq_ondemand.c
===
--- linux-pm.orig/drivers/cpufreq/cpufreq_ondemand.c
+++ linux-pm/drivers/cpufreq/cpufreq_ondemand.c
@@ -251,7 +251,7 @@ static void update_sampling_rate(struct
/*
 * Lock governor so that governor start/stop can't execute in parallel.
 */
-   mutex_lock(&od_dbs_cdata.mutex);
+   mutex_lock(&dbs_data_mutex);

cpumask_copy(&cpumask, cpu_online_mask);

@@ -304,7 +304,7 @@ static void update_sampling_rate(struct
}
}

-   mutex_unlock(&od_dbs_cdata.mutex);
+   mutex_unlock(&dbs_data_mutex);
  }

  static ssize_t store_sampling_rate(struct dbs_data *dbs_data, const char *buf,
@@ -550,7 +550,6 @@ static struct common_dbs_data od_dbs_cda
.gov_ops = &od_ops,
.init = od_init,
.exit = od_exit,
-   .mutex = __MUTEX_INITIALIZER(od_dbs_cdata.mutex),
  };

  static int od_cpufreq_governor_dbs(struct cpufreq_policy *policy,
Index: linux-pm/drivers/cpufreq/cpufreq_conservative.c
===
--- linux-pm.orig/drivers/cpufreq/cpufreq_conservative.c
+++ linux-pm/drivers/cpufreq/cpufreq_conservative.c
@@ -368,7 +368,6 @@ static struct common_dbs_data cs_dbs_cda
.gov_check_cpu = cs_check_cpu,
.init = cs_init,
.exit = cs_exit,
-   .mutex = __MUTEX_INITIALIZER(cs_dbs_cdata.mutex),
  };

  static int cs_cpufreq_governor_dbs(struct cpufreq_policy *policy,

--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html




Acked-by: Saravana Kannan 


--
Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project