Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp275465imm; Wed, 30 May 2018 23:32:47 -0700 (PDT) X-Google-Smtp-Source: ADUXVKJ8l8ZaoIboyq9n0CRpcdPzOhXTWMoSKs0Dxdic6dZqy6joo6taD4hpPvtDzjeTfyZ741Fp X-Received: by 2002:a17:902:981:: with SMTP id 1-v6mr5776712pln.11.1527748367297; Wed, 30 May 2018 23:32:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527748367; cv=none; d=google.com; s=arc-20160816; b=yMudk/K0lj9CTq1fZb5JQOuP7rBALRXegBMVn81nge2qPm+zh90mBPnxyl5PrClEaN s+p8OCaDUFcUH4ov0CwHVGHCXGTteQ/eTFBVtpe+b8YohiLyC8/UsZaHJR95lWbCBhGe i11wNfeDsV/zJIyQ0lK5aXZAcxlYrdYUlhn6vwR6N5dOx8jxNMhvjJXeCOAa3jTUCB8m wafDKBheyr0IAA+zRcblcx+a4RkwTOP9vHDAh1rUTsJ5TDDYwT1QYTuZSyd5wwwWdTZT m0EFwBDLoeYUuavhvN6HJvzYBsPRPsdcg20IUu0y4S8L1j9fn7kwwlouJb0b9T9IIWZp qdCg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature:arc-authentication-results; bh=eF/VZ/egqbcyT7J6Qpbs+wRCCgRckfFrbhhyL98yE1A=; b=02KsbsWW+3y0PB1xdGBPm9df8PRFg90Yx3EMEBAmd3a6vrh+YAXd+q+gkdrp8B9Tau XaIdJ1px21ZpIyi7PEPJys+Q9WkFIyBWLfL54Jacyhts5OP68oJJ/3fne0LR2Dxrt5sU o2ej1mmwfMLbrZaio9paJvJrgXysxEKHtIjia4te5mJwP04o5VQ9RHkjjEnGOjCH4Sci 9oL3yHl+KDWUdzAfk+SlYFekuhRgSpJWOdvmKctfKsC5eZ0EC1Ohv3BRu6kO2Kqpt97/ ZoVxkiRzMg4TMgww+ctuMhPBRG7E0MBIYVX6m8QC5gdIlH9oyZfNvOF9KidmFsk4i83+ 4keA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=i/zz/ETt; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y17-v6si20448688plp.485.2018.05.30.23.32.32; Wed, 30 May 2018 23:32:47 -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; dkim=pass header.i=@kernel.org header.s=default header.b=i/zz/ETt; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753958AbeEaGbn (ORCPT + 99 others); Thu, 31 May 2018 02:31:43 -0400 Received: from mail.kernel.org ([198.145.29.99]:55884 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753740AbeEaGbl (ORCPT ); Thu, 31 May 2018 02:31:41 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id F04F32087D; Thu, 31 May 2018 06:31:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1527748300; bh=ptPgU00o7rLzpZXnyTFSITAm6+oOS+VPhrr4xMuLLQ0=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=i/zz/ETtjd8Kn5nFdGyspoZ/YKvIo6eKszdjjsGgrUirSsHodw/KgptqmluCMfU2f jS4kOqswM+Hun8skBHGo88qSNavJXQca6DlZJ4GjwPV11nBzDgYhbny2pEJc1aorlv vurQ7fSa1PRFEVLXvPdFo5Z8p5z+I8515mDVWLa8= Date: Thu, 31 May 2018 08:31:18 +0200 From: Greg KH To: Alan Stern Cc: Martin Liu , heikki.krogerus@linux.intel.com, johan@kernel.org, andy.shevchenko@gmail.com, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, jenhaochen@google.com Subject: Re: [PATCH v4] driver core: hold dev's parent lock when needed Message-ID: <20180531063118.GA7554@kroah.com> References: <20180530163135.50081-1-liumartin@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.10.0 (2018-05-17) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, May 30, 2018 at 01:21:02PM -0400, Alan Stern wrote: > On Thu, 31 May 2018, Martin Liu wrote: > > > SoC have internal I/O buses that can't be proved for devices. The > > devices on the buses can be accessed directly without additinal > > configuration required. This type of bus is represented as > > "simple-bus". In some platforms, we name "soc" with "simple-bus" > > attribute and many devices are hooked under it described in DT > > (device tree). > > > > In commit bf74ad5bc417 ("Hold the device's parent's lock during > > probe and remove") to solve USB subsystem lock sequence since > > USB device's characteristic. Thus "soc" needs to be locked > > whenever a device and driver's probing happen under "soc" bus. > > During this period, an async driver tries to probe a device which > > is under the "soc" bus would be blocked until previous driver > > finish the probing and release "soc" lock. And the next probing > > under the "soc" bus need to wait for async finish. Because of > > that, driver's async probe for init time improvement will be > > shadowed. > > > > Since many devices don't have USB devices' characteristic, they > > actually don't need parent's lock. Thus, we introduce a lock flag > > in bus_type struct and driver core would lock the parent lock base > > on the flag. For USB, we set this flag in usb_bus_type to keep > > original lock behavior in driver core. > > > > Async probe could have more benefit after this patch. > > > > Signed-off-by: Martin Liu > > --- > > Changes in v4: > > -fix comment and wording. > > -follow the suggestion. > > > > [v3]: https://lkml.org/lkml/2018/5/29/876 > > [v2]: https://lkml.org/lkml/2018/5/29/108 > > [v1]: https://lkml.org/lkml/2018/5/22/545 > > > > drivers/base/bus.c | 16 ++++++++-------- > > drivers/base/dd.c | 8 ++++---- > > drivers/usb/core/driver.c | 1 + > > include/linux/device.h | 3 +++ > > 4 files changed, 16 insertions(+), 12 deletions(-) > > > > diff --git a/drivers/base/bus.c b/drivers/base/bus.c > > index ef6183306b40..8bfd27ec73d6 100644 > > --- a/drivers/base/bus.c > > +++ b/drivers/base/bus.c > > @@ -184,10 +184,10 @@ static ssize_t unbind_store(struct device_driver *drv, const char *buf, > > > > dev = bus_find_device_by_name(bus, NULL, buf); > > if (dev && dev->driver == drv) { > > - if (dev->parent) /* Needed for USB */ > > + if (dev->parent && dev->bus->need_parent_lock) > > device_lock(dev->parent); > > device_release_driver(dev); > > - if (dev->parent) > > + if (dev->parent && dev->bus->need_parent_lock) > > device_unlock(dev->parent); > > err = count; > > } > > @@ -211,12 +211,12 @@ static ssize_t bind_store(struct device_driver *drv, const char *buf, > > > > dev = bus_find_device_by_name(bus, NULL, buf); > > if (dev && dev->driver == NULL && driver_match_device(drv, dev)) { > > - if (dev->parent) /* Needed for USB */ > > + if (dev->parent && bus->need_parent_lock) > > device_lock(dev->parent); > > device_lock(dev); > > err = driver_probe_device(drv, dev); > > device_unlock(dev); > > - if (dev->parent) > > + if (dev->parent && bus->need_parent_lock) > > device_unlock(dev->parent); > > > > if (err > 0) { > > @@ -735,10 +735,10 @@ static int __must_check bus_rescan_devices_helper(struct device *dev, > > int ret = 0; > > > > if (!dev->driver) { > > - if (dev->parent) /* Needed for USB */ > > + if (dev->parent && dev->bus->need_parent_lock) > > device_lock(dev->parent); > > ret = device_attach(dev); > > - if (dev->parent) > > + if (dev->parent && dev->bus->need_parent_lock) > > device_unlock(dev->parent); > > } > > return ret < 0 ? ret : 0; > > @@ -770,10 +770,10 @@ EXPORT_SYMBOL_GPL(bus_rescan_devices); > > int device_reprobe(struct device *dev) > > { > > if (dev->driver) { > > - if (dev->parent) /* Needed for USB */ > > + if (dev->parent && dev->bus->need_parent_lock) > > device_lock(dev->parent); > > device_release_driver(dev); > > - if (dev->parent) > > + if (dev->parent && dev->bus->need_parent_lock) > > device_unlock(dev->parent); > > } > > return bus_rescan_devices_helper(dev, NULL); > > diff --git a/drivers/base/dd.c b/drivers/base/dd.c > > index c9f54089429b..7c09f73b96f3 100644 > > --- a/drivers/base/dd.c > > +++ b/drivers/base/dd.c > > @@ -817,13 +817,13 @@ static int __driver_attach(struct device *dev, void *data) > > return ret; > > } /* ret > 0 means positive match */ > > > > - if (dev->parent) /* Needed for USB */ > > + if (dev->parent && dev->bus->need_parent_lock) > > device_lock(dev->parent); > > device_lock(dev); > > if (!dev->driver) > > driver_probe_device(drv, dev); > > device_unlock(dev); > > - if (dev->parent) > > + if (dev->parent && dev->bus->need_parent_lock) > > device_unlock(dev->parent); > > > > return 0; > > @@ -919,7 +919,7 @@ void device_release_driver_internal(struct device *dev, > > struct device_driver *drv, > > struct device *parent) > > { > > - if (parent) > > + if (parent && dev->bus->need_parent_lock) > > device_lock(parent); > > > > device_lock(dev); > > @@ -927,7 +927,7 @@ void device_release_driver_internal(struct device *dev, > > __device_release_driver(dev, parent); > > > > device_unlock(dev); > > - if (parent) > > + if (parent && dev->bus->need_parent_lock) > > device_unlock(parent); > > } > > > > diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c > > index 9792cedfc351..e76e95f62f76 100644 > > --- a/drivers/usb/core/driver.c > > +++ b/drivers/usb/core/driver.c > > @@ -1922,4 +1922,5 @@ struct bus_type usb_bus_type = { > > .name = "usb", > > .match = usb_device_match, > > .uevent = usb_uevent, > > + .need_parent_lock = true, > > }; > > diff --git a/include/linux/device.h b/include/linux/device.h > > index 477956990f5e..beca424395dd 100644 > > --- a/include/linux/device.h > > +++ b/include/linux/device.h > > @@ -98,6 +98,8 @@ extern void bus_remove_file(struct bus_type *, struct bus_attribute *); > > * @lock_key: Lock class key for use by the lock validator > > * @force_dma: Assume devices on this bus should be set up by dma_configure() > > * even if DMA capability is not explicitly described by firmware. > > + * @need_parent_lock: When probing or removing a device on this bus, the > > + * device core should lock the device's parent. > > * > > * A bus is a channel between the processor and one or more devices. For the > > * purposes of the device model, all devices are connected via a bus, even if > > @@ -138,6 +140,7 @@ struct bus_type { > > struct lock_class_key lock_key; > > > > bool force_dma; > > + bool need_parent_lock; > > }; > > > > extern int __must_check bus_register(struct bus_type *bus); > > This looks okay to me. > > Acked-by: Alan Stern > > Greg, any more comments? Looks sane to me. Martin, thanks for all of the changes. greg k-h