diff mbox

[v1,2/3] PM / Sleep: introduce dpm_for_each_dev

Message ID 1345212420-1707-3-git-send-email-ming.lei@canonical.com (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Ming Lei Aug. 17, 2012, 2:06 p.m. UTC
dpm_list and its pm lock provide a good way to iterate all
devices in system. Except this way, there is no other easy
way to iterate devices in system.

firmware loader need to cache firmware images for devices
before system sleep, so introduce the function to meet its
demand.

Reported-by: Fengguang Wu <fengguang.wu@intel.com>
Signed-off-by: Ming Lei <ming.lei@canonical.com>
---
 drivers/base/power/main.c |   22 ++++++++++++++++++++++
 include/linux/pm.h        |    5 +++++
 2 files changed, 27 insertions(+)

Comments

Rafael Wysocki Aug. 17, 2012, 10:02 p.m. UTC | #1
On Friday, August 17, 2012, Ming Lei wrote:
> dpm_list and its pm lock provide a good way to iterate all
> devices in system. Except this way, there is no other easy
> way to iterate devices in system.
> 
> firmware loader need to cache firmware images for devices
> before system sleep, so introduce the function to meet its
> demand.
> 
> Reported-by: Fengguang Wu <fengguang.wu@intel.com>
> Signed-off-by: Ming Lei <ming.lei@canonical.com>

Well.

> ---
>  drivers/base/power/main.c |   22 ++++++++++++++++++++++
>  include/linux/pm.h        |    5 +++++
>  2 files changed, 27 insertions(+)
> 
> diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
> index 57f5814..23b417f 100644
> --- a/drivers/base/power/main.c
> +++ b/drivers/base/power/main.c
> @@ -1349,3 +1349,25 @@ int device_pm_wait_for_dev(struct device *subordinate, struct device *dev)
>  	return async_error;
>  }
>  EXPORT_SYMBOL_GPL(device_pm_wait_for_dev);
> +
> +/**
> + * dpm_for_each_dev - device iterator.
> + * @data: data for the callback.
> + * @fn: function to be called for each device.
> + *
> + * Iterate over devices in dpm_list, and call @fn for each device,
> + * passing it @data.
> + */
> +void dpm_for_each_dev(void *data, void (*fn)(struct device *, void *))

Is this function actually used more than once?

> +{
> +	struct device *dev;
> +
> +	if (!fn)
> +		return;
> +
> +	device_pm_lock();
> +	list_for_each_entry(dev, &dpm_list, power.entry)
> +		fn(dev, data);
> +	device_pm_unlock();
> +}
> +EXPORT_SYMBOL_GPL(dpm_for_each_dev);
> diff --git a/include/linux/pm.h b/include/linux/pm.h
> index 44d1f23..007e687 100644
> --- a/include/linux/pm.h
> +++ b/include/linux/pm.h
> @@ -640,6 +640,7 @@ extern void __suspend_report_result(const char *function, void *fn, int ret);
>  	} while (0)
>  
>  extern int device_pm_wait_for_dev(struct device *sub, struct device *dev);
> +extern void dpm_for_each_dev(void *data, void (*fn)(struct device *, void *));
>  
>  extern int pm_generic_prepare(struct device *dev);
>  extern int pm_generic_suspend_late(struct device *dev);
> @@ -679,6 +680,10 @@ static inline int device_pm_wait_for_dev(struct device *a, struct device *b)
>  	return 0;
>  }
>  
> +static inline void dpm_for_each_dev(void *data, void (*fn)(struct device *, void *))
> +{
> +}
> +
>  #define pm_generic_prepare	NULL
>  #define pm_generic_suspend	NULL
>  #define pm_generic_resume	NULL

Rafael
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Ming Lei Aug. 18, 2012, 12:43 a.m. UTC | #2
On Sat, Aug 18, 2012 at 6:02 AM, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> On Friday, August 17, 2012, Ming Lei wrote:
>> +void dpm_for_each_dev(void *data, void (*fn)(struct device *, void *))
>
> Is this function actually used more than once?

At least now, it is called each time before system sleep.


