All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tomeu Vizoso <tomeu.vizoso@collabora.com>
To: linux-kernel@vger.kernel.org
Cc: Rob Herring <robh+dt@kernel.org>,
	Stephen Warren <swarren@wwwdotorg.org>,
	Javier Martinez Canillas <javier@osg.samsung.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Mark Brown <broonie@kernel.org>,
	Thierry Reding <thierry.reding@gmail.com>,
	Alan Stern <stern@rowland.harvard.edu>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>,
	linux-arm-kernel@lists.infradead.org,
	Dmitry Torokhov <dmitry.torokhov@gmail.com>,
	devicetree@vger.kernel.org,
	Russell King <rmk+kernel@arm.linux.org.uk>,
	Linus Walleij <linus.walleij@linaro.org>,
	Ulf Hansson <ulf.hansson@linaro.org>,
	linux-acpi@vger.kernel.org, Arnd Bergmann <arnd@arndb.de>,
	Tomeu Vizoso <tomeu.vizoso@collabora.com>
Subject: [PATCH v7 19/20] driver core: Allow deferring probes until late init
Date: Tue, 29 Sep 2015 11:10:57 +0200	[thread overview]
Message-ID: <1443517859-30376-20-git-send-email-tomeu.vizoso@collabora.com> (raw)
In-Reply-To: <1443517859-30376-1-git-send-email-tomeu.vizoso@collabora.com>

Add a field to struct device that instructs the device-driver core to
defer the probe of this device until the late_initcall level.

By letting all built-in drivers to register before starting to probe, we
can avoid any deferred probes by probing dependencies on demand.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>

---

Changes in v7:
- Move IS_ENABLED(CONFIG_DELAY_DEVICE_PROBES) into if condition
- Hide CONFIG_DELAY_DEVICE_PROBES behind EXPERT

Changes in v4:
- Add Kconfig DELAY_DEVICE_PROBES to allow disabling delayed probing in
  machines with initcalls that depend on devices probing at a given time.

 drivers/base/Kconfig   | 18 ++++++++++++++++++
 drivers/base/dd.c      |  6 ++++++
 include/linux/device.h |  2 ++
 3 files changed, 26 insertions(+)

diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig
index 98504ec99c7d..8bb7b556da1b 100644
--- a/drivers/base/Kconfig
+++ b/drivers/base/Kconfig
@@ -324,4 +324,22 @@ config CMA_ALIGNMENT
 
 endif
 
+config DELAY_DEVICE_PROBES
+	bool "Allow delaying the probe of some devices" if EXPERT
+	default y
+	help
+	  Devices can be matched to a driver and probed from the moment they
+	  are registered, but early during boot their probes are likely to be
+	  deferred because some dependency isn't available yet because most
+	  drivers haven't been registered yet.
+
+	  Enabling this option allows the device registration code to delay the
+	  probing of a specific device until device_initcall_sync, when all
+	  built-in drivers have been registered already.
+
+	  In some platforms there may be implicit assumptions about when some
+	  devices are probed, so enabling this option could cause problems there.
+
+	  If unsure, say Y here.
+
 endmenu
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index 7dc04ee81c8b..c4a3f298e726 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -417,6 +417,12 @@ int driver_probe_device(struct device_driver *drv, struct device *dev)
 	if (!device_is_registered(dev))
 		return -ENODEV;
 
+	if (IS_ENABLED(CONFIG_DELAY_DEVICE_PROBES) &&
+	    !driver_deferred_probe_enable && dev->probe_late) {
+		driver_deferred_probe_add(dev);
+		return 0;
+	}
+
 	pr_debug("bus: '%s': %s: matched device %s with driver %s\n",
 		 drv->bus->name, __func__, dev_name(dev), drv->name);
 
diff --git a/include/linux/device.h b/include/linux/device.h
index 8e7b806f0744..e64f4c7e243d 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -744,6 +744,7 @@ struct device_dma_parameters {
  *
  * @offline_disabled: If set, the device is permanently online.
  * @offline:	Set after successful invocation of bus type's .offline().
+ * @probe_late:	If set, device will be probed in the late initcall level.
  *
  * At the lowest level, every device in a Linux system is represented by an
  * instance of struct device. The device structure contains the information
@@ -828,6 +829,7 @@ struct device {
 
 	bool			offline_disabled:1;
 	bool			offline:1;
+	bool			probe_late:1;
 };
 
 static inline struct device *kobj_to_dev(struct kobject *kobj)
-- 
2.4.3


WARNING: multiple messages have this Message-ID (diff)
From: tomeu.vizoso@collabora.com (Tomeu Vizoso)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v7 19/20] driver core: Allow deferring probes until late init
Date: Tue, 29 Sep 2015 11:10:57 +0200	[thread overview]
Message-ID: <1443517859-30376-20-git-send-email-tomeu.vizoso@collabora.com> (raw)
In-Reply-To: <1443517859-30376-1-git-send-email-tomeu.vizoso@collabora.com>

