Received: by 10.192.165.148 with SMTP id m20csp4825392imm; Tue, 8 May 2018 15:19:40 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpbLY9IBIAJIFSaMpELByXOH4Zy3jqEth68vgwBSXTm3jEq5aXk4LsW+wV/UsPshfr60JWz X-Received: by 2002:a63:7d43:: with SMTP id m3-v6mr27735127pgn.117.1525817980810; Tue, 08 May 2018 15:19:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525817980; cv=none; d=google.com; s=arc-20160816; b=hLkpTT7++szkrFN4HVCGoEO+vN3fe2PYuc4z3yySqGK9r6Of2kL9jd8e3acHi9TV0X BtjfeRE3AE19c5wJJ383nD3knnf82ilRejR6wY3a5d6R1LXgDXW1d9e5b5MhTOpKN15x m0vUhnFo0FQB522eMpsZ1qfUDIgjhkee2cR8rtfGeLf0Tbaa/Lnfpi2QumFfkIqBCiBE ZB4KhoRtpnqXbBNwA1ph6WzD1DZeIB8MDdOiQd4ipYwRZ1M5APGQgzu0c1NmPmySbgQu cKnoXrTeXAOZvapV5GSvh0MmcmREaLxJEJ0th0jrNr5KIVUCx0aLsioSPahJt4Lviu+g WoHg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=LEKYlkjin6Qyy+m4vzRjaj/sIhaV0zpkLKxJvh3Ty74=; b=V9lz1i4OeRnXAgJRkaBwzCRRB+XBn77ojQ5Xf/DvJloRT2sAgQjhq3w2o7zCRtk8P5 azswdDToxdUMhS595FIPK/nl2cd3GA23XhjvlkEyAbm0tiY7qxyC+LS1qU/R+iKuvD6E v5ffEdswB3MJhXDb7T0dlhrh0DzNNmg+IoYz1uSYUAbJ1eA/R8faX5z3sANzgXHhG4O2 gk2CnKgCiG2bcdJrViy6t+k+Jh/vzj7m+l/Ki0sjkhAc4JP8O2WQLdfYAZVpcoy3UHJk Bj55dmp7Orj6dBcemYNr9+5ZpN5ALocOfb8HF5su6vi6GPrHpyJ4TIUk9foKPg35FgMf pp1g== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g14-v6si20753341pgu.363.2018.05.08.15.19.26; Tue, 08 May 2018 15:19:40 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756194AbeEHWTA (ORCPT + 99 others); Tue, 8 May 2018 18:19:00 -0400 Received: from cloudserver094114.home.pl ([79.96.170.134]:55917 "EHLO cloudserver094114.home.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756174AbeEHWS5 (ORCPT ); Tue, 8 May 2018 18:18:57 -0400 Received: from 79.184.255.167.ipv4.supernova.orange.pl (79.184.255.167) (HELO aspire.rjw.lan) by serwer1319399.home.pl (79.96.170.134) with SMTP (IdeaSmtpServer 0.83) id a90318c26bfa7b10; Wed, 9 May 2018 00:18:55 +0200 From: "Rafael J. Wysocki" To: Joseph Salisbury , bhelgaas@google.com Cc: linux-acpi@vger.kernel.org, linux-pci@vger.kernel.org, "linux-kernel@vger.kernel.org" , 1745646@bugs.launchpad.net, Mika Westerberg Subject: [PATCH] PCI / PM: Check device_may_wakeup() in pci_enable_wake() Date: Wed, 09 May 2018 00:18:32 +0200 Message-ID: <1823373.ea0yBGqyI6@aspire.rjw.lan> In-Reply-To: <56a8953c-d833-837c-57d5-fe758d4db02a@canonical.com> References: <56a8953c-d833-837c-57d5-fe758d4db02a@canonical.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Rafael J. Wysocki Commit 0847684cfc5f0 (PCI / PM: Simplify device wakeup settings code) went too far and dropped the device_may_wakeup() check from pci_enable_wake() which causes wakeup to be enabled during system suspend, hibernation or shutdown for some PCI devices that are not allowed by user space to wake up the system from sleep (or power off). As a result of this excessive power is drawn by some of the affected systems while in sleep states or off. Restore the device_may_wakeup() check in pci_enable_wake(), but make sure that the PCI bus type's runtime suspend callback will not call device_may_wakeup() which is about system wakeup from sleep and not about device wakeup from runtime suspend. Fixes: 0847684cfc5f0 (PCI / PM: Simplify device wakeup settings code) Reported-by: Joseph Salisbury Signed-off-by: Rafael J. Wysocki --- drivers/pci/pci.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) Index: linux-pm/drivers/pci/pci.c =================================================================== --- linux-pm.orig/drivers/pci/pci.c +++ linux-pm/drivers/pci/pci.c @@ -1910,7 +1910,7 @@ void pci_pme_active(struct pci_dev *dev, EXPORT_SYMBOL(pci_pme_active); /** - * pci_enable_wake - enable PCI device as wakeup event source + * __pci_enable_wake - enable PCI device as wakeup event source * @dev: PCI device affected * @state: PCI state from which device will issue wakeup events * @enable: True to enable event generation; false to disable @@ -1928,7 +1928,7 @@ EXPORT_SYMBOL(pci_pme_active); * Error code depending on the platform is returned if both the platform and * the native mechanism fail to enable the generation of wake-up events */ -int pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable) +static int __pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable) { int ret = 0; @@ -1969,6 +1969,23 @@ int pci_enable_wake(struct pci_dev *dev, return ret; } + +/** + * pci_enable_wake - change wakeup settings for a PCI device + * @pci_dev: Target device + * @state: PCI state from which device will issue wakeup events + * @enable: Whether or not to enable event generation + * + * If @enable is set, check device_may_wakeup() for the device before calling + * __pci_enable_wake() for it. + */ +int pci_enable_wake(struct pci_dev *pci_dev, pci_power_t state, bool enable) +{ + if (enable && !device_may_wakeup(&pci_dev->dev)) + return -EINVAL; + + return __pci_enable_wake(pci_dev, state, enable); +} EXPORT_SYMBOL(pci_enable_wake); /** @@ -1981,9 +1998,9 @@ EXPORT_SYMBOL(pci_enable_wake); * should not be called twice in a row to enable wake-up due to PCI PM vs ACPI * ordering constraints. * - * This function only returns error code if the device is not capable of - * generating PME# from both D3_hot and D3_cold, and the platform is unable to - * enable wake-up power for it. + * This function only returns error code if the device is not allowed to wake + * up the system from sleep or it is not capable of generating PME# from both + * D3_hot and D3_cold and the platform is unable to enable wake-up power for it. */ int pci_wake_from_d3(struct pci_dev *dev, bool enable) { @@ -2114,7 +2131,7 @@ int pci_finish_runtime_suspend(struct pc dev->runtime_d3cold = target_state == PCI_D3cold; - pci_enable_wake(dev, target_state, pci_dev_run_wake(dev)); + __pci_enable_wake(dev, target_state, pci_dev_run_wake(dev)); error = pci_set_power_state(dev, target_state);