public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] async: async device driver probing
@ 2014-02-08 11:05 falcon
  2014-02-08 18:27 ` Greg KH
  0 siblings, 1 reply; 7+ messages in thread
From: falcon @ 2014-02-08 11:05 UTC (permalink / raw)
  To: linux-kernel; +Cc: gregkh

From: Wu Zhangjin <wuzhangjin@gmail.com>

[*Note*: NOT applicable, only for comments.]

To async the slow driver probing function of some devices, the device probing
support is modified to support async scheduling.

In order to async your driver probing function, please mask the async_probe
flag to 1, and to make sure one asynced probing is executed before an specified
point, please call async_synchronize_full() in that point..

Usage:

	static struct i2c_driver test_driver = {
		.driver = {
			.name   = TEST_DEV_NAME,
			.owner  = THIS_MODULE,
	+               .async_probe = 1,
		},

Signed-off-by: Wu Zhangjin <falcon@meizu.com>
---
 drivers/base/dd.c      |   36 +++++++++++++++++++++++++++++++++---
 include/linux/device.h |    2 ++
 2 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index 0605176..357f36e 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -23,6 +23,7 @@
 #include <linux/kthread.h>
 #include <linux/wait.h>
 #include <linux/async.h>
+#include <linux/slab.h>
 #include <linux/pm_runtime.h>
 #include <linux/pinctrl/devinfo.h>
 
@@ -357,6 +358,11 @@ void wait_for_device_probe(void)
 }
 EXPORT_SYMBOL_GPL(wait_for_device_probe);
 
+struct stupid_thread_structure {
+	struct device_driver *drv;
+	struct device *dev;
+};
+
 /**
  * driver_probe_device - attempt to bind device & driver together
  * @drv: driver to bind a device to
@@ -368,8 +374,23 @@ EXPORT_SYMBOL_GPL(wait_for_device_probe);
  * This function must be called with @dev lock held.  When called for a
  * USB interface, @dev->parent lock must be held as well.
  */
+static void __driver_probe_device(void *void_data, async_cookie_t cookie)
+{
+	struct stupid_thread_structure *data = void_data;
+	struct device_driver *drv = data->drv;
+	struct device *dev = data->dev;
+
+	pm_runtime_barrier(dev);
+	really_probe(dev, drv);
+	pm_request_idle(dev);
+
+	kfree(data);
+}
+
 int driver_probe_device(struct device_driver *drv, struct device *dev)
 {
+	struct stupid_thread_structure *data;
+	async_cookie_t cookie;
 	int ret = 0;
 
 	if (!device_is_registered(dev))
@@ -378,9 +399,18 @@ int driver_probe_device(struct device_driver *drv, struct device *dev)
 	pr_debug("bus: '%s': %s: matched device %s with driver %s\n",
 		 drv->bus->name, __func__, dev_name(dev), drv->name);
 
-	pm_runtime_barrier(dev);
-	ret = really_probe(dev, drv);
-	pm_request_idle(dev);
+	if (drv->async_probe) {
+		data = kmalloc(sizeof(*data), GFP_KERNEL);
+		data->drv = drv;
+		data->dev = dev;
+
+		cookie = async_schedule(__driver_probe_device, data);
+		pr_info("%s: async call %s driver, cookie is %llu\n", __func__, drv->name, cookie);
+	} else {
+		pm_runtime_barrier(dev);
+		ret = really_probe(dev, drv);
+		pm_request_idle(dev);
+	}
 
 	return ret;
 }
diff --git a/include/linux/device.h b/include/linux/device.h
index 952b010..f39ee48 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -247,6 +247,8 @@ struct device_driver {
 	const struct dev_pm_ops *pm;
 
 	struct driver_private *p;
+
+	unsigned int async_probe:1;
 };
 
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/2] async: async device driver probing
  2014-02-08 11:05 falcon
@ 2014-02-08 18:27 ` Greg KH
  2014-08-13 17:20   ` Dmitry Torokhov
  0 siblings, 1 reply; 7+ messages in thread
From: Greg KH @ 2014-02-08 18:27 UTC (permalink / raw)
  To: falcon; +Cc: linux-kernel

On Sat, Feb 08, 2014 at 07:05:38PM +0800, falcon@meizu.com wrote:
> From: Wu Zhangjin <wuzhangjin@gmail.com>
> 
> [*Note*: NOT applicable, only for comments.]
> 
> To async the slow driver probing function of some devices, the device probing
> support is modified to support async scheduling.
> 
> In order to async your driver probing function, please mask the async_probe
> flag to 1, and to make sure one asynced probing is executed before an specified
> point, please call async_synchronize_full() in that point..
> 
> Usage:
> 
> 	static struct i2c_driver test_driver = {
> 		.driver = {
> 			.name   = TEST_DEV_NAME,
> 			.owner  = THIS_MODULE,
> 	+               .async_probe = 1,
> 		},

Why is this needed, we have defered probing and the container stuff, so
what problem is this solving?

greg k-h

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/2] async: async device driver probing
       [not found] <uovsqced4yboii55ncyjppla.1391933910239@email.android.com>
@ 2014-02-13 23:59 ` Greg KH
  0 siblings, 0 replies; 7+ messages in thread