Add a field to struct device that instructs the device-driver core to
defer the probe of this device until the late_initcall level.

By letting all built-in drivers to register before starting to probe, we
can avoid any deferred probes by probing dependencies on demand.

Signed-off-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>

---

Changes in v7:
- Move IS_ENABLED(CONFIG_DELAY_DEVICE_PROBES) into if condition
- Hide CONFIG_DELAY_DEVICE_PROBES behind EXPERT

Changes in v4:
- Add Kconfig DELAY_DEVICE_PROBES to allow disabling delayed probing in
  machines with initcalls that depend on devices probing at a given time.

 drivers/base/Kconfig   | 18 ++++++++++++++++++
 drivers/base/dd.c      |  6 ++++++
 include/linux/device.h |  2 ++
 3 files changed, 26 insertions(+)

diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig
index 98504ec99c7d..8bb7b556da1b 100644
--- a/drivers/base/Kconfig
+++ b/drivers/base/Kconfig
@@ -324,4 +324,22 @@ config CMA_ALIGNMENT
 
 endif
 
+config DELAY_DEVICE_PROBES
+	bool "Allow delaying the probe of some devices" if EXPERT
+	default y
+	help
+	  Devices can be matched to a driver and probed from the moment they
+	  are registered, but early during boot their probes are likely to be
+	  deferred because some dependency isn't available yet because most
+	  drivers haven't been registered yet.
+
+	  Enabling this option allows the device registration code to delay the
+	  probing of a specific device until device_initcall_sync, when all
+	  built-in drivers have been registered already.
+
+	  In some platforms there may be implicit assumptions about when some
+	  devices are probed, so enabling this option could cause problems there.
+
+	  If unsure, say Y here.
+
 endmenu
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index 7dc04ee81c8b..c4a3f298e726 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -417,6 +417,12 @@ int driver_probe_device(struct device_driver *drv, struct device *dev)
 	if (!device_is_registered(dev))
 		return -ENODEV;
 
+	if (IS_ENABLED(CONFIG_DELAY_DEVICE_PROBES) &&
+	    !driver_deferred_probe_enable && dev->probe_late) {
+		driver_deferred_probe_add(dev);
+		return 0;
+	}
+
 	pr_debug("bus: '%s': %s: matched device %s with driver %s\n",
 		 drv->bus->name, __func__, dev_name(dev), drv->name);
 
