2009-01-10 05:13:26

by Arjan van de Ven

[permalink] [raw]
Subject: [PATCH 1/2] consolidate driver_probe_done() loops into one place

>From 11b47973023398ecdb933c442bab120906946762 Mon Sep 17 00:00:00 2001
From: Arjan van de Ven <[email protected]>
Date: Fri, 9 Jan 2009 21:04:53 -0800
Subject: [PATCH] consolidate driver_probe_done() loops into one place

there's a few places that currently loop over driver_probe_done(), and
I'm about to add another one. This patch abstracts it into a helper
to reduce duplication.

Signed-off-by: Arjan van de Ven <[email protected]>
---
drivers/base/dd.c | 16 ++++++++++++++++
include/linux/device.h | 2 ++
init/do_mounts.c | 13 +++++++++----
init/do_mounts_md.c | 5 +++--
4 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index 315bed8..b911fab 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -21,6 +21,7 @@
#include <linux/module.h>
#include <linux/kthread.h>
#include <linux/wait.h>
+#include <linux/async.h>

#include "base.h"
#include "power/power.h"
@@ -168,6 +169,21 @@ int driver_probe_done(void)
}

/**
+ * wait_for_device_probe
+ * Wait for device probing to be completed.
+ *
+ * Note: this function polls at 100 msec intervals.
+ */
+int wait_for_device_probe(void)
+{
+ /* wait for the known devices to complete their probing */
+ while (driver_probe_done() != 0)
+ msleep(100);
+ async_synchronize_full();
+ return 0;
+}
+
+/**
* driver_probe_device - attempt to bind device & driver together
* @drv: driver to bind a device to
* @dev: device to try to bind to the driver
diff --git a/include/linux/device.h b/include/linux/device.h
index 45e5b19..47f343c 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -147,6 +147,8 @@ extern void put_driver(struct device_driver *drv);
extern struct device_driver *driver_find(const char *name,
struct bus_type *bus);
extern int driver_probe_done(void);
+extern int wait_for_device_probe(void);
+

/* sysfs interface for exporting driver attributes */

diff --git a/init/do_mounts.c b/init/do_mounts.c
index 708105e..2c80113 100644
--- a/init/do_mounts.c
+++ b/init/do_mounts.c
@@ -370,10 +370,14 @@ void __init prepare_namespace(void)
ssleep(root_delay);
}

- /* wait for the known devices to complete their probing */
- while (driver_probe_done() != 0)
- msleep(100);
- async_synchronize_full();
+ /*
+ * wait for the known devices to complete their probing
+ *
+ * Note: this is a potential source of long boot delays.
+ * For example, it is not atypical to wait 5 seconds here
+ * for the touchpad of a laptop to initialize.
+ */
+ wait_for_device_probe();

md_run_setup();

@@ -399,6 +403,7 @@ void __init prepare_namespace(void)
while (driver_probe_done() != 0 ||
(ROOT_DEV = name_to_dev_t(saved_root_name)) == 0)
msleep(100);
+ async_synchronize_full();
}

is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
diff --git a/init/do_mounts_md.c b/init/do_mounts_md.c
index ff95e31..9bdddbc 100644
--- a/init/do_mounts_md.c
+++ b/init/do_mounts_md.c
@@ -281,8 +281,9 @@ static void __init autodetect_raid(void)
*/
printk(KERN_INFO "md: Waiting for all devices to be available before autodetect\n");
printk(KERN_INFO "md: If you don't use raid, use raid=noautodetect\n");
- while (driver_probe_done() < 0)
- msleep(100);
+
+ wait_for_device_probe();
+
fd = sys_open("/dev/md0", 0, 0);
if (fd >= 0) {
sys_ioctl(fd, RAID_AUTORUN, raid_autopart);
--
1.6.0.6



--
Arjan van de Ven Intel Open Source Technology Centre
For development, discussion and tips for power savings,
visit http://www.lesswatts.org


2009-01-10 05:13:06

by Arjan van de Ven

[permalink] [raw]
Subject: [PATCH 2/2] resume: wait for device probing to finish

(this patch needs testing on a few different machines; compile tested only)


>From 10b3e25671c817933e232498a56640fd48964345 Mon Sep 17 00:00:00 2001
From: Arjan van de Ven <[email protected]>
Date: Fri, 9 Jan 2009 21:11:23 -0800
Subject: [PATCH] resume: wait for device probing to finish

the resume code does not currently wait for device probing to finish.
Even without async function calls this is dicey and not correct,
but with async function calls during the boot sequence this is going
to get hit more...

This patch adds the synchronization using the newly introduced helper.

Signed-off-by: Arjan van de Ven <[email protected]>
---
kernel/power/disk.c | 11 +++++++++++
1 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/kernel/power/disk.c b/kernel/power/disk.c
index 45e8541..d2d24b7 100644
--- a/kernel/power/disk.c
+++ b/kernel/power/disk.c
@@ -585,6 +585,12 @@ static int software_resume(void)
unsigned int flags;

/*
+ * If the user said "noresume".. bail out early.
+ */
+ if (noresume)
+ return 0;
+
+ /*
* name_to_dev_t() below takes a sysfs buffer mutex when sysfs
* is configured into the kernel. Since the regular hibernate
* trigger path is via sysfs which takes a buffer mutex before
@@ -600,6 +606,11 @@ static int software_resume(void)
mutex_unlock(&pm_mutex);
return -ENOENT;
}
+ /*
+ * Some device discovery might still be in progress; we need
+ * to wait for this to finish.
+ */
+ wait_for_device_probe();
swsusp_resume_device = name_to_dev_t(resume_file);
pr_debug("PM: Resume from partition %s\n", resume_file);
} else {
--
1.6.0.6



--
Arjan van de Ven Intel Open Source Technology Centre
For development, discussion and tips for power savings,
visit http://www.lesswatts.org

2009-01-13 00:37:47

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH 2/2] resume: wait for device probing to finish

