Re: [PATCH] drivercore: Add driver probe deferral mechanism

From: David Daney
Date: Mon Mar 05 2012 - 12:40:44 EST


On 03/05/2012 07:47 AM, Grant Likely wrote:
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.

v4: - Integrate Manjunath's addition of a separate workqueue
- Change -EAGAIN to -EPROBE_DEFER for drivers to trigger deferral
- Update comment blocks to reflect how the code really works
v3: - Hold off workqueue scheduling until late_initcall so that the bulk
of driver probes are complete before we start retrying deferred devices.
- Tested with simple use cases. Still needs more testing though.
Using it to get rid of the gpio early_initcall madness, or to replace
the ASoC internal probe deferral code would be ideal.
v2: - added locking so it should no longer be utterly broken in that regard
- remove device from deferred list at device_del time.
- Still completely untested with any real use case, but has been
boot tested.

Signed-off-by: Grant Likely<grant.likely@xxxxxxxxxxxx>

Hi Grant, thanks for working on this:

Acked-by: David Daney <david.daney@xxxxxxxxxx>

Cc: Greg Kroah-Hartman<greg@xxxxxxxxx>
Cc: Mark Brown<broonie@xxxxxxxxxxxxxxxxxxxxxxxxxxx>
Cc: Arnd Bergmann<arnd@xxxxxxxx>
Cc: Dilan Lee<dilee@xxxxxxxxxx>
Cc: Manjunath GKondaiah<manjunath.gkondaiah@xxxxxxxxxx>
Cc: Alan Stern<stern@xxxxxxxxxxxxxxxxxxx>
Cc: Tony Lindgren<tony@xxxxxxxxxxx>
---

Hi Greg,

This has been through several revisions now and I think it's ready to go
in. The summary from the last discussion is that users need to have the
dpm_list order adjusted if they defer themselves, but that is something
which just cannot be performed by the core code (It needs to be manipulated
mid-probe() call).

I know that not everybody is happy with this approach, but I've yet to
see a better alternative. However, it is *really easy* to find all the
users of deferred probe since any user must return -EPROBE_DEFER explicitly.
If/when a better approach is found, all the users will be easy to find
and modify.

If this patch is not merged, then I'm going to have to merge another round
of patches that futz with initcall ordering to get some drivers to probe
correctly. :-(

g.

drivers/base/base.h | 1 +
drivers/base/core.c | 2 +
drivers/base/dd.c | 138 +++++++++++++++++++++++++++++++++++++++++++++++-
include/linux/device.h | 5 ++
include/linux/errno.h | 1 +
5 files changed, 146 insertions(+), 1 deletions(-)


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/