From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Rafael J. Wysocki" Subject: Re: [PATCH 1/3] pm/qos: allow state control of qos class Date: Wed, 27 Nov 2013 00:28:16 +0100 Message-ID: <52952E90.4000604@intel.com> References: <1385508011-26914-1-git-send-email-jacob.jun.pan@linux.intel.com> <1385508011-26914-2-git-send-email-jacob.jun.pan@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Return-path: Received: from mga14.intel.com ([143.182.124.37]:25985 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757605Ab3KZX2V (ORCPT ); Tue, 26 Nov 2013 18:28:21 -0500 In-Reply-To: <1385508011-26914-2-git-send-email-jacob.jun.pan@linux.intel.com> Sender: linux-pm-owner@vger.kernel.org List-Id: linux-pm@vger.kernel.org To: Jacob Pan Cc: Linux PM , LKML , Peter Zijlstra , Len Brown , Arjan van de Ven , Zhang Rui , "Rafael J. Wysocki" On 11/27/2013 12:20 AM, Jacob Pan wrote: > When power capping or thermal control is needed, CPU QOS latency cannot > be satisfied. This patch adds a state variable to indicate whether a QOS > class (including all constraint requests) should be ignored. > > Signed-off-by: Jacob Pan Honestly, I don't like this. I know the motivation and what you're trying to achieve, but I don't like the approach. I need to think a bit more about that. Thanks, Rafael > --- > include/linux/pm_qos.h | 10 +++++++++- > kernel/power/qos.c | 24 ++++++++++++++++++++++++ > 2 files changed, 33 insertions(+), 1 deletion(-) > > diff --git a/include/linux/pm_qos.h b/include/linux/pm_qos.h > index 5a95013..648b50b 100644 > --- a/include/linux/pm_qos.h > +++ b/include/linux/pm_qos.h > @@ -10,7 +10,7 @@ > #include > #include > > -enum { > +enum pm_qos_class { > PM_QOS_RESERVED = 0, > PM_QOS_CPU_DMA_LATENCY, > PM_QOS_NETWORK_LATENCY, > @@ -20,6 +20,11 @@ enum { > PM_QOS_NUM_CLASSES, > }; > > +enum pm_qos_state { > + PM_QOS_CONSTRAINT_AVAILABLE, > + PM_QOS_CONSTRAINT_IGNORED, > +}; > + > enum pm_qos_flags_status { > PM_QOS_FLAGS_UNDEFINED = -1, > PM_QOS_FLAGS_NONE, > @@ -77,6 +82,7 @@ struct pm_qos_constraints { > struct plist_head list; > s32 target_value; /* Do not change to 64 bit */ > s32 default_value; > + enum pm_qos_state state; > enum pm_qos_type type; > struct blocking_notifier_head *notifiers; > }; > @@ -123,6 +129,8 @@ int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier); > int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier); > int pm_qos_request_active(struct pm_qos_request *req); > s32 pm_qos_read_value(struct pm_qos_constraints *c); > +void pm_qos_set_constraint_class_state(enum pm_qos_class class, > + enum pm_qos_state state); > > #ifdef CONFIG_PM > enum pm_qos_flags_status __dev_pm_qos_flags(struct device *dev, s32 mask); > diff --git a/kernel/power/qos.c b/kernel/power/qos.c > index 8dff9b4..cf475b0 100644 > --- a/kernel/power/qos.c > +++ b/kernel/power/qos.c > @@ -146,6 +146,11 @@ static inline int pm_qos_get_value(struct pm_qos_constraints *c) > > s32 pm_qos_read_value(struct pm_qos_constraints *c) > { > + /* return invalid default value if constraints cannot be met, e.g. > + * during idle injection. > + */ > + if (c->state == PM_QOS_CONSTRAINT_IGNORED) > + return PM_QOS_DEFAULT_VALUE; > return c->target_value; > } > > @@ -353,6 +358,25 @@ void pm_qos_add_request(struct pm_qos_request *req, > } > EXPORT_SYMBOL_GPL(pm_qos_add_request); > > +void pm_qos_set_constraint_class_state(enum pm_qos_class class, > + enum pm_qos_state state) > +{ > + struct pm_qos_constraints *c = pm_qos_array[class]->constraints; > + unsigned long curr_value; > + > + if (c->state == state) > + return; > + curr_value = (state == PM_QOS_CONSTRAINT_IGNORED) ? > + PM_QOS_DEFAULT_VALUE : c->target_value; > + c->state = state; > + > + /* notify existing QOS requests change */ > + blocking_notifier_call_chain(c->notifiers, > + curr_value, > + NULL); > +} > +EXPORT_SYMBOL_GPL(pm_qos_set_constraint_class_state); > + > /** > * pm_qos_update_request - modifies an existing qos request > * @req : handle to list element holding a pm_qos request to use