From: Greg KH @ 2014-02-13 23:59 UTC (permalink / raw)
  To: 吴章金; +Cc: linux-kernel

On Sun, Feb 09, 2014 at 08:40:43AM +0000, 吴章金 wrote:
> Hi, Greg
> 
> These two patches aim to thread the initcalls(only probes here) for SMP
> systems. to simplify the upgrade of Linux for Android smartphones, the modules
> are built into the Linux kernel image, and hence the initcalls are called in
> serial order, to speedup the booting, benefit from SMP, thread these initcalls
> may parallel the probings.
> 
> and I rechecked the deferred probing, seems it solves the problem of getting
> devices initialized in the right order, the probing will be threaded only if
> the probe fails with the -EPROBE_DEFER. it doesn't provide any mechanism to
> thread a probe explicitly.

It's up to the bus to do threaded probing, but watch out, that is almost
never the bottleneck in your boot process (hint, in Android, booting the
kernel is almost not even in the range that can be measured overall).
There are so many other things that Android does at boot time that could
be worked on instead of worrying about this :)

good luck,

greg k-h

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/2] async: async device driver probing
  2014-02-08 18:27 ` Greg KH
@ 2014-08-13 17:20   ` Dmitry Torokhov
  2014-08-13 22:02     ` Greg KH
  0 siblings, 1 reply; 7+ messages in thread
From: Dmitry Torokhov @ 2014-08-13 17:20 UTC (permalink / raw)
  To: Greg KH; +Cc: falcon, linux-kernel

Hi Greg,

On Sat, Feb 08, 2014 at 10:27:29AM -0800, Greg KH wrote:
> On Sat, Feb 08, 2014 at 07:05:38PM +0800, falcon@meizu.com wrote:
> > From: Wu Zhangjin <wuzhangjin@gmail.com>
> > 
> > [*Note*: NOT applicable, only for comments.]
> > 
> > To async the slow driver probing function of some devices, the device probing
> > support is modified to support async scheduling.
> > 
> > In order to async your driver probing function, please mask the async_probe
> > flag to 1, and to make sure one asynced probing is executed before an specified
> > point, please call async_synchronize_full() in that point..
> > 
> > Usage:
> > 
> > 	static struct i2c_driver test_driver = {
> > 		.driver = {
> > 			.name   = TEST_DEV_NAME,
> > 			.owner  = THIS_MODULE,
> > 	+               .async_probe = 1,
> > 		},
> 
> Why is this needed, we have defered probing and the container stuff, so
> what problem is this solving?

Deferred probing only helps if resources are not ready yet, but
sometimes we have a slow(ish) device which initialization stalls probing
the rest of the system. For example a touchpad can take up to a second
to calibrate itself after reset. One could try scheduling reset
asynchronously, or try to offload it to open(), but that is not always
best:

1. Manual async: what to do when reset fails? Ideally we do not want to
leave driver half-way bound with device not operable, but much rather
signal the rest of the system that binding of the device failed and
release all resources.

2. Offload to open: the same issue as with manually doing async reset,
plus sometimes we do not know all parameters that we should create input
device with until after we reset physical device and queried it for
capabilities.

Marking a driver to tell device core to execute probe asynchronously [at
boot time] seems like a very appealing feature from driver author POV.

What is the container stuff you mention?

Thanks.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/2] async: async device driver probing
  2014-08-13 17:20   ` Dmitry Torokhov
@ 2014-08-13 22:02     ` Greg KH
  2014-08-13 22:10       ` Dmitry Torokhov
  0 siblings, 1 reply; 7+ messages in thread