On Saturday 10 January 2009, Arjan van de Ven wrote:
> (this patch needs testing on a few different machines; compile tested only)
>
>
> From 10b3e25671c817933e232498a56640fd48964345 Mon Sep 17 00:00:00 2001
> From: Arjan van de Ven <[email protected]>
> Date: Fri, 9 Jan 2009 21:11:23 -0800
> Subject: [PATCH] resume: wait for device probing to finish
>
> the resume code does not currently wait for device probing to finish.
> Even without async function calls this is dicey and not correct,
> but with async function calls during the boot sequence this is going
> to get hit more...
>
> This patch adds the synchronization using the newly introduced helper.
>
> Signed-off-by: Arjan van de Ven <[email protected]>

Sorry for the delay, but I only could do the testing today.

It appears that 2.6.29-rc1 with the two patches in this series applied resumes
from hibernation correctly.

Please push the second one to Len with my ack.

Thanks,
Rafael


> ---
> kernel/power/disk.c | 11 +++++++++++
> 1 files changed, 11 insertions(+), 0 deletions(-)
>
> diff --git a/kernel/power/disk.c b/kernel/power/disk.c
> index 45e8541..d2d24b7 100644
> --- a/kernel/power/disk.c
> +++ b/kernel/power/disk.c
> @@ -585,6 +585,12 @@ static int software_resume(void)
> unsigned int flags;
>
> /*
> + * If the user said "noresume".. bail out early.
> + */
> + if (noresume)
> + return 0;
> +
> + /*
> * name_to_dev_t() below takes a sysfs buffer mutex when sysfs
> * is configured into the kernel. Since the regular hibernate
> * trigger path is via sysfs which takes a buffer mutex before
> @@ -600,6 +606,11 @@ static int software_resume(void)
> mutex_unlock(&pm_mutex);
> return -ENOENT;
> }
> + /*
> + * Some device discovery might still be in progress; we need
> + * to wait for this to finish.
> + */
> + wait_for_device_probe();
> swsusp_resume_device = name_to_dev_t(resume_file);
> pr_debug("PM: Resume from partition %s\n", resume_file);
> } else {
> --
> 1.6.0.6

2009-01-25 22:48:23

by Greg KH

[permalink] [raw]
Subject: Re: [PATCH 1/2] consolidate driver_probe_done() loops into one place

On Fri, Jan 09, 2009 at 09:13:46PM -0800, Arjan van de Ven wrote:
> From 11b47973023398ecdb933c442bab120906946762 Mon Sep 17 00:00:00 2001
> From: Arjan van de Ven <[email protected]>
> Date: Fri, 9 Jan 2009 21:04:53 -0800
> Subject: [PATCH] consolidate driver_probe_done() loops into one place
>
> there's a few places that currently loop over driver_probe_done(), and
> I'm about to add another one. This patch abstracts it into a helper
> to reduce duplication.
>
> Signed-off-by: Arjan van de Ven <[email protected]>

Acked-by: Greg Kroah-Hartman <[email protected]>

Do you need me to take this through my tree? Or is it going through the
acpi tree?

thanks,

greg k-h

2009-01-26 16:48:34

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH 1/2] consolidate driver_probe_done() loops into one place

