From patchwork Tue Oct 6 21:57:36 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lina Iyer X-Patchwork-Id: 7340271 Return-Path: X-Original-To: patchwork-linux-pm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 8E53A9F1B9 for ; Tue, 6 Oct 2015 21:57:57 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 8BA2F20557 for ; Tue, 6 Oct 2015 21:57:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9E1DD2063E for ; Tue, 6 Oct 2015 21:57:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752697AbbJFV5z (ORCPT ); Tue, 6 Oct 2015 17:57:55 -0400 Received: from mail-pa0-f44.google.com ([209.85.220.44]:36273 "EHLO mail-pa0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752313AbbJFV5y (ORCPT ); Tue, 6 Oct 2015 17:57:54 -0400 Received: by pablk4 with SMTP id lk4so220830197pab.3 for ; Tue, 06 Oct 2015 14:57:54 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=HdVCWTJUXM+BQiu3mpOofWtv9QJ5jZU7L/TrvEufmhY=; b=Tn2foUV669dly6+18ReTvsKuwruEiAW27REJswO8m89geIV59lkTk6zL97VjdCel2+ +yOt+SfkBkXc6jNn9AH4JmoCAYSi4FAFJbmTPFbpJQ5eyPGBJsx4txc2/LcLfl+212nk mukXl4WCakrWug1a5VxjpiCBNVq7Axcdr1vRaXVkVinB55gPIKdtwGlvbsKfBKmwF4/Q 4UY3d1qlBDIVKXCh72waCjzwxa6QvBNNracznbMzvtyQ3WpEuFX39QbcCYp9eJTiRXMt mcXPSeF7Bgv0f2D+kIUiw0xz4Dvvry7pJYr+9XlK4S6/HTjpNHB3H9qch4FA27loAE+y 9EsA== X-Gm-Message-State: ALoCoQl8mMB3srKl3ZXVZTgPiqJWru4PGgxeEpeAy+O4v6Avcs+82yhBBkuedQW9SMPYHnBQl8/L X-Received: by 10.68.216.193 with SMTP id os1mr49191970pbc.110.1444168674120; Tue, 06 Oct 2015 14:57:54 -0700 (PDT) Received: from ubuntu.localdomain (i-global254.qualcomm.com. [199.106.103.254]) by smtp.gmail.com with ESMTPSA id c16sm35342076pbu.37.2015.10.06.14.57.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 06 Oct 2015 14:57:53 -0700 (PDT) From: Lina Iyer To: linux-pm@vger.kernel.org Cc: grygorii.strashko@ti.com, ulf.hansson@linaro.org, khilman@linaro.org, daniel.lezcano@linaro.org, tglx@linutronix.de, geert+renesas@glider.be, lorenzo.pieralisi@arm.com, sboyd@codeaurora.org, Lina Iyer Subject: [RFC PATCH 2/2] PM / Domains: Atomic counters for domain usage count Date: Tue, 6 Oct 2015 15:57:36 -0600 Message-Id: <1444168656-6576-3-git-send-email-lina.iyer@linaro.org> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1444168656-6576-1-git-send-email-lina.iyer@linaro.org> References: <1444168656-6576-1-git-send-email-lina.iyer@linaro.org> Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Locking a domain to check if the domain can be powered on/off is an expensive operations and could hold up multiple devices executing runtime PM at the same time. In the case where there is atleast one active device, the domain would remain active. This can be easily checked by using an atomic counter to record domain usage. This restricts locking only to the last suspending or the first resuming device. Signed-off-by: Lina Iyer --- drivers/base/power/domain.c | 16 ++++++++++++++-- include/linux/pm_domain.h | 1 + 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index 3af1a63..80f8ea9 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c @@ -204,6 +204,7 @@ static bool genpd_sd_counter_dec(struct generic_pm_domain *genpd) if (!WARN_ON(atomic_read(&genpd->sd_count) == 0)) ret = !!atomic_dec_and_test(&genpd->sd_count); + atomic_dec(&genpd->usage_count); return ret; } @@ -211,6 +212,7 @@ static bool genpd_sd_counter_dec(struct generic_pm_domain *genpd) static void genpd_sd_counter_inc(struct generic_pm_domain *genpd) { atomic_inc(&genpd->sd_count); + atomic_inc(&genpd->usage_count); smp_mb__after_atomic(); } @@ -583,6 +585,9 @@ static int pm_genpd_runtime_suspend(struct device *dev) return ret; } + if (!atomic_dec_and_test(&genpd->usage_count)) + return 0; + /* * If power.irq_safe is set, this routine may be run with * IRQ disabled, so suspend only if the power domain is @@ -620,6 +625,9 @@ static int pm_genpd_runtime_resume(struct device *dev) if (IS_ERR(genpd)) return -EINVAL; + if (atomic_inc_return(&genpd->usage_count) > 1) + goto out; + /* * As we dont power off a non IRQ safe domain, which holds * an IRQ safe device, we dont need to restore power to it. @@ -1400,9 +1408,11 @@ int __pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev, if (ret) genpd_free_dev_data(dev, gpd_data); - else + else { dev_pm_qos_add_notifier(dev, &gpd_data->nb); - + atomic_inc(&genpd->usage_count); + printk("Add device %d\n", atomic_read(&genpd->usage_count)); + } return ret; } @@ -1457,6 +1467,7 @@ int pm_genpd_remove_device(struct generic_pm_domain *genpd, genpd_unlock(genpd); + atomic_dec(&genpd->usage_count); genpd_free_dev_data(dev, gpd_data); return 0; @@ -1799,6 +1810,7 @@ void pm_genpd_init(struct generic_pm_domain *genpd, genpd->gov = gov; INIT_WORK(&genpd->power_off_work, genpd_power_off_work_fn); atomic_set(&genpd->sd_count, 0); + atomic_set(&genpd->usage_count, 0); genpd->status = is_off ? GPD_STATE_POWER_OFF : GPD_STATE_ACTIVE; genpd->device_count = 0; genpd->max_off_time_ns = -1; diff --git a/include/linux/pm_domain.h b/include/linux/pm_domain.h index 613f7a5..7e52923 100644 --- a/include/linux/pm_domain.h +++ b/include/linux/pm_domain.h @@ -55,6 +55,7 @@ struct generic_pm_domain { struct work_struct power_off_work; const char *name; atomic_t sd_count; /* Number of subdomains with power "on" */ + atomic_t usage_count; /* Number of active users of domain "on" */ enum gpd_status status; /* Current state of the domain */ unsigned int device_count; /* Number of devices */ unsigned int suspended_count; /* System suspend device counter */