diff --git a/include/linux/device.h b/include/linux/device.h
index 8e7b806f0744..e64f4c7e243d 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -744,6 +744,7 @@ struct device_dma_parameters {
  *
  * @offline_disabled: If set, the device is permanently online.
  * @offline:	Set after successful invocation of bus type's .offline().
+ * @probe_late:	If set, device will be probed in the late initcall level.
  *
  * At the lowest level, every device in a Linux system is represented by an
  * instance of struct device. The device structure contains the information
@@ -828,6 +829,7 @@ struct device {
 
 	bool			offline_disabled:1;
 	bool			offline:1;
+	bool			probe_late:1;
 };
 
 static inline struct device *kobj_to_dev(struct kobject *kobj)
-- 
2.4.3

  parent reply	other threads:[~2015-09-29  9:12 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-29  9:10 [PATCH v7 0/20] On-demand device probing Tomeu Vizoso
2015-09-29  9:10 ` Tomeu Vizoso
2015-09-29  9:10 ` Tomeu Vizoso
2015-09-29  9:10 ` [PATCH v7 01/20] driver core: handle -EPROBE_DEFER from bus_type.match() Tomeu Vizoso
2015-09-29  9:10   ` Tomeu Vizoso
2015-10-17  6:51   ` Greg Kroah-Hartman
2015-10-17  6:51     ` Greg Kroah-Hartman
2015-09-29  9:10 ` [PATCH v7 02/20] ARM: amba: Move reading of periphid to amba_match() Tomeu Vizoso
2015-09-29  9:10   ` Tomeu Vizoso
2015-09-29  9:10 ` [PATCH v7 04/20] of: add function to allow probing a device from a OF node Tomeu Vizoso
2015-09-29  9:10   ` Tomeu Vizoso
2015-10-17  6:53   ` Greg Kroah-Hartman
2015-10-17  6:53     ` Greg Kroah-Hartman
2015-09-29  9:10 ` [PATCH v7 05/20] gpio: Probe GPIO drivers on demand Tomeu Vizoso
2015-09-29  9:10   ` Tomeu Vizoso
2015-09-29  9:10 ` [PATCH v7 06/20] pinctrl: Probe pinctrl devices " Tomeu Vizoso
2015-09-29  9:10   ` Tomeu Vizoso
2015-09-29  9:10 ` [PATCH v7 07/20] regulator: core: Probe regulators " Tomeu Vizoso
2015-09-29  9:10   ` Tomeu Vizoso
2015-09-29  9:10 ` [PATCH v7 09/20] drm/tegra: Probe dpaux devices " Tomeu Vizoso
2015-09-29  9:10   ` Tomeu Vizoso
2015-09-29  9:10 ` [PATCH v7 10/20] i2c: core: Probe i2c adapters and " Tomeu Vizoso
2015-09-29  9:10   ` Tomeu Vizoso
     [not found] ` <1443517859-30376-1-git-send-email-tomeu.vizoso-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org>
2015-09-29  9:10   ` [PATCH v7 03/20] of/platform: Point to struct device from device node Tomeu Vizoso
2015-09-29  9:10     ` Tomeu Vizoso
2015-09-29  9:10     ` Tomeu Vizoso
2015-09-29  9:10   ` [PATCH v7 08/20] drm: Probe panels on demand Tomeu Vizoso
2015-09-29  9:10     ` Tomeu Vizoso
2015-09-29  9:10     ` Tomeu Vizoso
2015-09-29  9:10   ` [PATCH v7 11/20] pwm: Probe PWM chip devices " Tomeu Vizoso
2015-09-29  9:10     ` Tomeu Vizoso
2015-09-29  9:10     ` Tomeu Vizoso
2015-09-29  9:10   ` [PATCH v7 17/20] dma: of: Probe DMA controllers " Tomeu Vizoso
2015-09-29  9:10     ` Tomeu Vizoso
2015-09-29  9:10     ` Tomeu Vizoso
2015-09-29  9:10 ` [PATCH v7 12/20] backlight: Probe backlight devices " Tomeu Vizoso
2015-09-29  9:10   ` Tomeu Vizoso
2015-09-29  9:10 ` [PATCH v7 13/20] usb: phy: Probe phy " Tomeu Vizoso
2015-09-29  9:10   ` Tomeu Vizoso
2015-10-17  6:55   ` Greg Kroah-Hartman
2015-10-17  6:55     ` Greg Kroah-Hartman
2015-09-29  9:10 ` [PATCH v7 14/20] clk: Probe clk providers " Tomeu Vizoso
2015-09-29  9:10   ` Tomeu Vizoso
2015-09-29  9:10 ` [PATCH v7 15/20] pinctrl: Probe pinctrl devices " Tomeu Vizoso
2015-09-29  9:10   ` Tomeu Vizoso
2015-09-29  9:10 ` [PATCH v7 16/20] phy: core: Probe phy providers " Tomeu Vizoso
2015-09-29  9:10   ` Tomeu Vizoso
2015-09-29  9:10 ` [PATCH v7 18/20] power-supply: Probe power supplies " Tomeu Vizoso
2015-09-29  9:10   ` Tomeu Vizoso
2015-09-29  9:10 ` Tomeu Vizoso [this message]
2015-09-29  9:10   ` [PATCH v7 19/20] driver core: Allow deferring probes until late init Tomeu Vizoso
     [not found]   ` <1443517859-30376-20-git-send-email-tomeu.vizoso-ZGY8ohtN/8qB+jHODAdFcQ@public.gmane.org>
2015-10-14 23:12     ` Frank Rowand
2015-10-14 23:12       ` Frank Rowand
2015-10-14 23:12       ` Frank Rowand
2015-09-29  9:10 ` [PATCH v7 20/20] of/platform: Defer probes of registered devices Tomeu Vizoso
2015-09-29  9:10   ` Tomeu Vizoso
2015-10-14 23:12   ` Frank Rowand
2015-10-14 23:12     ` Frank Rowand

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=1443517859-30376-20-git-send-email-tomeu.vizoso@collabora.com \
    --to=tomeu.vizoso@collabora.com \
    --cc=arnd@arndb.de \
    --cc=broonie@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=dmitry.torokhov@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=javier@osg.samsung.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rjw@rjwysocki.net \
    --cc=rmk+kernel@arm.linux.org.uk \
    --cc=robh+dt@kernel.org \
    --cc=stern@rowland.harvard.edu \
    --cc=swarren@wwwdotorg.org \
    --cc=thierry.reding@gmail.com \
    --cc=ulf.hansson@linaro.org \
    /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.