From patchwork Mon Mar 5 18:29:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Feng Kan X-Patchwork-Id: 10259475 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 574FB60134 for ; Mon, 5 Mar 2018 18:30:10 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 456FA28824 for ; Mon, 5 Mar 2018 18:30:10 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3A1F428BBF; Mon, 5 Mar 2018 18:30:10 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id B277828824 for ; Mon, 5 Mar 2018 18:30:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To: References:List-Owner; bh=4namI98UsPb7PBicarxjmT2czcww5nIsb8ZxSkAffME=; b=uW3 L8Ji67h3LENEo+KZ6ahl6OXxov2rE+LZjkV/k8eslH33c04+SdrkiM3/KzFK/cW17OkzbCtvBZKqF l4o1KfRNp3eoCj0PwXRegozhM+UQo66Mbs/A/AI3yWXnEOK/Xgrjk0mcCDzSxbiHcMTUe5OG8rypf jyDt+IuLEsKOzqde7NASUgC2wSfSb9YRZsCDuDwGItDyOEOOpMVNnkx2+xef7SmQmY32HySJA/+Xi bLeoWB0EO6t41NScKf+KjvnYHcDxc4aaSBU8vQha9LZmA7tD1zXyPYTtk/KOxv3zii5hOYIazZEpF NqJpdVy0dbI3vpyuvcAewIzRemOYkMg==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.89 #1 (Red Hat Linux)) id 1esus3-0005yU-M8; Mon, 05 Mar 2018 18:29:59 +0000 Received: from mail-pl0-x22f.google.com ([2607:f8b0:400e:c01::22f]) by bombadil.infradead.org with esmtps (Exim 4.89 #1 (Red Hat Linux)) id 1esurz-0005eh-E8 for linux-arm-kernel@lists.infradead.org; Mon, 05 Mar 2018 18:29:57 +0000 Received: by mail-pl0-x22f.google.com with SMTP id ay8-v6so10158332plb.4 for ; Mon, 05 Mar 2018 10:29:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=apm.com; s=apm; h=from:to:cc:subject:date:message-id; bh=CXsgki8PaEPqhR4yH6FFhzROUlPjXxsfaE+UpZGGGG4=; b=Uky7DwoWOlluARJ0SbHBfL+E4Ytt5qhYvr+bRDLwG0n+zAsZOtc89C9Uwf1luXGNIn hYdQJZE7IgIusm4S2bSFLox06m62wi/8H/Waa7wsSsi+V/mmKMbxn7N97t5z9EcQRDcj 8YyV6T9Y9Mw7VZRrCOjtO/MfCYhPhEw5zoAXw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=CXsgki8PaEPqhR4yH6FFhzROUlPjXxsfaE+UpZGGGG4=; b=D0SjHRqPAUHohorE5wTIq4DeZK73Ry51cSu8rOQfzt84uIdzihpNFmxt3TuWZm3IaT 73sJNV2Z5IHC3RUWSkRv9qCXITCSaoaQmdTymlRQg4NJ5tk9ZWC9wq7hvjHlmrMPRkgx ecZapReLk76She3r79ovOmB3dE5cS2zvvRoWVh9fhsFfjtnLN2Fdqk4bw0Q/BRu3NXrm fEj4RkHY0sWrVH7tU7mIQJwbNnoGQWEaLEKCnIyLRnhdSCKxBy7vORYiHRFvdGUxymq5 0JUnFBeN9Lg5DQ7I7LXAzcUU+dwOowp7FAcf6AmT6jSKAhu7anfOkbB7hfPtdx7tXGBx qviQ== X-Gm-Message-State: APf1xPDH+GqTh6AC97RBGGGkd7sBy+lpE8Kjav5ML3wiNWnKlhdfvAd0 DasQRPKw+pVA/iW9SimHDaeCkA== X-Google-Smtp-Source: AG47ELtsZKEU7RD11hMDloYjhcA5BYvzqirmHq67/hWPbyM53hnagbZjpJs3CEdv1HUd9WX6TWVBLw== X-Received: by 2002:a17:902:8501:: with SMTP id bj1-v6mr14313271plb.110.1520274583935; Mon, 05 Mar 2018 10:29:43 -0800 (PST) Received: from goldengate.amcc.com ([206.80.4.98]) by smtp.gmail.com with ESMTPSA id o2sm21856271pgq.54.2018.03.05.10.29.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 05 Mar 2018 10:29:42 -0800 (PST) From: Feng Kan To: rjw@rjwysocki.net, linux-pm@vger.kernel.org, lorenzo.pieralisi@arm.com, linux-arm-kernel@lists.infradead.org, linux-pci@vger.kernel.org, bhelgaas@google.com, gregkh@linuxfoundation.org Subject: [PATCH V3] PM / core: fix deferred probe breaking suspend resume order Date: Mon, 5 Mar 2018 10:29:39 -0800 Message-Id: <1520274579-30492-1-git-send-email-fkan@apm.com> X-Mailer: git-send-email 2.7.4 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180305_102955_496317_72A78D16 X-CRM114-Status: GOOD ( 16.20 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Feng Kan , Toan Le MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP When bridge and its endpoint is enumerated the devices are added to the dpm list. Afterward, the bridge defers probe when IOMMU is not ready. This causes the bridge to be moved to the end of the dpm list when deferred probe kicks in. The order of the dpm list for bridge and endpoint is reversed. Add reordering code to move the bridge and its children and consumers to the end of the pm list so the order for suspend and resume is not altered. The code also move device and its children and consumers to the tail of device_kset list if it is registered. Signed-off-by: Feng Kan Signed-off-by: Toan Le --- V3: 1. additional code comment changes V2: 1. change patch title from "move device and its children..." 2. move define based on Bjorn's comment 3. rename function name and comment content drivers/base/base.h | 3 +++ drivers/base/core.c | 20 ++++++++++++++++++++ drivers/base/dd.c | 4 +--- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/drivers/base/base.h b/drivers/base/base.h index d800de6..a75c302 100644 --- a/drivers/base/base.h +++ b/drivers/base/base.h @@ -161,3 +161,6 @@ static inline void module_remove_driver(struct device_driver *drv) { } extern void device_links_no_driver(struct device *dev); extern bool device_links_busy(struct device *dev); extern void device_links_unbind_consumers(struct device *dev); + +/* device pm support */ +void device_pm_move_to_tail(struct device *dev); diff --git a/drivers/base/core.c b/drivers/base/core.c index 110230d..3b37906 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -148,6 +148,26 @@ static int device_reorder_to_tail(struct device *dev, void *not_used) } /** + * device_pm_move_to_tail - Move set of devices to the end of device lists + * @dev: current device pointer + * + * This is a device_reorder_to_tail() wrapper taking the requisite locks. + * + * It moves the device along with all of its children and all of its consumers + * to the ends of the device_kset and dpm_list, recursively. + */ +void device_pm_move_to_tail(struct device *dev) +{ + int idx; + + idx = device_links_read_lock(); + device_pm_lock(); + device_reorder_to_tail(dev, NULL); + device_pm_unlock(); + device_links_read_unlock(idx); +} + +/** * device_link_add - Create a link between two devices. * @consumer: Consumer end of the link. * @supplier: Supplier end of the link. diff --git a/drivers/base/dd.c b/drivers/base/dd.c index 2c964f5..96fab29 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -123,9 +123,7 @@ static void deferred_probe_work_func(struct work_struct *work) * the list is a good order for suspend but deferred * probe makes that very unsafe. */ - device_pm_lock(); - device_pm_move_last(dev); - device_pm_unlock(); + device_pm_move_to_tail(dev); dev_dbg(dev, "Retrying from deferred list\n"); if (initcall_debug && !initcalls_done)