From patchwork Wed Aug 13 16:01:26 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lina Iyer X-Patchwork-Id: 35369 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-yh0-f69.google.com (mail-yh0-f69.google.com [209.85.213.69]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id B8341203C5 for ; Wed, 13 Aug 2014 16:01:42 +0000 (UTC) Received: by mail-yh0-f69.google.com with SMTP id v1sf36402761yhn.8 for ; Wed, 13 Aug 2014 09:01:42 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe; bh=4PKXNaMBFnKF240WRK0srJZLHBKZa9AAlEeG6LHHOno=; b=ibzsDGUTyV2lxsym0YHB/uMQu/cDjLyCuBwXNxOY7vqvtWKAevfsSU3pKoZaOzYxhS fmK3kux/NxVcmufmS1evyqflYMwikeY3tfo6XOuYK0Hy7NdrgDSKcMJY55exPgpyBqY+ 4f37woFgjIlxjjFeRK50xyfV+FvKv3vtyEsBXI97X3Fmfl/n0yJhlV0fYOOpJZMqlKXc RzdnG/IxEv9GpBaxtH/ia1fQ8HTMpgut1MQQR7HHB3me0nX7uPJzG1ropZYiCUch8MMx JANjdZcZ5s9M1Q2RNO3/wX1Kf5sF7VsQEb4OYcHnHrRl3MH4aGQE6dBd2kyMiziQ8JHv dhfw== X-Gm-Message-State: ALoCoQnA+ihoKIUCh68xgFecW/XR7Z3ZEVlR+epvWDLN6TCDoNHF3Jw2F0UTO1zgb6LIG7QYYSO/ X-Received: by 10.236.23.230 with SMTP id v66mr644091yhv.53.1407945702559; Wed, 13 Aug 2014 09:01:42 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.47.242 with SMTP id m105ls571225qga.84.gmail; Wed, 13 Aug 2014 09:01:42 -0700 (PDT) X-Received: by 10.52.239.108 with SMTP id vr12mr3837760vdc.30.1407945702441; Wed, 13 Aug 2014 09:01:42 -0700 (PDT) Received: from mail-vc0-f180.google.com (mail-vc0-f180.google.com [209.85.220.180]) by mx.google.com with ESMTPS id s15si1352985vdj.75.2014.08.13.09.01.42 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 13 Aug 2014 09:01:42 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.180 as permitted sender) client-ip=209.85.220.180; Received: by mail-vc0-f180.google.com with SMTP id ij19so15165490vcb.39 for ; Wed, 13 Aug 2014 09:01:42 -0700 (PDT) X-Received: by 10.52.120.51 with SMTP id kz19mr1268119vdb.95.1407945702361; Wed, 13 Aug 2014 09:01:42 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.221.37.5 with SMTP id tc5csp342013vcb; Wed, 13 Aug 2014 09:01:41 -0700 (PDT) X-Received: by 10.70.9.195 with SMTP id c3mr4755690pdb.21.1407945701006; Wed, 13 Aug 2014 09:01:41 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id rt17si1808213pac.146.2014.08.13.09.01.40 for ; Wed, 13 Aug 2014 09:01:41 -0700 (PDT) Received-SPF: none (google.com: linux-pm-owner@vger.kernel.org does not designate permitted sender hosts) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751518AbaHMQBj (ORCPT + 14 others); Wed, 13 Aug 2014 12:01:39 -0400 Received: from mail-pd0-f171.google.com ([209.85.192.171]:54650 "EHLO mail-pd0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750757AbaHMQBj (ORCPT ); Wed, 13 Aug 2014 12:01:39 -0400 Received: by mail-pd0-f171.google.com with SMTP id z10so14720553pdj.30 for ; Wed, 13 Aug 2014 09:01:38 -0700 (PDT) X-Received: by 10.69.14.69 with SMTP id fe5mr5012695pbd.22.1407945698741; Wed, 13 Aug 2014 09:01:38 -0700 (PDT) Received: from ubuntu.localdomain (proxy6-global253.qualcomm.com. [199.106.103.253]) by mx.google.com with ESMTPSA id wj10sm2518679pbc.67.2014.08.13.09.01.36 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 13 Aug 2014 09:01:38 -0700 (PDT) From: Lina Iyer To: daniel.lezcano@linaro.org, khilman@linaro.org, ulf.hansson@linaro.org, linux-pm@vger.kernel.org, tglx@linutronix.de, rjw@rjwysocki.net Cc: Lina Iyer , Praveen Chidambaram Subject: [PATCH v2 1/4] QoS: Modify data structures and function arguments for scalability. Date: Wed, 13 Aug 2014 10:01:26 -0600 Message-Id: <1407945689-18494-2-git-send-email-lina.iyer@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1407945689-18494-1-git-send-email-lina.iyer@linaro.org> References: <1407945689-18494-1-git-send-email-lina.iyer@linaro.org> Sender: linux-pm-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: lina.iyer@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.220.180 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , QoS add requests uses a handle to the priority list that is used internally to save the request, but this does not extend well. Also, dev_pm_qos structure definition seems to use a list object directly. The 'derivative' relationship seems to be broken. Use pm_qos_request objects instead of passing around the protected priority list object. Signed-off-by: Praveen Chidambaram Signed-off-by: Lina Iyer Acked-by: Kevin Hilman Acked-by: Kevin Hilman --- drivers/base/power/qos.c | 14 +++++++------- include/linux/pm_qos.h | 7 ++++--- kernel/power/qos.c | 14 ++++++++------ 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/drivers/base/power/qos.c b/drivers/base/power/qos.c index 36b9eb4..67a66b1 100644 --- a/drivers/base/power/qos.c +++ b/drivers/base/power/qos.c @@ -143,7 +143,7 @@ static int apply_constraint(struct dev_pm_qos_request *req, switch(req->type) { case DEV_PM_QOS_RESUME_LATENCY: ret = pm_qos_update_target(&qos->resume_latency, - &req->data.pnode, action, value); + &req->data.lat, action, value); if (ret) { value = pm_qos_read_value(&qos->resume_latency); blocking_notifier_call_chain(&dev_pm_notifiers, @@ -153,7 +153,7 @@ static int apply_constraint(struct dev_pm_qos_request *req, break; case DEV_PM_QOS_LATENCY_TOLERANCE: ret = pm_qos_update_target(&qos->latency_tolerance, - &req->data.pnode, action, value); + &req->data.lat, action, value); if (ret) { value = pm_qos_read_value(&qos->latency_tolerance); req->dev->power.set_latency_tolerance(req->dev, value); @@ -254,7 +254,7 @@ void dev_pm_qos_constraints_destroy(struct device *dev) /* Flush the constraints lists for the device. */ c = &qos->resume_latency; - plist_for_each_entry_safe(req, tmp, &c->list, data.pnode) { + plist_for_each_entry_safe(req, tmp, &c->list, data.lat.node) { /* * Update constraints list and call the notification * callbacks if needed @@ -263,7 +263,7 @@ void dev_pm_qos_constraints_destroy(struct device *dev) memset(req, 0, sizeof(*req)); } c = &qos->latency_tolerance; - plist_for_each_entry_safe(req, tmp, &c->list, data.pnode) { + plist_for_each_entry_safe(req, tmp, &c->list, data.lat.node) { apply_constraint(req, PM_QOS_REMOVE_REQ, PM_QOS_DEFAULT_VALUE); memset(req, 0, sizeof(*req)); } @@ -378,7 +378,7 @@ static int __dev_pm_qos_update_request(struct dev_pm_qos_request *req, switch(req->type) { case DEV_PM_QOS_RESUME_LATENCY: case DEV_PM_QOS_LATENCY_TOLERANCE: - curr_value = req->data.pnode.prio; + curr_value = req->data.lat.node.prio; break; case DEV_PM_QOS_FLAGS: curr_value = req->data.flr.flags; @@ -831,8 +831,8 @@ s32 dev_pm_qos_get_user_latency_tolerance(struct device *dev) mutex_lock(&dev_pm_qos_mtx); ret = IS_ERR_OR_NULL(dev->power.qos) || !dev->power.qos->latency_tolerance_req ? - PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT : - dev->power.qos->latency_tolerance_req->data.pnode.prio; + PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT : + dev->power.qos->latency_tolerance_req->data.lat.node.prio; mutex_unlock(&dev_pm_qos_mtx); return ret; } diff --git a/include/linux/pm_qos.h b/include/linux/pm_qos.h index 9ab4bf7..e1b763d 100644 --- a/include/linux/pm_qos.h +++ b/include/linux/pm_qos.h @@ -60,7 +60,7 @@ enum dev_pm_qos_req_type { struct dev_pm_qos_request { enum dev_pm_qos_req_type type; union { - struct plist_node pnode; + struct pm_qos_request lat; struct pm_qos_flags_request flr; } data; struct device *dev; @@ -112,7 +112,8 @@ static inline int dev_pm_qos_request_active(struct dev_pm_qos_request *req) return req->dev != NULL; } -int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node, +int pm_qos_update_target(struct pm_qos_constraints *c, + struct pm_qos_request *req, enum pm_qos_req_action action, int value); bool pm_qos_update_flags(struct pm_qos_flags *pqf, struct pm_qos_flags_request *req, @@ -210,7 +211,7 @@ int dev_pm_qos_update_user_latency_tolerance(struct device *dev, s32 val); static inline s32 dev_pm_qos_requested_resume_latency(struct device *dev) { - return dev->power.qos->resume_latency_req->data.pnode.prio; + return dev->power.qos->resume_latency_req->data.lat.node.prio; } static inline s32 dev_pm_qos_requested_flags(struct device *dev) diff --git a/kernel/power/qos.c b/kernel/power/qos.c index 884b770..d0b9c0f 100644 --- a/kernel/power/qos.c +++ b/kernel/power/qos.c @@ -161,19 +161,21 @@ static inline void pm_qos_set_value(struct pm_qos_constraints *c, s32 value) * pm_qos_update_target - manages the constraints list and calls the notifiers * if needed * @c: constraints data struct - * @node: request to add to the list, to update or to remove + * @req: request to add to the list, to update or to remove * @action: action to take on the constraints list * @value: value of the request to add or update * * This function returns 1 if the aggregated constraint value has changed, 0 * otherwise. */ -int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node, +int pm_qos_update_target(struct pm_qos_constraints *c, + struct pm_qos_request *req, enum pm_qos_req_action action, int value) { unsigned long flags; int prev_value, curr_value, new_value; int ret; + struct plist_node *node = &req->node; spin_lock_irqsave(&pm_qos_lock, flags); prev_value = pm_qos_get_value(c); @@ -310,7 +312,7 @@ static void __pm_qos_update_request(struct pm_qos_request *req, if (new_value != req->node.prio) pm_qos_update_target( pm_qos_array[req->pm_qos_class]->constraints, - &req->node, PM_QOS_UPDATE_REQ, new_value); + req, PM_QOS_UPDATE_REQ, new_value); } /** @@ -355,7 +357,7 @@ void pm_qos_add_request(struct pm_qos_request *req, INIT_DELAYED_WORK(&req->work, pm_qos_work_fn); trace_pm_qos_add_request(pm_qos_class, value); pm_qos_update_target(pm_qos_array[pm_qos_class]->constraints, - &req->node, PM_QOS_ADD_REQ, value); + req, PM_QOS_ADD_REQ, value); } EXPORT_SYMBOL_GPL(pm_qos_add_request); @@ -409,7 +411,7 @@ void pm_qos_update_request_timeout(struct pm_qos_request *req, s32 new_value, if (new_value != req->node.prio) pm_qos_update_target( pm_qos_array[req->pm_qos_class]->constraints, - &req->node, PM_QOS_UPDATE_REQ, new_value); + req, PM_QOS_UPDATE_REQ, new_value); schedule_delayed_work(&req->work, usecs_to_jiffies(timeout_us)); } @@ -437,7 +439,7 @@ void pm_qos_remove_request(struct pm_qos_request *req) trace_pm_qos_remove_request(req->pm_qos_class, PM_QOS_DEFAULT_VALUE); pm_qos_update_target(pm_qos_array[req->pm_qos_class]->constraints, - &req->node, PM_QOS_REMOVE_REQ, + req, PM_QOS_REMOVE_REQ, PM_QOS_DEFAULT_VALUE); memset(req, 0, sizeof(*req)); }