From: Greg KH <greg@kroah.com>
To: "G, Manjunath Kondaiah" <manjugk@ti.com>
Cc: linux-arm-kernel@lists.infradead.org,
Grant Likely <grant.likely@secretlab.ca>,
linux-omap@vger.kernel.org, linux-mmc@vger.kernel.org,
linux-kernel@vger.kernel.org, Dilan Lee <dilee@nvidia.com>,
Mark Brown <broonie@opensource.wolfsonmicro.com>,
Manjunath GKondaiah <manjunath.gkondaiah@linaro.org>,
Arnd Bergmann <arnd@arndb.de>
Subject: Re: [PATCH 2/5] drivercore: Add driver probe deferral mechanism
Date: Thu, 6 Oct 2011 23:49:28 -0700 [thread overview]
Message-ID: <20111007064928.GE27508@kroah.com> (raw)
In-Reply-To: <1317963790-29426-3-git-send-email-manjugk@ti.com>
On Fri, Oct 07, 2011 at 10:33:07AM +0500, G, Manjunath Kondaiah wrote:
>
> From: Grant Likely <grant.likely@secretlab.ca>
>
> Allow drivers to report at probe time that they cannot get all the
> resources required by the device, and should be retried at a
> later time.
>
> This should completely solve the problem of getting devices
> initialized in the right order. Right now this is mostly handled by
> mucking about with initcall ordering which is a complete hack, and
> doesn't even remotely handle the case where device drivers are in
> modules. This approach completely sidesteps the issues by allowing
> driver registration to occur in any order, and any driver can request
> to be retried after a few more other drivers get probed.
>
> Original patch posted by Grant Likely <grant.likely@secretlab.ca> at:
> http://lwn.net/Articles/460522/
>
> Enhancements to original patch by G, Manjunath Kondaiah <manjugk@ti.com>
> - checkpatch warning fixes
> - added Kconfig symbol CONFIG_PROBE_DEFER
> - replacing normal workqueue with singlethread_workqueue
> - handling -EPROBE_DEFER error
>
> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
> Signed-off-by: G, Manjunath Kondaiah <manjugk@ti.com>
> ---
> Cc: linux-omap@vger.kernel.org
> Cc: linux-mmc@vger.kernel.org
> Cc: linux-kernel@vger.kernel.org
> Cc: Grant Likely <grant.likely@secretlab.ca>
> Cc: Greg Kroah-Hartman <greg@kroah.com>
> Cc: Dilan Lee <dilee@nvidia.com>
> Cc: Mark Brown <broonie@opensource.wolfsonmicro.com>
> Cc: Manjunath GKondaiah <manjunath.gkondaiah@linaro.org>
> Cc: Arnd Bergmann <arnd@arndb.de>
>
> drivers/base/Kconfig | 11 ++++
> drivers/base/base.h | 3 +
> drivers/base/core.c | 6 ++
> drivers/base/dd.c | 145 ++++++++++++++++++++++++++++++++++++++++++++++++
> include/linux/device.h | 7 ++
> 5 files changed, 172 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig
> index 21cf46f..b412a71 100644
> --- a/drivers/base/Kconfig
> +++ b/drivers/base/Kconfig
> @@ -172,6 +172,17 @@ config SYS_HYPERVISOR
> bool
> default n
>
> +config PROBE_DEFER
> + bool "Deferred Driver Probe"
> + default y
> + help
> + This option provides deferring driver probe if it has dependency on
> + other driver. Without this feature, initcall ordering should be done
> + manually to resolve driver dependencies. This feature completely side
> + steps the issues by allowing driver registration to occur in any
> + order, and any driver can request to be retried after a few more other
> + drivers get probed.
Why is this even an option? Why would you ever want it disabled? Why
does it need to be selected?
If you are going to default something to 'y' then just make it so it
can't be turned off any other way by just not making it an option at
all.
It also cleans up this diff a lot, as you really don't want #ifdef in .c
files.
> --- a/drivers/base/dd.c
> +++ b/drivers/base/dd.c
> @@ -28,6 +28,136 @@
> #include "base.h"
> #include "power/power.h"
>
> +#if defined CONFIG_PROBE_DEFER
> +/*
> + * Deferred Probe infrastructure.
Why not use kerneldoc?
> + *
> + * Sometimes driver probe order matters, but the kernel doesn't always have
> + * dependency information which means some drivers will get probed before a
> + * resource it depends on is available. For example, an SDHCI driver may
> + * first need a GPIO line from an i2c GPIO controller before it can be
> + * initialized. If a required resource is not available yet, a driver can
> + * request probing to be deferred by returning -EPROBE_DEFER from its probe hook
> + *
> + * Deferred probe maintains two lists of devices, a pending list and an active
> + * list. A driver returning -EPROBE_DEFER causes the device to be added to the
> + * pending list.
> + *
> + * The deferred_probe_mutex *must* be held any time the deferred_probe_*_list
> + * of the (struct device*)->deferred_probe pointers are manipulated
> + */
> +static DEFINE_MUTEX(deferred_probe_mutex);
> +static LIST_HEAD(deferred_probe_pending_list);
> +static LIST_HEAD(deferred_probe_active_list);
> +static struct workqueue_struct *deferred_wq;
> +
> +/**
> + * deferred_probe_work_func() - Retry probing devices in the active list.
> + */
> +static void deferred_probe_work_func(struct work_struct *work)
> +{
> + struct device *dev;
> + /*
Extra blank line please.
> + * This bit is tricky. We want to process every device in the
> + * deferred list, but devices can be removed from the list at any
> + * time while inside this for-each loop. There are two things that
> + * need to be protected against:
That's what the klist structure is supposed to make easier, why not use
that here?
> + * - if the device is removed from the deferred_probe_list, then we
> + * loose our place in the loop. Since any device can be removed
> + * asynchronously, list_for_each_entry_safe() wouldn't make things
> + * much better. Simplest solution is to restart walking the list
> + * whenever the current device gets removed. Not the most efficient,
> + * but is simple to implement and easy to audit for correctness.
> + * - if the device is unregistered, and freed, then there is a risk
> + * of a null pointer dereference. This code uses get/put_device()
> + * to ensure the device cannot disappear from under our feet.
Ick, use a klist, it was created to handle this exact problem in the
driver core, so to not use it would be wrong, right?
> + */
> + mutex_lock(&deferred_probe_mutex);
> + while (!list_empty(&deferred_probe_active_list)) {
> + dev = list_first_entry(&deferred_probe_active_list,
> + typeof(*dev), deferred_probe);
> + list_del_init(&dev->deferred_probe);
> +
> + get_device(dev);
> +
> + /* Drop the mutex while probing each device; the probe path
> + * may manipulate the deferred list */
Use proper kernel multi-line comment format. This needs to be done in a
number of places in this patch, please fix them all.
thanks,
greg k-h
next prev parent reply other threads:[~2011-10-07 6:51 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-07 5:33 [PATCH 0/5] Driver Probe Deferral Mechanism G, Manjunath Kondaiah
2011-10-07 5:33 ` [PATCH 1/5] drivercore: add new error value for deferred probe G, Manjunath Kondaiah
2011-10-07 6:43 ` Greg KH
2011-10-07 10:00 ` Mark Brown
2011-10-07 22:12 ` Grant Likely
2011-10-07 23:28 ` Valdis.Kletnieks
2011-10-08 0:12 ` Greg KH
2011-10-09 22:59 ` Grant Likely
2011-10-10 1:06 ` Greg KH
2011-10-12 6:18 ` G, Manjunath Kondaiah
2011-10-13 4:10 ` Grant Likely
2011-10-07 5:33 ` [PATCH 2/5] drivercore: Add driver probe deferral mechanism G, Manjunath Kondaiah
2011-10-07 6:49 ` Greg KH [this message]
2011-10-07 20:57 ` Josh Triplett
2011-10-07 21:23 ` Greg KH
2011-10-08 4:03 ` Josh Triplett
2011-10-08 15:55 ` Greg KH
2011-10-08 18:18 ` Josh Triplett
2011-10-10 17:37 ` Andrei Warkentin
2011-10-11 12:29 ` Ming Lei
2011-10-13 4:09 ` Grant Likely
2011-10-13 14:18 ` Ming Lei
2011-10-13 14:31 ` Alan Stern
2011-10-13 15:21 ` Ming Lei
2011-10-13 16:04 ` Alan Stern
2011-10-14 0:13 ` Ming Lei
2011-10-13 17:15 ` Grant Likely
2011-10-13 18:16 ` Alan Stern
2011-10-13 18:28 ` Grant Likely
2011-10-14 15:39 ` Alan Stern
2011-10-14 16:17 ` Grant Likely
2011-10-14 16:33 ` Alan Stern
2011-10-14 17:20 ` Grant Likely
2011-10-14 17:33 ` Alan Stern
2011-10-14 18:25 ` Grant Likely
2011-10-14 18:39 ` Alan Stern
2011-10-14 19:07 ` Grant Likely
2011-10-14 18:56 ` David Daney
2011-10-14 19:03 ` Grant Likely
2011-10-14 19:09 ` David Daney
2011-10-14 15:37 ` Alan Stern
2011-10-12 7:04 ` G, Manjunath Kondaiah
2011-10-07 21:28 ` Grant Likely
2011-10-07 5:33 ` [PATCH 3/5] regulator: Support driver probe deferral G, Manjunath Kondaiah
2011-10-07 5:33 ` [PATCH 4/5] gpiolib: handle deferral probe error G, Manjunath Kondaiah
2011-10-07 10:06 ` Alan Cox
2011-10-07 22:09 ` Grant Likely
2011-10-12 6:14 ` G, Manjunath Kondaiah
2011-10-13 4:12 ` Grant Likely
2011-10-07 5:33 ` [PATCH 5/5] omap: hsmmc: use platform_driver_register G, Manjunath Kondaiah
2011-10-07 6:50 ` [PATCH 0/5] Driver Probe Deferral Mechanism Greg KH
2011-10-07 7:37 ` G, Manjunath Kondaiah
-- strict thread matches above, loose matches on Subject: below --
2011-10-07 5:05 G, Manjunath Kondaiah
2011-10-07 5:05 ` [PATCH 2/5] drivercore: Add driver probe deferral mechanism G, Manjunath Kondaiah
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=20111007064928.GE27508@kroah.com \
--to=greg@kroah.com \
--cc=arnd@arndb.de \
--cc=broonie@opensource.wolfsonmicro.com \
--cc=dilee@nvidia.com \
--cc=grant.likely@secretlab.ca \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mmc@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=manjugk@ti.com \
--cc=manjunath.gkondaiah@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox