![](https://secure.gravatar.com/avatar/59bffa8d29505a5951521a2fd09a4fd9.jpg?s=120&d=mm&r=g)
The issue is that the driver core is using drivers completing probe as a proxy for resources becoming available. That works most of the time because most probes are fully synchronous but it breaks down if a resource provider registers resources outside of probe, we might still be fine if system boot is still happening and something else probes but only through luck.
The driver core is not using that as a proxy, that is up to the driver itself or not. All probe means is "yes, this driver binds to this device, thank you!" for that specific bus/class type. That's all, if the driver needs to go off and do real work before it can properly control the device, wonderful, have it go and do that async.
Right, which is what is happening here - but the deferred probe machinery in the core is reading more into the probe succeeding than it should.
I think Greg was referring to the use of the PROBE_PREFER_ASYNCHRONOUS probe type. We tried just that and got a nice WARN_ON because we are using request_module() to deal with HDaudio codecs. The details are in [1] but the kernel code is unambiguous...
/* * We don't allow synchronous module loading from async. Module * init may invoke async_synchronize_full() which will end up * waiting for this task which already is waiting for the module * loading to complete, leading to a deadlock. */ WARN_ON_ONCE(wait && current_is_async());
The reason why we use a workqueue is because we are otherwise painted in a corner by conflicting requirements.
a) we have to use request_module() b) we cannot use the async probe because of the request_module() c) we have to avoid blocking on boot
I understand the resistance to exporting this function, no one in our team was really happy about it, but no one could find an alternate solution. If there is something better, I am all ears.
Thanks -Pierre