All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: markgross@thegnar.org
Cc: jean.pihet@newoldbits.com,
	Mark Brown <broonie@opensource.wolfsonmicro.com>,
	Kevin Hilman <khilman@ti.com>,
	Linux PM mailing list <linux-pm@lists.linux-foundation.org>,
	linux-omap@vger.kernel.org, Paul Walmsley <paul@pwsan.com>,
	Magnus Damm <magnus.damm@gmail.com>,
	Todd Poynor <toddpoynor@google.com>, Jean Pihet <j-pihet@ti.com>
Subject: Re: [PATCH 05/15] PM QoS: generalize and export the constraints management code
Date: Sat, 13 Aug 2011 22:34:17 +0200	[thread overview]
Message-ID: <201108132234.17377.rjw@sisk.pl> (raw)
In-Reply-To: <20110813030937.GE639@gvim.org>

On Saturday, August 13, 2011, mark gross wrote:
> On Thu, Aug 11, 2011 at 05:06:42PM +0200, jean.pihet@newoldbits.com wrote:
> > From: Jean Pihet <j-pihet@ti.com>
> > 
> > In preparation for the per-device constratins support:
> > - rename update_target to pm_qos_update_target
> > - generalize and export pm_qos_update_target for usage by the upcoming
> > per-device latency constraints framework:
> >    . operate on struct pm_qos_constraints for constraints management,
> >    . introduce an 'action' parameter for constraints add/update/remove,
> >    . the return value indicates if the aggregated constraint value has
> >      changed,
> > - update the internal code to operate on struct pm_qos_constraints
> > - add a NULL pointer check in the API functions
> > 
> > Signed-off-by: Jean Pihet <j-pihet@ti.com>
> > 
> > ---
> >  include/linux/pm_qos.h |   14 ++++++
> >  kernel/power/qos.c     |  123 ++++++++++++++++++++++++++----------------------
> >  2 files changed, 81 insertions(+), 56 deletions(-)
> > 
> > diff --git a/include/linux/pm_qos.h b/include/linux/pm_qos.h
> > index 9772311..84aa150 100644
> > --- a/include/linux/pm_qos.h
> > +++ b/include/linux/pm_qos.h
> > @@ -44,7 +44,16 @@ struct pm_qos_constraints {
> >  	struct blocking_notifier_head *notifiers;
> >  };
> >  
> > +/* Action requested to pm_qos_update_target */
> > +enum pm_qos_req_action {
> > +	PM_QOS_ADD_REQ,		/* Add a new request */
> > +	PM_QOS_UPDATE_REQ,	/* Update an existing request */
> > +	PM_QOS_REMOVE_REQ	/* Remove an existing request */
> > +};
> > +
> 
> What do you need this enum for?  The function names *_update_*, *_add_*,
> and  *_remove_* seem to be pretty redundant if you have to pass an enum
> that could possibly conflict with the function name.
> 
> >  #ifdef CONFIG_PM
> > +int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node,
> > +			 enum pm_qos_req_action action, int value);
> The action for update_target better damn well be "PM_QOS_UPDATE_REQ" or
> there is something strange going on....  BTW what shold this function do
> if the pm_qos_req_action was *not* the UPDATE one?
> 
> 
> pm_qos_update_target should be a static to the C- file along with the
> enum pm_qos_req_action.
> 
> 
> >  void pm_qos_add_request(struct pm_qos_request *req, int pm_qos_class,
> >  			s32 value);
> >  void pm_qos_update_request(struct pm_qos_request *req,
> > @@ -56,6 +65,11 @@ 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);
> >  #else
> > +static inline int pm_qos_update_target(struct pm_qos_constraints *c,
> > +				       struct plist_node *node,
> > +				       enum pm_qos_req_action action,
> > +				       int value)
> > +			{ return 0; }
> >  static inline void pm_qos_add_request(struct pm_qos_request *req,
> >  				      int pm_qos_class, s32 value)
> >  			{ return; }
> > diff --git a/kernel/power/qos.c b/kernel/power/qos.c
> > index 66e8d6f..fc60f96 100644
> > --- a/kernel/power/qos.c
> > +++ b/kernel/power/qos.c
> > @@ -121,17 +121,17 @@ static const struct file_operations pm_qos_power_fops = {
> >  };
> >  
> >  /* unlocked internal variant */
> > -static inline int pm_qos_get_value(struct pm_qos_object *o)
> > +static inline int pm_qos_get_value(struct pm_qos_constraints *c)
> >  {
> > -	if (plist_head_empty(&o->constraints->list))
> > -		return o->constraints->default_value;
> > +	if (plist_head_empty(&c->list))
> > +		return c->default_value;
> >  
> > -	switch (o->constraints->type) {
> > +	switch (c->type) {
> >  	case PM_QOS_MIN:
> > -		return plist_first(&o->constraints->list)->prio;
> > +		return plist_first(&c->list)->prio;
> >  
> >  	case PM_QOS_MAX:
> > -		return plist_last(&o->constraints->list)->prio;
> > +		return plist_last(&c->list)->prio;
> >  
> >  	default:
> >  		/* runtime check for not using enum */
> > @@ -139,47 +139,73 @@ static inline int pm_qos_get_value(struct pm_qos_object *o)
> >  	}
> >  }
> >  
> > -static inline s32 pm_qos_read_value(struct pm_qos_object *o)
> > +static inline s32 pm_qos_read_value(struct pm_qos_constraints *c)
> >  {
> > -	return o->constraints->target_value;
> > +	return c->target_value;
> >  }
> >  
> > -static inline void pm_qos_set_value(struct pm_qos_object *o, s32 value)
> > +static inline void pm_qos_set_value(struct pm_qos_constraints *c, s32 value)
> >  {
> > -	o->constraints->target_value = value;
> > +	c->target_value = value;
> >  }
> >  
> > -static void update_target(struct pm_qos_object *o, struct plist_node *node,
> > -			  int del, int value)
> > +/**
> > + * pm_qos_update_target - manages the constraints list and calls the notifiers
> > + *  if needed
> > + * @c: constraints data struct
> > + * @node: request to add to the list, to update or to remove
> > + * @action: action to take on the constraints list
> > + * @value: value of the request to add or update
> > + *
> > + * This function returns 1 if the aggregated constraint value has changed, 0
> > + *  otherwise.
> > + */
> > +int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node,
> > +			 enum pm_qos_req_action action, int value)
> >  {
> >  	unsigned long flags;
> > -	int prev_value, curr_value;
> > +	int prev_value, curr_value, new_value;
> >  
> >  	spin_lock_irqsave(&pm_qos_lock, flags);
> > -	prev_value = pm_qos_get_value(o);
> > -	/* PM_QOS_DEFAULT_VALUE is a signal that the value is unchanged */
> > -	if (value != PM_QOS_DEFAULT_VALUE) {
> > +	prev_value = pm_qos_get_value(c);
> > +	if (value == PM_QOS_DEFAULT_VALUE)
> > +		new_value = c->default_value;
> > +	else
> > +		new_value = value;
> > +
> > +	switch (action) {
> > +	case PM_QOS_REMOVE_REQ:
> We have a remove request API already.  This overloading of this
> interface feels wrong to me.
> 
> > +		plist_del(node, &c->list);
> > +		break;
> > +	case PM_QOS_UPDATE_REQ:
> >  		/*
> >  		 * to change the list, we atomically remove, reinit
> >  		 * with new value and add, then see if the extremal
> >  		 * changed
> >  		 */
> > -		plist_del(node, &o->constraints->list);
> > -		plist_node_init(node, value);
> > -		plist_add(node, &o->constraints->list);
> > -	} else if (del) {
> > -		plist_del(node, &o->constraints->list);
> > -	} else {
> > -		plist_add(node, &o->constraints->list);
> > +		plist_del(node, &c->list);
> > +	case PM_QOS_ADD_REQ:
> Don't we have an API for adding a request?  if you want to overload
> update like this then either we lose the add API or this shouldn't be
> here.
> 
> 
> > +		plist_node_init(node, new_value);
> > +		plist_add(node, &c->list);
> > +		break;
> > +	default:
> > +		/* no action */
> > +		;
> >  	}
> > -	curr_value = pm_qos_get_value(o);
> > -	pm_qos_set_value(o, curr_value);
> > +
> > +	curr_value = pm_qos_get_value(c);
> > +	pm_qos_set_value(c, curr_value);
> > +
> >  	spin_unlock_irqrestore(&pm_qos_lock, flags);
> >  
> > -	if (prev_value != curr_value)
> > -		blocking_notifier_call_chain(o->constraints->notifiers,
> > +	if (prev_value != curr_value) {
> > +		blocking_notifier_call_chain(c->notifiers,
> >  					     (unsigned long)curr_value,
> >  					     NULL);
> > +		return 1;
> > +	} else {
> > +		return 0;
> > +	}
> >  }
> >  
> >  /**
> > @@ -190,7 +216,7 @@ static void update_target(struct pm_qos_object *o, struct plist_node *node,
> >   */
> >  int pm_qos_request(int pm_qos_class)
> >  {
> > -	return pm_qos_read_value(pm_qos_array[pm_qos_class]);
> > +	return pm_qos_read_value(pm_qos_array[pm_qos_class]->constraints);
> >  }
> >  EXPORT_SYMBOL_GPL(pm_qos_request);
> >  
> > @@ -216,20 +242,16 @@ EXPORT_SYMBOL_GPL(pm_qos_request_active);
> >  void pm_qos_add_request(struct pm_qos_request *req,
> >  			int pm_qos_class, s32 value)
> >  {
> > -	struct pm_qos_object *o =  pm_qos_array[pm_qos_class];
> > -	int new_value;
> > +	if (!req) /*guard against callers passing in null */
> > +		return;
> >  
> >  	if (pm_qos_request_active(req)) {
> >  		WARN(1, KERN_ERR "pm_qos_add_request() called for already added request\n");
> >  		return;
> >  	}
> > -	if (value == PM_QOS_DEFAULT_VALUE)
> > -		new_value = o->constraints->default_value;
> > -	else
> > -		new_value = value;
> > -	plist_node_init(&req->node, new_value);
> >  	req->pm_qos_class = pm_qos_class;
> > -	update_target(o, &req->node, 0, PM_QOS_DEFAULT_VALUE);
> > +	pm_qos_update_target(pm_qos_array[pm_qos_class]->constraints,
> > +			     &req->node, PM_QOS_ADD_REQ, value);
> 
> Ok, using pm_qos_update_target to reduce the LOC is ok but I don't think
> this function and the enum should be exported outside of pm_qos.c

They are used by the next patches adding the per-device QoS.

Thanks,
Rafael

  reply	other threads:[~2011-08-13 20:32 UTC|newest]

Thread overview: 85+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-11 15:06 [PATCH v4 00/15] PM QoS: add a per-device latency constraints class jean.pihet
2011-08-11 15:06 ` [PATCH 01/15] PM QoS: move and rename the implementation files jean.pihet
2011-08-13  2:47   ` mark gross
2011-08-13  2:47   ` mark gross
2011-08-11 15:06 ` jean.pihet
2011-08-11 15:06 ` [PATCH 02/15] PM QoS: minor clean-ups jean.pihet
2011-08-13  2:48   ` mark gross
2011-08-13  2:48   ` mark gross
2011-08-11 15:06 ` jean.pihet
2011-08-11 15:06 ` [PATCH 03/15] PM QoS: code re-organization jean.pihet
2011-08-11 15:06 ` jean.pihet
2011-08-13  2:50   ` mark gross
2011-08-13  2:50   ` mark gross
2011-08-11 15:06 ` [PATCH 04/15] PM QoS: re-organize data structs jean.pihet
2011-08-13  2:56   ` mark gross
2011-08-13 20:58     ` Rafael J. Wysocki
2011-08-14  8:29       ` Jean Pihet
2011-08-14  8:29       ` Jean Pihet
2011-08-14 13:34         ` Rafael J. Wysocki
2011-08-14 13:34         ` Rafael J. Wysocki
2011-08-13 20:58     ` Rafael J. Wysocki
2011-08-13  2:56   ` mark gross
2011-08-11 15:06 ` jean.pihet
2011-08-11 15:06 ` [PATCH 05/15] PM QoS: generalize and export the constraints management code jean.pihet
2011-08-11 15:06 ` jean.pihet
2011-08-13  3:09   ` mark gross
2011-08-13 20:34     ` Rafael J. Wysocki [this message]
2011-08-14  8:25       ` Jean Pihet
2011-08-14 13:37         ` Rafael J. Wysocki
2011-08-16  4:08           ` mark gross
2011-08-16  4:08           ` mark gross
2011-08-16  6:44             ` Jean Pihet
2011-08-16 17:45               ` mark gross
2011-08-16 18:01                 ` Rafael J. Wysocki
2011-08-16 18:01                 ` Rafael J. Wysocki
2011-08-16 17:45               ` mark gross
2011-08-16  6:44             ` Jean Pihet
2011-08-14 13:37         ` Rafael J. Wysocki
2011-08-14  8:25       ` Jean Pihet
2011-08-13 20:34     ` Rafael J. Wysocki
2011-08-13  3:09   ` mark gross
2011-08-11 15:06 ` [PATCH 06/15] PM QoS: implement the per-device PM QoS constraints jean.pihet
2011-08-13  3:16   ` mark gross
2011-08-13  3:16   ` mark gross
2011-08-13 21:08   ` Rafael J. Wysocki
2011-08-14  8:50     ` Jean Pihet
2011-08-14 13:51       ` Rafael J. Wysocki
2011-08-14 13:51       ` Rafael J. Wysocki
2011-08-14  8:50     ` Jean Pihet
2011-08-13 21:08   ` Rafael J. Wysocki
2011-08-11 15:06 ` jean.pihet
2011-08-11 15:06 ` [PATCH 07/15] PM QoS: add a global notification mechanism for the device constraints jean.pihet
2011-08-11 15:06 ` jean.pihet
2011-08-14 21:50   ` Rafael J. Wysocki
2011-08-16  9:58     ` Jean Pihet
2011-08-16  9:58     ` Jean Pihet
2011-08-14 21:50   ` Rafael J. Wysocki
2011-08-11 15:06 ` [PATCH 08/15] OMAP: convert I2C driver to PM QoS for latency constraints jean.pihet
2011-08-11 15:06 ` jean.pihet
2011-08-11 15:06 ` [PATCH 09/15] OMAP: PM: create a PM layer plugin for per-device constraints jean.pihet
2011-08-11 15:06 ` jean.pihet
2011-08-11 15:06 ` [PATCH 10/15] OMAP2+: powerdomain: control power domains next state jean.pihet
2011-08-11 15:06 ` jean.pihet
2011-08-11 15:06 ` [PATCH 11/15] OMAP3: powerdomain data: add wake-up latency figures jean.pihet
2011-08-11 15:06 ` jean.pihet
2011-08-11 15:06 ` [PATCH 12/15] OMAP4: " jean.pihet
2011-08-11 15:06 ` jean.pihet
2011-08-11 15:06 ` [PATCH 13/15] OMAP2+: omap_hwmod: manage the wake-up latency constraints jean.pihet
2011-08-11 15:06 ` jean.pihet
2011-08-11 15:06 ` [PATCH 14/15] OMAP: PM CONSTRAINTS: implement the devices " jean.pihet
2011-08-11 15:06 ` jean.pihet
2011-08-11 15:06 ` [PATCH 15/15] OMAP2+: cpuidle only influences the MPU state jean.pihet
2011-08-11 15:06 ` jean.pihet
2011-08-12  8:02 ` [PATCH v4 00/15] PM QoS: add a per-device latency constraints class Rafael J. Wysocki
2011-08-12 11:56   ` Jean Pihet
2011-08-12 21:56     ` Rafael J. Wysocki
2011-08-12 21:56     ` Rafael J. Wysocki
2011-08-14  8:51       ` Jean Pihet
2011-08-14  8:51       ` Jean Pihet
2011-08-14 13:53         ` Rafael J. Wysocki
2011-08-14 13:53         ` Rafael J. Wysocki
2011-08-12 11:56   ` Jean Pihet
2011-08-12  8:02 ` Rafael J. Wysocki
2011-08-16 13:43 [PATCH v5 00/15] PM QoS: add a per-device latency constraints framework jean.pihet
2011-08-16 13:43 ` [PATCH 05/15] PM QoS: generalize and export the constraints management code jean.pihet
2011-08-16 13:43 ` jean.pihet

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201108132234.17377.rjw@sisk.pl \
    --to=rjw@sisk.pl \
    --cc=broonie@opensource.wolfsonmicro.com \
    --cc=j-pihet@ti.com \
    --cc=jean.pihet@newoldbits.com \
    --cc=khilman@ti.com \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux-pm@lists.linux-foundation.org \
    --cc=magnus.damm@gmail.com \
    --cc=markgross@thegnar.org \
    --cc=paul@pwsan.com \
    --cc=toddpoynor@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.