From patchwork Tue Nov 18 07:31:47 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lina Iyer X-Patchwork-Id: 5326081 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id B4F98C11AC for ; Tue, 18 Nov 2014 07:36:36 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id A9D64200D6 for ; Tue, 18 Nov 2014 07:36:35 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 79E6420179 for ; Tue, 18 Nov 2014 07:36:34 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1XqdI9-0001FW-Bm; Tue, 18 Nov 2014 07:33:37 +0000 Received: from mail-ig0-f169.google.com ([209.85.213.169]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1XqdHv-0001BC-4J for linux-arm-kernel@lists.infradead.org; Tue, 18 Nov 2014 07:33:24 +0000 Received: by mail-ig0-f169.google.com with SMTP id hl2so3380670igb.4 for ; Mon, 17 Nov 2014 23:33:00 -0800 (PST) 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=dsyf/5ZzOwVYQcwTu632cMQWmtMCU4ekqK4hVjB+yOc=; b=Ng6Euc9R8DBkKCn6QPTFm7GPWTnbeDZH0xwsPCMJBECXpzYzkQSBYvUgcufg2UUoYU Jw13hBiRev1lq+cEs9vc0vNTDzMzJ5e6Ovq20jx2jO+W7jBZZxeY1s93CRgBlLwCJLIy SN5vif6wRtpfGmhXx4o2OarlDt2Orw54ppWctJCZFbSwR8oN12J0rIWi7BZ3FO+55lOj OYtyjUKaEgRniaTcRIOkZFtoPC5k9pgzsNz8J9fqEMR7/t3rVMRRdMT+dI5T9Nz79kx+ EM0leNSsUZ/YQCEy8sF++HsFypVf66jeXeSHIiRIjttidy+eHAQ/EOsCMINaR8/zcoAK 7VZQ== X-Gm-Message-State: ALoCoQmQtzdhYlT35T1/htYdgezWw95nGXIyjBdyH0XuL9mC13U41fOBpGHNaSRzawPVLUuC9kM8 X-Received: by 10.42.177.9 with SMTP id bg9mr294527icb.81.1416295980705; Mon, 17 Nov 2014 23:33:00 -0800 (PST) Received: from localhost.localdomain (c-24-8-37-141.hsd1.co.comcast.net. [24.8.37.141]) by mx.google.com with ESMTPSA id w197sm20175215iod.24.2014.11.17.23.32.59 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 17 Nov 2014 23:33:00 -0800 (PST) From: Lina Iyer To: khilman@linaro.org, ulf.hansson@linaro.org, linux-arm-kernel@lists.infradead.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, rjw@rjwysocki.net, daniel.lezcano@linaro.org Subject: [PATCH v4/RFC 1/4] QoS: Modify data structures and function arguments for scalability. Date: Tue, 18 Nov 2014 00:31:47 -0700 Message-Id: <1416295910-40433-2-git-send-email-lina.iyer@linaro.org> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416295910-40433-1-git-send-email-lina.iyer@linaro.org> References: <1416295910-40433-1-git-send-email-lina.iyer@linaro.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20141117_233323_272926_7D2AA8A9 X-CRM114-Status: GOOD ( 16.50 ) X-Spam-Score: -0.7 (/) Cc: Lina Iyer X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_LOW, 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 From: Praveen Chidambaram 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: Lina Iyer 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 636e828..c4d859e 100644 --- a/include/linux/pm_qos.h +++ b/include/linux/pm_qos.h @@ -62,7 +62,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; @@ -115,7 +115,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, @@ -213,7 +214,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 5f4c006..602f5cb 100644 --- a/kernel/power/qos.c +++ b/kernel/power/qos.c @@ -186,19 +186,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); @@ -335,7 +337,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); } /** @@ -380,7 +382,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); @@ -434,7 +436,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)); } @@ -462,7 +464,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)); }