Thanks,
--
Ming Lei
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rafael Wysocki Aug. 18, 2012, 1:38 p.m. UTC | #3
On Saturday, August 18, 2012, Ming Lei wrote:
> On Sat, Aug 18, 2012 at 6:02 AM, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> > On Friday, August 17, 2012, Ming Lei wrote:
> >> +void dpm_for_each_dev(void *data, void (*fn)(struct device *, void *))
> >
> > Is this function actually used more than once?
> 
> At least now, it is called each time before system sleep.

My question was about the number of current users of it.  Sorry for not
being clear.

If there are no more anticipated users than the current only one, please
drop the unused (void *) argument.  We can always extend it in the future
if need be and for now passing that NULL every time is just pointless.

And please fold [2/3] into [3/3] in this series.

I'm not particuarly fond of this patch, but I guess it would require some
consderable juggling of #ifdefs to fix the build breakage in a different way.

Thanks,
Rafael
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Ming Lei Aug. 18, 2012, 2:52 p.m. UTC | #4
On Sat, Aug 18, 2012 at 9:38 PM, Rafael J. Wysocki <rjw@sisk.pl> wrote:
>
> My question was about the number of current users of it.  Sorry for not
> being clear.

Sorry for misunderstanding your question.

>
> If there are no more anticipated users than the current only one, please
> drop the unused (void *) argument.  We can always extend it in the future
> if need be and for now passing that NULL every time is just pointless.

One usage is to get statistics info about devices for debug purpose,
so the parameter is needed to return something.

> And please fold [2/3] into [3/3] in this series.

IMO, it is better to split them to avoid coupling between fw loader and
device PM.

Looks you agreed on the patch, and Greg has added the
patch into his driver-core next tree to fix -next build failure, so could
you just let them be that?

>
> I'm not particuarly fond of this patch, but I guess it would require some
> consderable juggling of #ifdefs to fix the build breakage in a different way.

Firmware loader might be built as module, so without exporting something
from device PM core, the problem can't be fixed.


Thanks,
--
Ming Lei
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rafael Wysocki Aug. 18, 2012, 8:33 p.m. UTC | #5
On Saturday, August 18, 2012, Ming Lei wrote:
> On Sat, Aug 18, 2012 at 9:38 PM, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> >
> > My question was about the number of current users of it.  Sorry for not
> > being clear.
> 
> Sorry for misunderstanding your question.
> 
> >
> > If there are no more anticipated users than the current only one, please
> > drop the unused (void *) argument.  We can always extend it in the future
> > if need be and for now passing that NULL every time is just pointless.
> 
> One usage is to get statistics info about devices for debug purpose,
> so the parameter is needed to return something.

So, what's the name of the _second_ function using dpm_for_each_dev()?

I don't see any and device_cache_fw_images() in [3/3] clearly passes
NULL as the first argument.

> > And please fold [2/3] into [3/3] in this series.
> 
> IMO, it is better to split them to avoid coupling between fw loader and
> device PM.
> 
> Looks you agreed on the patch,

On the idea, not on the actual code.  I told you what I wanted to to change in
it, didn't I?

> and Greg has added the
> patch into his driver-core next tree to fix -next build failure, so could
> you just let them be that?

-next is not cast in stone, you can replace patches in it with other ones
if need be.

Thanks,
Rafael
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rafael Wysocki Aug. 18, 2012, 8:49 p.m. UTC | #6
On Saturday, August 18, 2012, Rafael J. Wysocki wrote:
> On Saturday, August 18, 2012, Ming Lei wrote:
> > On Sat, Aug 18, 2012 at 9:38 PM, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> > >
> > > My question was about the number of current users of it.  Sorry for not
> > > being clear.
> > 
> > Sorry for misunderstanding your question.
> > 
> > >
> > > If there are no more anticipated users than the current only one, please
> > > drop the unused (void *) argument.  We can always extend it in the future
> > > if need be and for now passing that NULL every time is just pointless.
> > 
> > One usage is to get statistics info about devices for debug purpose,
> > so the parameter is needed to return something.
> 
> So, what's the name of the _second_ function using dpm_for_each_dev()?
> 
> I don't see any and device_cache_fw_images() in [3/3] clearly passes
> NULL as the first argument.
> 
> > > And please fold [2/3] into [3/3] in this series.
> > 
> > IMO, it is better to split them to avoid coupling between fw loader and
> > device PM.
> > 
> > Looks you agreed on the patch,
> 
> On the idea, not on the actual code.  I told you what I wanted to to change in
> it, didn't I?
> 
> > and Greg has added the
> > patch into his driver-core next tree to fix -next build failure, so could
> > you just let them be that?
> 
> -next is not cast in stone, you can replace patches in it with other ones
> if need be.