On Sunday 25 January 2009, Greg KH wrote:
> On Fri, Jan 09, 2009 at 09:13:46PM -0800, Arjan van de Ven wrote:
> > From 11b47973023398ecdb933c442bab120906946762 Mon Sep 17 00:00:00 2001
> > From: Arjan van de Ven <[email protected]>
> > Date: Fri, 9 Jan 2009 21:04:53 -0800
> > Subject: [PATCH] consolidate driver_probe_done() loops into one place
> >
> > there's a few places that currently loop over driver_probe_done(), and
> > I'm about to add another one. This patch abstracts it into a helper
> > to reduce duplication.
> >
> > Signed-off-by: Arjan van de Ven <[email protected]>
>
> Acked-by: Greg Kroah-Hartman <[email protected]>
>
> Do you need me to take this through my tree? Or is it going through the
> acpi tree?

I've lost the track.

Anyway, it's a part of a two-patch series and I think both are in -mm.

Andrew, do you have them?

Rafael

2009-01-26 16:59:56

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH 1/2] consolidate driver_probe_done() loops into one place

On Mon, 26 Jan 2009 17:48:05 +0100 "Rafael J. Wysocki" <[email protected]> wrote:

> On Sunday 25 January 2009, Greg KH wrote:
> > On Fri, Jan 09, 2009 at 09:13:46PM -0800, Arjan van de Ven wrote:
> > > From 11b47973023398ecdb933c442bab120906946762 Mon Sep 17 00:00:00 2001
> > > From: Arjan van de Ven <[email protected]>
> > > Date: Fri, 9 Jan 2009 21:04:53 -0800
> > > Subject: [PATCH] consolidate driver_probe_done() loops into one place
> > >
> > > there's a few places that currently loop over driver_probe_done(), and
> > > I'm about to add another one. This patch abstracts it into a helper
> > > to reduce duplication.
> > >
> > > Signed-off-by: Arjan van de Ven <[email protected]>
> >
> > Acked-by: Greg Kroah-Hartman <[email protected]>
> >
> > Do you need me to take this through my tree? Or is it going through the
> > acpi tree?
>
> I've lost the track.
>
> Anyway, it's a part of a two-patch series and I think both are in -mm.
>
> Andrew, do you have them?
>

I have these:

early-platform-drivers-v2.patch
drivers-consolidate-driver_probe_done-loops-into-one-place.patch
drivers-consolidate-driver_probe_done-loops-into-one-place-fix.patch
drivers-consolidate-driver_probe_done-loops-into-one-place-checkpatch-fixes.patch
resume-wait-for-device-probing-to-finish.patch
sysfs-use-standard-magich-for-sysfs.patch

queued up for sending into Greg for his "driver core" tree.

2009-01-26 19:19:44

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH 1/2] consolidate driver_probe_done() loops into one place

On Monday 26 January 2009, Andrew Morton wrote:
> On Mon, 26 Jan 2009 17:48:05 +0100 "Rafael J. Wysocki" <[email protected]> wrote:
>
> > On Sunday 25 January 2009, Greg KH wrote:
> > > On Fri, Jan 09, 2009 at 09:13:46PM -0800, Arjan van de Ven wrote:
> > > > From 11b47973023398ecdb933c442bab120906946762 Mon Sep 17 00:00:00 2001
> > > > From: Arjan van de Ven <[email protected]>
> > > > Date: Fri, 9 Jan 2009 21:04:53 -0800
> > > > Subject: [PATCH] consolidate driver_probe_done() loops into one place
> > > >
> > > > there's a few places that currently loop over driver_probe_done(), and
> > > > I'm about to add another one. This patch abstracts it into a helper
> > > > to reduce duplication.
> > > >
> > > > Signed-off-by: Arjan van de Ven <[email protected]>
> > >
> > > Acked-by: Greg Kroah-Hartman <[email protected]>
> > >
> > > Do you need me to take this through my tree? Or is it going through the
> > > acpi tree?
> >
> > I've lost the track.
> >
> > Anyway, it's a part of a two-patch series and I think both are in -mm.
> >
> > Andrew, do you have them?
> >
>
> I have these:
>
> early-platform-drivers-v2.patch
> drivers-consolidate-driver_probe_done-loops-into-one-place.patch
> drivers-consolidate-driver_probe_done-loops-into-one-place-fix.patch
> drivers-consolidate-driver_probe_done-loops-into-one-place-checkpatch-fixes.patch
> resume-wait-for-device-probing-to-finish.patch
> sysfs-use-standard-magich-for-sysfs.patch
>
> queued up for sending into Greg for his "driver core" tree.

Thanks!

Greg, I assume you're going to get them from Andrew shortly. 2-4 definitely
are .29 material (they fix a regression), the others two I don't know.

Rafael

2009-01-26 21:09:05

by Greg KH

[permalink] [raw]
Subject: Re: [PATCH 1/2] consolidate driver_probe_done() loops into one place

