From patchwork Fri Jan 5 00:14:04 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Rafael J. Wysocki" X-Patchwork-Id: 855871 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pci-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zCQDG62rmz9s7n for ; Fri, 5 Jan 2018 11:15:26 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751239AbeAEAPM (ORCPT ); Thu, 4 Jan 2018 19:15:12 -0500 Received: from cloudserver094114.home.pl ([79.96.170.134]:54999 "EHLO cloudserver094114.home.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751108AbeAEAPM (ORCPT ); Thu, 4 Jan 2018 19:15:12 -0500 Received: from 79.184.254.214.ipv4.supernova.orange.pl (79.184.254.214) (HELO aspire.rjw.lan) by serwer1319399.home.pl (79.96.170.134) with SMTP (IdeaSmtpServer 0.82) id 134f8969ac661087; Fri, 5 Jan 2018 01:15:10 +0100 From: "Rafael J. Wysocki" To: Linux PM , Linux PCI Cc: Tony Lindgren , "Rafael J. Wysocki" , JeffyChen , Linux Kernel Mailing List , Bjorn Helgaas , Shawn Lin , Brian Norris , Doug Anderson , Rob Herring , Frank Rowand Subject: [PATCH] PM / wakeup: Do not fail dev_pm_attach_wake_irq() unnecessarily Date: Fri, 05 Jan 2018 01:14:04 +0100 Message-ID: <1542734.kK7NjWylRh@aspire.rjw.lan> In-Reply-To: <6120485.xubBpvge6h@aspire.rjw.lan> References: <20171225114742.18920-1-jeffy.chen@rock-chips.com> <20171228165134.GH3875@atomide.com> <6120485.xubBpvge6h@aspire.rjw.lan> MIME-Version: 1.0 Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org From: Rafael J. Wysocki Returning an error code from dev_pm_attach_wake_irq() if device_wakeup_attach_irq() called by it returns an error is pointless, because the wakeup source used by it may be deleted by user space via sysfs at any time and in particular right after dev_pm_attach_wake_irq() has returned. Moreover, it requires the callers of dev_pm_attach_wake_irq() to create that wakeup source via device_wakeup_enable() upfront, but that obviously is racy with respect to the sysfs-based manipulations of it. To avoid the race, modify dev_pm_attach_wake_irq() to simply call device_wakeup_attach_irq() after checking that the wakeup source it is going to use is there (in which case it cannot fail) and set the power.wakeirq field for the device unconditionally. Tested-by: Tony Lindgren Signed-off-by: Rafael J. Wysocki --- drivers/base/power/wakeirq.c | 9 ++++----- drivers/base/power/wakeup.c | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) Index: linux-pm/drivers/base/power/wakeirq.c =================================================================== --- linux-pm.orig/drivers/base/power/wakeirq.c +++ linux-pm/drivers/base/power/wakeirq.c @@ -33,7 +33,6 @@ static int dev_pm_attach_wake_irq(struct struct wake_irq *wirq) { unsigned long flags; - int err; if (!dev || !wirq) return -EINVAL; @@ -45,12 +44,12 @@ static int dev_pm_attach_wake_irq(struct return -EEXIST; } - err = device_wakeup_attach_irq(dev, wirq); - if (!err) - dev->power.wakeirq = wirq; + dev->power.wakeirq = wirq; + if (dev->power.wakeup) + device_wakeup_attach_irq(dev, wirq); spin_unlock_irqrestore(&dev->power.lock, flags); - return err; + return 0; } /** Index: linux-pm/drivers/base/power/wakeup.c =================================================================== --- linux-pm.orig/drivers/base/power/wakeup.c +++ linux-pm/drivers/base/power/wakeup.c @@ -303,7 +303,7 @@ int device_wakeup_attach_irq(struct devi } if (ws->wakeirq) - return -EEXIST; + dev_err(dev, "Leftover wakeup IRQ found, overriding\n"); ws->wakeirq = wakeirq; return 0;