And it actually would be better if you replaced the patches that had introduced
the build problems with new fixed ones, because otherwise your whole series
has bisection issues potentially.

And since the Greg's patch queue is quilt-based, for what I can tell, that's
entirely doable.

So the fact that your patches in this series fix build issues in -next
introduced by your previous patches isn't any excuse at all.  There still is
a plenty of time before the v3.7 merge window to fix things properly.

Thanks,
Rafael
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Greg KH Aug. 19, 2012, 6:20 a.m. UTC | #7
On Sat, Aug 18, 2012 at 10:49:06PM +0200, Rafael J. Wysocki wrote:
> On Saturday, August 18, 2012, Rafael J. Wysocki wrote:
> > On Saturday, August 18, 2012, Ming Lei wrote:
> > > On Sat, Aug 18, 2012 at 9:38 PM, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> > > >
> > > > My question was about the number of current users of it.  Sorry for not
> > > > being clear.
> > > 
> > > Sorry for misunderstanding your question.
> > > 
> > > >
> > > > If there are no more anticipated users than the current only one, please
> > > > drop the unused (void *) argument.  We can always extend it in the future
> > > > if need be and for now passing that NULL every time is just pointless.
> > > 
> > > One usage is to get statistics info about devices for debug purpose,
> > > so the parameter is needed to return something.
> > 
> > So, what's the name of the _second_ function using dpm_for_each_dev()?
> > 
> > I don't see any and device_cache_fw_images() in [3/3] clearly passes
> > NULL as the first argument.
> > 
> > > > And please fold [2/3] into [3/3] in this series.
> > > 
> > > IMO, it is better to split them to avoid coupling between fw loader and
> > > device PM.
> > > 
> > > Looks you agreed on the patch,
> > 
> > On the idea, not on the actual code.  I told you what I wanted to to change in
> > it, didn't I?
> > 
> > > and Greg has added the
> > > patch into his driver-core next tree to fix -next build failure, so could
> > > you just let them be that?
> > 
> > -next is not cast in stone, you can replace patches in it with other ones
> > if need be.
> 
> And it actually would be better if you replaced the patches that had introduced
> the build problems with new fixed ones, because otherwise your whole series
> has bisection issues potentially.
> 
> And since the Greg's patch queue is quilt-based, for what I can tell, that's
> entirely doable.

No, my patch queue hasn't been quilt-based for almost 2 years now.  It's
git-based, and I can revert anything that I need to, including this
whole series, but I can't rewrite history, sorry.