On Mon, Jan 26, 2009 at 08:18:40PM +0100, Rafael J. Wysocki wrote:
> On Monday 26 January 2009, Andrew Morton wrote:
> > On Mon, 26 Jan 2009 17:48:05 +0100 "Rafael J. Wysocki" <[email protected]> wrote:
> >
> > > On Sunday 25 January 2009, Greg KH wrote:
> > > > On Fri, Jan 09, 2009 at 09:13:46PM -0800, Arjan van de Ven wrote:
> > > > > From 11b47973023398ecdb933c442bab120906946762 Mon Sep 17 00:00:00 2001
> > > > > From: Arjan van de Ven <[email protected]>
> > > > > Date: Fri, 9 Jan 2009 21:04:53 -0800
> > > > > Subject: [PATCH] consolidate driver_probe_done() loops into one place
> > > > >
> > > > > there's a few places that currently loop over driver_probe_done(), and
> > > > > I'm about to add another one. This patch abstracts it into a helper
> > > > > to reduce duplication.
> > > > >
> > > > > Signed-off-by: Arjan van de Ven <[email protected]>
> > > >
> > > > Acked-by: Greg Kroah-Hartman <[email protected]>
> > > >
> > > > Do you need me to take this through my tree? Or is it going through the
> > > > acpi tree?
> > >
> > > I've lost the track.
> > >
> > > Anyway, it's a part of a two-patch series and I think both are in -mm.
> > >
> > > Andrew, do you have them?
> > >
> >
> > I have these:
> >
> > early-platform-drivers-v2.patch
> > drivers-consolidate-driver_probe_done-loops-into-one-place.patch
> > drivers-consolidate-driver_probe_done-loops-into-one-place-fix.patch
> > drivers-consolidate-driver_probe_done-loops-into-one-place-checkpatch-fixes.patch
> > resume-wait-for-device-probing-to-finish.patch
> > sysfs-use-standard-magich-for-sysfs.patch
> >
> > queued up for sending into Greg for his "driver core" tree.
>
> Thanks!
>
> Greg, I assume you're going to get them from Andrew shortly. 2-4 definitely
> are .29 material (they fix a regression), the others two I don't know.

They are? I didn't realize this, sorry. What regression do they solve?

thanks,

greg k-h

2009-01-27 15:19:51

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH 1/2] consolidate driver_probe_done() loops into one place

On Monday 26 January 2009, Greg KH wrote:
> On Mon, Jan 26, 2009 at 08:18:40PM +0100, Rafael J. Wysocki wrote:
> > On Monday 26 January 2009, Andrew Morton wrote:
> > > On Mon, 26 Jan 2009 17:48:05 +0100 "Rafael J. Wysocki" <[email protected]> wrote:
> > >
> > > > On Sunday 25 January 2009, Greg KH wrote:
> > > > > On Fri, Jan 09, 2009 at 09:13:46PM -0800, Arjan van de Ven wrote:
> > > > > > From 11b47973023398ecdb933c442bab120906946762 Mon Sep 17 00:00:00 2001
> > > > > > From: Arjan van de Ven <[email protected]>
> > > > > > Date: Fri, 9 Jan 2009 21:04:53 -0800
> > > > > > Subject: [PATCH] consolidate driver_probe_done() loops into one place
> > > > > >
> > > > > > there's a few places that currently loop over driver_probe_done(), and
> > > > > > I'm about to add another one. This patch abstracts it into a helper
> > > > > > to reduce duplication.
> > > > > >
> > > > > > Signed-off-by: Arjan van de Ven <[email protected]>
> > > > >
> > > > > Acked-by: Greg Kroah-Hartman <[email protected]>
> > > > >
> > > > > Do you need me to take this through my tree? Or is it going through the
> > > > > acpi tree?
> > > >
> > > > I've lost the track.
> > > >
> > > > Anyway, it's a part of a two-patch series and I think both are in -mm.
> > > >
> > > > Andrew, do you have them?
> > > >
> > >
> > > I have these:
> > >
> > > early-platform-drivers-v2.patch
> > > drivers-consolidate-driver_probe_done-loops-into-one-place.patch
> > > drivers-consolidate-driver_probe_done-loops-into-one-place-fix.patch
> > > drivers-consolidate-driver_probe_done-loops-into-one-place-checkpatch-fixes.patch
> > > resume-wait-for-device-probing-to-finish.patch
> > > sysfs-use-standard-magich-for-sysfs.patch
> > >
> > > queued up for sending into Greg for his "driver core" tree.
> >
> > Thanks!
> >
> > Greg, I assume you're going to get them from Andrew shortly. 2-4 definitely
> > are .29 material (they fix a regression), the others two I don't know.
>
> They are? I didn't realize this, sorry. What regression do they solve?

Resume from hibernation is broken after the async stuff from Arjan has been
merged. In fact this is due to a long-standing bug, but the async code has
just made it show up.

Thanks,
Rafael