Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp630004imm; Fri, 29 Jun 2018 03:54:42 -0700 (PDT) X-Google-Smtp-Source: ADUXVKJpyNX7fKjnHMUzLMlNFMtLlbcriHEjQw0ImS+G1XUtzeZSRv+G0HY8LLr+3N7McCOtZq6c X-Received: by 2002:a65:4081:: with SMTP id t1-v6mr12334355pgp.32.1530269682592; Fri, 29 Jun 2018 03:54:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530269682; cv=none; d=google.com; s=arc-20160816; b=C1CfnSDoKMTWWs44LqiwhI8zivdebTfY386Z4+XkXFyCIXkyN0NXlS3tJPAQkrrX+B VdoRJVcLY725cA3fckJKK3FT+RKiuXptzMHHjMqMWkVy3ePFmG30Ec6hwgiWHF3NL+PN dfFtHC0OlnaI0T5iPjxPaLsKja0nsVk2niR9yKZsZ71l5A4gDZtqHqya3r/dLO0Ru85P 1vWnthRQR2XrfjEzDbUb91M+bHAebdrZRKUGkXdOu34c+/yk0vBUH45F+3v9/WvykzK+ mra9agtiTTSS4q0QeqbR5oPpj50XehCVG0nT+VIUczvpLRPGkY8/FgYkQBvNiKtmgL1d CG0A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :arc-authentication-results; bh=DRgSfY7Lu0DBbiNKP6uBE9K3I71rDheXZNePoLOuypE=; b=IRQvg00tK64uBsn78WjnGPivGWY16iwbR9KE0ShERsBvfsxWdUd36bdahtuAUOatnJ SE0L0MUQNFgNi7Ml3xeBoNd0amGo3znSA0QDUheerhKSOXHd04V9ZaGOSXIWzcPpPnPM z0Iuwqw0G6DarMLZD5dQVVv44krX0ny+vfh6OveR6CVtsZEsqELTO9Zg2TlVaHyoZ93P 5jCxL7XO+/1TOdoDVL0CNnA7b3IXfhDFBz4C49aO1blrk0CmI4+3Pd61DjaThsWtoO3R 1ErAS4XLzkLNiBmI4Jiu8ydFCDf93nfCH6HVKILHCxeL+LkdRt1NC2d7XsP1Ezx3NEti eikg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g4-v6si8420012plm.181.2018.06.29.03.54.27; Fri, 29 Jun 2018 03:54:42 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752905AbeF2HCg (ORCPT + 99 others); Fri, 29 Jun 2018 03:02:36 -0400 Received: from mga07.intel.com ([134.134.136.100]:10384 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752328AbeF2HCf (ORCPT ); Fri, 29 Jun 2018 03:02:35 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 Jun 2018 00:02:34 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,285,1526367600"; d="scan'208";a="67310789" Received: from ning-debian.sh.intel.com ([10.239.16.9]) by fmsmga004.fm.intel.com with ESMTP; 29 Jun 2018 00:02:28 -0700 From: ning.a.zhang@intel.com To: gregkh@linuxfoundation.org, rafael.j.wysocki@intel.com, dmitry.torokhov@gmail.com, linux-kernel@vger.kernel.org Cc: mark.gross@intel.com, Zhang Ning Subject: [PATCH] driver core: support bus manage deferred probe Date: Fri, 29 Jun 2018 15:02:26 +0800 Message-Id: <20180629070226.24506-1-ning.a.zhang@intel.com> X-Mailer: git-send-email 2.17.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Zhang Ning deferred probe will be hanlded by deferred_probe_initcall, starts at late_initcall. this is too late to handle deferred probe, this will block kernel exec to userspace, make kernel initial time longer. if we know when required resources are ready for a list of devices, related deferred drivers can be probe earlier. add these kinds of drivers into logical list, eg, bus_type->deferred_probe_pending_list, then it can be easily handled by bus driver. with analysis above: add manage_deferred to struct bus_type add deferred_probe_pending_list to struct bus_type when manage_deferred is true, deferred probe will be manage by bus. Signed-off-by: Zhang Ning --- drivers/base/bus.c | 3 ++- drivers/base/dd.c | 24 +++++++++++++++++------- include/linux/device.h | 5 +++++ 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/drivers/base/bus.c b/drivers/base/bus.c index 8bfd27ec73d6..ca8eaf7565db 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c @@ -898,7 +898,8 @@ int bus_register(struct bus_type *bus) retval = bus_add_groups(bus, bus->bus_groups); if (retval) goto bus_groups_fail; - + if (bus->manage_deferred) + INIT_LIST_HEAD(&bus->deferred_probe_pending_list); pr_debug("bus: '%s': registered\n", bus->name); return 0; diff --git a/drivers/base/dd.c b/drivers/base/dd.c index 1435d7281c66..926e57f8dd2f 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -82,10 +82,8 @@ static void deferred_probe_debug(struct device *dev) dev_name(dev), duration); } -/* - * deferred_probe_work_func() - Retry probing devices in the active list. - */ -static void deferred_probe_work_func(struct work_struct *work) + +void process_deferred_probe(struct list_head *list) { struct device *dev; struct device_private *private; @@ -102,8 +100,8 @@ static void deferred_probe_work_func(struct work_struct *work) * from under our feet. */ mutex_lock(&deferred_probe_mutex); - while (!list_empty(&deferred_probe_active_list)) { - private = list_first_entry(&deferred_probe_active_list, + while (!list_empty(list)) { + private = list_first_entry(list, typeof(*dev->p), deferred_probe); dev = private->device; list_del_init(&private->deferred_probe); @@ -136,6 +134,15 @@ static void deferred_probe_work_func(struct work_struct *work) } mutex_unlock(&deferred_probe_mutex); } + +/* + * deferred_probe_work_func() - Retry probing devices in the active list. + */ +static void deferred_probe_work_func(struct work_struct *work) +{ + process_deferred_probe(&deferred_probe_active_list); +} + static DECLARE_WORK(deferred_probe_work, deferred_probe_work_func); static void driver_deferred_probe_add(struct device *dev) @@ -143,7 +150,10 @@ static void driver_deferred_probe_add(struct device *dev) mutex_lock(&deferred_probe_mutex); if (list_empty(&dev->p->deferred_probe)) { dev_dbg(dev, "Added to deferred list\n"); - list_add_tail(&dev->p->deferred_probe, &deferred_probe_pending_list); + if (dev->bus->manage_deferred) + list_add_tail(&dev->p->deferred_probe, &dev->bus->deferred_probe_pending_list); + else + list_add_tail(&dev->p->deferred_probe, &deferred_probe_pending_list); } mutex_unlock(&deferred_probe_mutex); } diff --git a/include/linux/device.h b/include/linux/device.h index 055a69dbcd18..2f70f3124d18 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -143,6 +143,9 @@ struct bus_type { struct lock_class_key lock_key; bool need_parent_lock; + + bool manage_deferred; + struct list_head deferred_probe_pending_list; }; extern int __must_check bus_register(struct bus_type *bus); @@ -151,6 +154,8 @@ extern void bus_unregister(struct bus_type *bus); extern int __must_check bus_rescan_devices(struct bus_type *bus); +extern void process_deferred_probe(struct list_head *list); + /* iterator helpers for buses */ struct subsys_dev_iter { struct klist_iter ki; -- 2.17.1