From: Greg KH @ 2014-08-13 22:02 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: falcon, linux-kernel

On Wed, Aug 13, 2014 at 10:20:33AM -0700, Dmitry Torokhov wrote:
> Hi Greg,
> 
> On Sat, Feb 08, 2014 at 10:27:29AM -0800, Greg KH wrote:

February?  That's an old thread to dig up...


> > On Sat, Feb 08, 2014 at 07:05:38PM +0800, falcon@meizu.com wrote:
> > > From: Wu Zhangjin <wuzhangjin@gmail.com>
> > > 
> > > [*Note*: NOT applicable, only for comments.]
> > > 
> > > To async the slow driver probing function of some devices, the device probing
> > > support is modified to support async scheduling.
> > > 
> > > In order to async your driver probing function, please mask the async_probe
> > > flag to 1, and to make sure one asynced probing is executed before an specified
> > > point, please call async_synchronize_full() in that point..
> > > 
> > > Usage:
> > > 
> > > 	static struct i2c_driver test_driver = {
> > > 		.driver = {
> > > 			.name   = TEST_DEV_NAME,
> > > 			.owner  = THIS_MODULE,
> > > 	+               .async_probe = 1,
> > > 		},
> > 
> > Why is this needed, we have defered probing and the container stuff, so
> > what problem is this solving?
> 
> Deferred probing only helps if resources are not ready yet, but
> sometimes we have a slow(ish) device which initialization stalls probing
> the rest of the system. For example a touchpad can take up to a second
> to calibrate itself after reset. One could try scheduling reset
> asynchronously, or try to offload it to open(), but that is not always
> best:
> 
> 1. Manual async: what to do when reset fails? Ideally we do not want to
> leave driver half-way bound with device not operable, but much rather
> signal the rest of the system that binding of the device failed and
> release all resources.
> 
> 2. Offload to open: the same issue as with manually doing async reset,
> plus sometimes we do not know all parameters that we should create input
> device with until after we reset physical device and queried it for
> capabilities.
> 
> Marking a driver to tell device core to execute probe asynchronously [at
> boot time] seems like a very appealing feature from driver author POV.
> 
> What is the container stuff you mention?

drivers/base/container.c


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/2] async: async device driver probing
  2014-08-13 22:02     ` Greg KH
@ 2014-08-13 22:10       ` Dmitry Torokhov
  2014-08-14  4:18         ` Greg KH
  0 siblings, 1 reply; 7+ messages in thread
From: Dmitry Torokhov @ 2014-08-13 22:10 UTC (permalink / raw)
  To: Greg KH; +Cc: falcon, linux-kernel

On Thu, Aug 14, 2014 at 06:02:23AM +0800, Greg KH wrote:
> On Wed, Aug 13, 2014 at 10:20:33AM -0700, Dmitry Torokhov wrote:
> > Hi Greg,
> > 
> > On Sat, Feb 08, 2014 at 10:27:29AM -0800, Greg KH wrote:
> 
> February?  That's an old thread to dig up...

Well, yes ;)

> 
> 
> > > On Sat, Feb 08, 2014 at 07:05:38PM +0800, falcon@meizu.com wrote:
> > > > From: Wu Zhangjin <wuzhangjin@gmail.com>
> > > > 
> > > > [*Note*: NOT applicable, only for comments.]
> > > > 
> > > > To async the slow driver probing function of some devices, the device probing
> > > > support is modified to support async scheduling.
> > > > 
> > > > In order to async your driver probing function, please mask the async_probe
> > > > flag to 1, and to make sure one asynced probing is executed before an specified
> > > > point, please call async_synchronize_full() in that point..
> > > > 
> > > > Usage:
> > > > 
> > > > 	static struct i2c_driver test_driver = {
> > > > 		.driver = {
> > > > 			.name   = TEST_DEV_NAME,
> > > > 			.owner  = THIS_MODULE,
> > > > 	+               .async_probe = 1,
> > > > 		},
> > > 
> > > Why is this needed, we have defered probing and the container stuff, so
> > > what problem is this solving?
> > 
> > Deferred probing only helps if resources are not ready yet, but
> > sometimes we have a slow(ish) device which initialization stalls probing
> > the rest of the system. For example a touchpad can take up to a second
> > to calibrate itself after reset. One could try scheduling reset
> > asynchronously, or try to offload it to open(), but that is not always
> > best:
> > 
> > 1. Manual async: what to do when reset fails? Ideally we do not want to
> > leave driver half-way bound with device not operable, but much rather
> > signal the rest of the system that binding of the device failed and
> > release all resources.
> > 
> > 2. Offload to open: the same issue as with manually doing async reset,
> > plus sometimes we do not know all parameters that we should create input
> > device with until after we reset physical device and queried it for
> > capabilities.
> > 
> > Marking a driver to tell device core to execute probe asynchronously [at
> > boot time] seems like a very appealing feature from driver author POV.
> > 
> > What is the container stuff you mention?
> 
> drivers/base/container.c

I am not sure how that would help in the scenario described above, as it
seems ACPI specific...

Thanks.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/2] async: async device driver probing
  2014-08-13 22:10       ` Dmitry Torokhov
