summaryrefslogtreecommitdiff
path: root/drivers/base
diff options
context:
space:
mode:
authorYogesh Lal <ylal@codeaurora.org>2021-03-24 14:01:38 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2021-03-28 15:55:39 +0300
commite611f8cd8717c8fe7d4229997e6cd029a1465253 (patch)
treebbe92db00c7cece75013c302e8e8cf33773cbf01 /drivers/base
parentecdc996baf291b903342cc704f4086a88c361967 (diff)
downloadlinux-e611f8cd8717c8fe7d4229997e6cd029a1465253.tar.xz
driver core: Use unbound workqueue for deferred probes
Deferred probe usually runs only on pinned kworkers, which might take longer time if a device contains multiple sub-devices. One such case is of sound card on mobile devices, where we have good number of mixers and controls per mixer. We observed boot up improvement - deferred probes take ~600ms when bound to little core kworker and ~200ms when deferred probe is queued on unbound wq. This is due to scheduler moving the worker running deferred probe work to big CPUs. Without this change, we see the worker is running on LITTLE CPU due to affinity. Since kworker runs deferred probe of several devices, the locality may not be important. Also, init thread executing driver initcalls, can potentially migrate as it has cpu affinity set to all cpus.In addition to this, async probes use unbounded workqueue. So, using unbounded wq for deferred probes looks to be similar to these w.r.t. scheduling behavior. Signed-off-by: Yogesh Lal <ylal@codeaurora.org> Link: https://lore.kernel.org/r/1616583698-6398-1-git-send-email-ylal@codeaurora.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/dd.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index a09bc09401f9..dd327cfd6843 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -184,7 +184,7 @@ static void driver_deferred_probe_trigger(void)
* Kick the re-probe thread. It may already be scheduled, but it is
* safe to kick it again.
*/
- schedule_work(&deferred_probe_work);
+ queue_work(system_unbound_wq, &deferred_probe_work);
}
/**