Thread (85 messages) 85 messages, 10 authors, 2014-08-29

[RFC PATCH 5/9] dt: deps: register drivers based on the initialization order based on DT

From: Grant Likely <hidden>
Date: 2014-05-14 19:33:14
Also in: linux-devicetree, lkml

On Wed, May 14, 2014 at 3:58 PM, Alexander Holler [off-list ref] wrote:
Am 14.05.2014 16:13, schrieb Grant Likely:
quoted
On Mon, 12 May 2014 18:47:56 +0200, Alexander Holler
[off-list ref] wrote:
quoted
The init system currently calls unknown functions with almost unknown
functionality in an almost random order.

Correct, we've got a module system. Some would say that is a strength!
:-) That said, I don't object to optimizing to the optimal order when
possible.

Modules do work after init happened, that isn't what this feature is about.
Oops, I meant modular. I wasn't talking about modules either. The
driver model is designed to match devices with drivers regardless of
the order that either of them get registered to the system. I think
that is a strong aspect of the drivercore. What it doesn't have is any
way of optimizing the probe order, which is at the heart of your
proposal.
quoted
quoted
Fixing this is on a short-term basis is a bit tricky.

In order to register drivers with a deterministic order, a list of all
available in-kernel drivers is needed. Unfortunately such a list doesn't
exist, just a list of initcalls does exist.

The trick now is to first call special annotated initcalls (I call those
"well done") for platform drivers, but not actualy starting those drivers
by calling their probe function, but just collectiong their meta datas
(struct platform_driver). After all those informations were collected,
available the drivers will be started according to the previously
determined order.

Why does the initcall level matter? Why not just let the initcalls
happen, capture the calls that register a driver, and then use that list
later?

Some initcalls assume that stuff is present when they called probe or
register and do further action based on the rc code.
What I mean is that manipulating the initcall level isn't the best way
to handle it. We've got enough initcalls and there isn't a need to add
more. Other ways to handle the problem would be to either have a
variant of the platform_driver_register() that triggers your desired
behavour, or add a flag to the struct device_driver that tells the
driver core that it should try to resolve ordering. In both cases the
module_platform_driver() macro can do the magic bit. Other drivers
will have to do it manually.

g.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help