From patchwork Thu Mar 1 22:15:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Feng Kan X-Patchwork-Id: 10252689 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 039376037D for ; Thu, 1 Mar 2018 22:15:48 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E3CF428685 for ; Thu, 1 Mar 2018 22:15:47 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D478128688; Thu, 1 Mar 2018 22:15:47 +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 5A6C628685 for ; Thu, 1 Mar 2018 22:15:47 +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=OyjrIMupDY27899vOpg+K3o2KoM7PMD6pUfC6VZxKnA=; b=pM5 Kecc4LJwhBSCLGvaH/OeuioxpK70NvfEbf4tX/afFd+kSjgHmFwzwcCEEJv2bKFkio2F4PA75yh4m 01uvY18r0s8bId1dMN/MhTt86FN3C0r/vc70GiOclQG1CDqEhlK4bBjsBJaq4/aOmsVIKgkMVMvUh +aIi908mmTAONOCDa5MqHPu7dutL8mEIRpZzHQUhyayyHB0IsCIFWI+l9LH1b7g9SgtmVk4KH8D3x tt+P4xg1MzDrS3Aij10TQr0OmoGT4gH6XWn1xaKpD5V6sqC5tEmfMOKQDilV/2kWl88ZDrfA9kZD5 UeRNLMQGX6VokNIi9brqkxQ4vV/ksfQ==; 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 1erWUI-0002Wz-5f; Thu, 01 Mar 2018 22:15:42 +0000 Received: from mail-pf0-x22e.google.com ([2607:f8b0:400e:c00::22e]) by bombadil.infradead.org with esmtps (Exim 4.89 #1 (Red Hat Linux)) id 1erWUB-00026Q-J6 for linux-arm-kernel@lists.infradead.org; Thu, 01 Mar 2018 22:15:38 +0000 Received: by mail-pf0-x22e.google.com with SMTP id u5so3082597pfh.6 for ; Thu, 01 Mar 2018 14:15:24 -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=R4KtbEzLfjfOlJDSKEGXOg4uvXqWDrOZ8UuAkSt2tpo=; b=HXh2Uh1IOzfXpoGOc78bs3QK0i9x1+/OMrnexbT3UE/wxDwQtaiX4fjagffBED0rm4 i+16/LkS1KvFgkq52xg5biVe5XOFPLD6eUJFezpfPywwkCZXaP+MYCfc6Fv6EaH2XH2A 3rDYOtMNf/NKZeHhFMSUVXG+vmkz8z8z/VSxk= 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=R4KtbEzLfjfOlJDSKEGXOg4uvXqWDrOZ8UuAkSt2tpo=; b=qSxmEVcIUh8iHDeu1y0bs6fpUpYAc2LzPgfdF2lO1jlw9GRWgjYF33ASK4MHnKWJgc LjTh+3t392LLrM2Mmb4acmpz261LlaRdUv1tqh+ukVh6D1FygpHBq79r7Bwhu0wtORZ8 AbDnXPeNGf8DvYXDgTFrWRJZ7SjxrTna+nNYP9hcQbh1sd7L8FjVx9WVNjykY5oFirF9 wY29zJk4CAHE/fM3pmuWFK3Of2NYv9KnbIcQtbRk+vSsTgQkEGssMHFo2BZxAtLkuTfb 5N3DwFjrb8MPDNi9TsRFFNXkb2osavrOpOV5Q1DIqNqJfZkfUudOhWKwC6Ib38GiDUhW YtVQ== X-Gm-Message-State: APf1xPBjMr+yD5VjC2sCcmm7MmHAT9RSrdW9aIpv1dXv0nOJpf5JdEyc ZKpjJsuCkWXGQtI8MsUziQwr6A== X-Google-Smtp-Source: AG47ELuNugAlyZnra32KhshCaS+mudZlbq1xViG7UBUgqzQ9G/8evV4ijNBPf/CVkhEhlnMcflddXA== X-Received: by 10.101.90.75 with SMTP id z11mr2727915pgs.29.1519942523542; Thu, 01 Mar 2018 14:15:23 -0800 (PST) Received: from goldengate.amcc.com ([206.80.4.98]) by smtp.gmail.com with ESMTPSA id b8sm10189926pff.31.2018.03.01.14.15.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 01 Mar 2018 14:15:22 -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 Subject: [PATCH V2] PM / core: fix deferred probe breaking suspend resume order Date: Thu, 1 Mar 2018 14:15:14 -0800 Message-Id: <1519942514-3350-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-20180301_141535_803682_E46112D0 X-CRM114-Status: GOOD ( 19.33 ) 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 --- 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 | 22 ++++++++++++++++++++++ drivers/base/dd.c | 8 ++++---- 3 files changed, 29 insertions(+), 4 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..0a0756b 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -148,6 +148,28 @@ static int device_reorder_to_tail(struct device *dev, void *not_used) } /** + * device_pm_move_to_tail - move device and its children and consumers to end of + * pm and device kset list + * @dev: current device pointer + * + * This is a lock held version of the device_reorder_to_tail. Function checks + * if the device is registered and moves it to the end of device_kset list. Also + * if the device is pm initialized, move the device to the end of the pm list. + * Then the function iterate through the children and device link consumers to + * do the same for each found. + */ +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..7e9d1ef 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -121,11 +121,11 @@ static void deferred_probe_work_func(struct work_struct *work) * Force the device to the end of the dpm_list since * the PM code assumes that the order we add things to * the list is a good order for suspend but deferred - * probe makes that very unsafe. + * probe makes that very unsafe. Move any children and + * consumers belong to the device to the end of the list. + * This way the suspend resume order won't be corrupted. */ - 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)