greg k-h
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rafael Wysocki Aug. 19, 2012, 8:10 p.m. UTC | #8
On Sunday, August 19, 2012, Greg Kroah-Hartman wrote:
> On Sat, Aug 18, 2012 at 10:49:06PM +0200, Rafael J. Wysocki wrote:
> > On Saturday, August 18, 2012, Rafael J. Wysocki wrote:
> > > On Saturday, August 18, 2012, Ming Lei wrote:
> > > > On Sat, Aug 18, 2012 at 9:38 PM, Rafael J. Wysocki <rjw@sisk.pl> wrote:
> > > > >
> > > > > My question was about the number of current users of it.  Sorry for not
> > > > > being clear.
> > > > 
> > > > Sorry for misunderstanding your question.
> > > > 
> > > > >
> > > > > If there are no more anticipated users than the current only one, please
> > > > > drop the unused (void *) argument.  We can always extend it in the future
> > > > > if need be and for now passing that NULL every time is just pointless.
> > > > 
> > > > One usage is to get statistics info about devices for debug purpose,
> > > > so the parameter is needed to return something.
> > > 
> > > So, what's the name of the _second_ function using dpm_for_each_dev()?
> > > 
> > > I don't see any and device_cache_fw_images() in [3/3] clearly passes
> > > NULL as the first argument.
> > > 
> > > > > And please fold [2/3] into [3/3] in this series.
> > > > 
> > > > IMO, it is better to split them to avoid coupling between fw loader and
> > > > device PM.
> > > > 
> > > > Looks you agreed on the patch,
> > > 
> > > On the idea, not on the actual code.  I told you what I wanted to to change in
> > > it, didn't I?
> > > 
> > > > and Greg has added the
> > > > patch into his driver-core next tree to fix -next build failure, so could
> > > > you just let them be that?
> > > 
> > > -next is not cast in stone, you can replace patches in it with other ones
> > > if need be.
> > 
> > And it actually would be better if you replaced the patches that had introduced
> > the build problems with new fixed ones, because otherwise your whole series
> > has bisection issues potentially.
> > 
> > And since the Greg's patch queue is quilt-based, for what I can tell, that's
> > entirely doable.
> 
> No, my patch queue hasn't been quilt-based for almost 2 years now.  It's
> git-based, and I can revert anything that I need to, including this
> whole series, but I can't rewrite history, sorry.

Well, I was wrong, then, sorry.

Never mind, I'll clean up that mess later. :-)

By the way, that's why I started to use temporary branches that are only
merged into my linux-next branch and don't show up anywhere else for several
days until I'm quite confident they don't introduce silly build issues
for combinations of config options that the patch authors didn't anticipate
(sometimes they are combinations of config options that nobody saner than the
crazy monkey's brother Max whom Linus was talking about some time ago would
ever use in practice; and I honestly doubt that even Max would use some of
them, even on one of his worst days).

Afterward they are just renamed and published if there are no build issues
with them.  Otherwise, I can just nuke them entirely and re-create them from
scratch folding build fixes into the patches that introduced the build
problems.

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

Patch

diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
index 57f5814..23b417f 100644
--- a/drivers/base/power/main.c
+++ b/drivers/base/power/main.c
@@ -1349,3 +1349,25 @@  int device_pm_wait_for_dev(struct device *subordinate, struct device *dev)
 	return async_error;
 }
 EXPORT_SYMBOL_GPL(device_pm_wait_for_dev);
+
+/**
+ * dpm_for_each_dev - device iterator.
+ * @data: data for the callback.
+ * @fn: function to be called for each device.
+ *
+ * Iterate over devices in dpm_list, and call @fn for each device,
+ * passing it @data.
+ */
+void dpm_for_each_dev(void *data, void (*fn)(struct device *, void *))
+{
+	struct device *dev;
+
+	if (!fn)
+		return;
+
+	device_pm_lock();
+	list_for_each_entry(dev, &dpm_list, power.entry)
+		fn(dev, data);
+	device_pm_unlock();
+}
+EXPORT_SYMBOL_GPL(dpm_for_each_dev);
diff --git a/include/linux/pm.h b/include/linux/pm.h
index 44d1f23..007e687 100644
--- a/include/linux/pm.h
+++ b/include/linux/pm.h
@@ -640,6 +640,7 @@  extern void __suspend_report_result(const char *function, void *fn, int ret);
 	} while (0)
 
 extern int device_pm_wait_for_dev(struct device *sub, struct device *dev);
+extern void dpm_for_each_dev(void *data, void (*fn)(struct device *, void *));
 
 extern int pm_generic_prepare(struct device *dev);
 extern int pm_generic_suspend_late(struct device *dev);
@@ -679,6 +680,10 @@  static inline int device_pm_wait_for_dev(struct device *a, struct device *b)
 	return 0;
 }
 
+static inline void dpm_for_each_dev(void *data, void (*fn)(struct device *, void *))
+{
+}
+
 #define pm_generic_prepare	NULL
 #define pm_generic_suspend	NULL
 #define pm_generic_resume	NULL