@ 2014-08-14  4:18         ` Greg KH
  0 siblings, 0 replies; 7+ messages in thread
From: Greg KH @ 2014-08-14  4:18 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: falcon, linux-kernel

On Wed, Aug 13, 2014 at 03:10:44PM -0700, Dmitry Torokhov wrote:
> On Thu, Aug 14, 2014 at 06:02:23AM +0800, Greg KH wrote:
> > On Wed, Aug 13, 2014 at 10:20:33AM -0700, Dmitry Torokhov wrote:
> > > Hi Greg,
> > > 
> > > On Sat, Feb 08, 2014 at 10:27:29AM -0800, Greg KH wrote:
> > 
> > February?  That's an old thread to dig up...
> 
> Well, yes ;)
> 
> > 
> > 
> > > > On Sat, Feb 08, 2014 at 07:05:38PM +0800, falcon@meizu.com wrote:
> > > > > From: Wu Zhangjin <wuzhangjin@gmail.com>
> > > > > 
> > > > > [*Note*: NOT applicable, only for comments.]
> > > > > 
> > > > > To async the slow driver probing function of some devices, the device probing
> > > > > support is modified to support async scheduling.
> > > > > 
> > > > > In order to async your driver probing function, please mask the async_probe
> > > > > flag to 1, and to make sure one asynced probing is executed before an specified
> > > > > point, please call async_synchronize_full() in that point..
> > > > > 
> > > > > Usage:
> > > > > 
> > > > > 	static struct i2c_driver test_driver = {
> > > > > 		.driver = {
> > > > > 			.name   = TEST_DEV_NAME,
> > > > > 			.owner  = THIS_MODULE,
> > > > > 	+               .async_probe = 1,
> > > > > 		},
> > > > 
> > > > Why is this needed, we have defered probing and the container stuff, so
> > > > what problem is this solving?
> > > 
> > > Deferred probing only helps if resources are not ready yet, but
> > > sometimes we have a slow(ish) device which initialization stalls probing
> > > the rest of the system. For example a touchpad can take up to a second
> > > to calibrate itself after reset. One could try scheduling reset
> > > asynchronously, or try to offload it to open(), but that is not always
> > > best:
> > > 
> > > 1. Manual async: what to do when reset fails? Ideally we do not want to
> > > leave driver half-way bound with device not operable, but much rather
> > > signal the rest of the system that binding of the device failed and
> > > release all resources.
> > > 
> > > 2. Offload to open: the same issue as with manually doing async reset,
> > > plus sometimes we do not know all parameters that we should create input
> > > device with until after we reset physical device and queried it for
> > > capabilities.
> > > 
> > > Marking a driver to tell device core to execute probe asynchronously [at
> > > boot time] seems like a very appealing feature from driver author POV.
> > > 
> > > What is the container stuff you mention?
> > 
> > drivers/base/container.c
> 
> I am not sure how that would help in the scenario described above, as it
> seems ACPI specific...

It is?  I thought the drm people were using it on ARM.  I really don't
know, sorry, don't have the chance to check it right now...

greg k-h

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2014-08-14  4:19 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <uovsqced4yboii55ncyjppla.1391933910239@email.android.com>
2014-02-13 23:59 ` [PATCH 1/2] async: async device driver probing Greg KH
2014-02-08 11:05 falcon
2014-02-08 18:27 ` Greg KH
2014-08-13 17:20   ` Dmitry Torokhov
2014-08-13 22:02     ` Greg KH
2014-08-13 22:10       ` Dmitry Torokhov
2014-08-14  4:18         ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox