Received: by 2002:a05:6358:1087:b0:cb:c9d3:cd90 with SMTP id j7csp349757rwi; Mon, 10 Oct 2022 00:53:20 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4epDu/6V/s5S8FMvWKrVufbbRN5DqaZ7sIXEp8hvmPWBe7Zr8ETVKEvThfwWXAxUwKBdI5 X-Received: by 2002:a17:902:d4ce:b0:177:fe49:19d2 with SMTP id o14-20020a170902d4ce00b00177fe4919d2mr18312672plg.4.1665388400506; Mon, 10 Oct 2022 00:53:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1665388400; cv=none; d=google.com; s=arc-20160816; b=es2QtJTXWC9UBcaz/JoTL0M1eFZGg5MezfT2t0yXnbBc+I+fWwI2Vf6vgk4VMCHMc/ sJTI5SoVp5Q7Un65H0zixW/N+owpHg2nHWIrKme/ALUWFhmpCjcRCl3iwuZv83h28COf xuxpyelwsGEMIy65xlYkjPXQOEwwETEoJe6NOIJq7S6J2nUhEOjLfnP6ndpeP2GthdKJ X1jgaQmo6AVo0pb/zyiwd3Pg0R93/R1QqLMDKFcLzywTpA+yjt4uxvi/TLBjyUC8zmj0 JIlgIxeXhkurA+niWQRduqgfMV21lelreDXGap/xOoxOkbv+UeVmSCQBCELPf4Z6BZMl 7q/A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=ixZw3eMA5vjgtJ6nlXHkIRblloT3CGK+57+sFWBFpEY=; b=cnDdA4OySjKo+gShk8ZTbFbt2iH+mc0dJk8kzsoF0t4rTQUSXm6GGKuBPaSiimAIfa VUn3yTQzkPDsIqe5Z5Ks/VWV1fOGM6q+ADcivVRsfRq5JxwksuVRUKxsvlOT4yXBScDv ZaDwaVETpBaeCSRH6YfUVbYMS9h92d47CnTtTp/o6npQlcUCPdjCp14SyiQ7PIXP5C0D pfEZwB2UJskiuySz9ynsvv5n7n7z60q3wRO3h8AoC4eE6A3kLq4oVIW37sh0h/BJZEqt TuJRfnAK6vJyCCczzA4rFE443TWkXhTQmMdXgcCHdo5UFv61CQs9zjbXEiVpCm0wjIJj YRnQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id c1-20020a6566c1000000b004197e33daf5si11588229pgw.863.2022.10.10.00.53.09; Mon, 10 Oct 2022 00:53:20 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232395AbiJJHar (ORCPT + 99 others); Mon, 10 Oct 2022 03:30:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40492 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232411AbiJJHaR (ORCPT ); Mon, 10 Oct 2022 03:30:17 -0400 Received: from out28-98.mail.aliyun.com (out28-98.mail.aliyun.com [115.124.28.98]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4C99563FE1; Mon, 10 Oct 2022 00:24:23 -0700 (PDT) X-Alimail-AntiSpam: AC=CONTINUE;BC=0.07454883|-1;CH=green;DM=|CONTINUE|false|;DS=CONTINUE|ham_system_inform|0.00291467-0.00206215-0.995023;FP=0|0|0|0|0|-1|-1|-1;HT=ay29a033018047198;MF=kant@allwinnertech.com;NM=1;PH=DS;RN=5;RT=5;SR=0;TI=SMTPD_---.PY1HaYk_1665386527; Received: from SunxiBot.allwinnertech.com(mailfrom:kant@allwinnertech.com fp:SMTPD_---.PY1HaYk_1665386527) by smtp.aliyun-inc.com; Mon, 10 Oct 2022 15:22:08 +0800 From: Kant Fan To: myungjoo.ham@samsung.com, kyungmin.park@samsung.com, cw00.choi@samsung.com Cc: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2] devfreq: governor: Add a private governor_data for governors in devfreq Date: Mon, 10 Oct 2022 15:22:02 +0800 Message-Id: <20221010072202.78731-1-kant@allwinnertech.com> X-Mailer: git-send-email 2.29.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The member void *data in the structure devfreq can be overwrite by governor_userspace. For example: 1. The device driver assigned the devfreq governor to simple_ondemand by the function devfreq_add_device() and init the devfreq member void *data to a pointer of a static structure devfreq_simple_ondemand_data by the function devfreq_add_device(). 2. The user changed the devfreq governor to userspace by the command "echo userspace > /sys/class/devfreq/.../governor". 3. The governor userspace alloced a dynamic memory for the struct userspace_data and assigend the member void *data of devfreq to this memory by the function userspace_init(). 4. The user changed the devfreq governor back to simple_ondemand by the command "echo simple_ondemand > /sys/class/devfreq/.../governor". 5. The governor userspace exited and assigned the member void *data in the structure devfreq to NULL by the function userspace_exit(). 6. The governor simple_ondemand fetched the static information of devfreq_simple_ondemand_data in the function devfreq_simple_ondemand_func() but the member void *data of devfreq was assigned to NULL by the function userspace_exit(). 7. The information of upthreshold and downdifferential is lost and the governor simple_ondemand can't work correctly. The member void *data in the structure devfreq is designed for a static pointer used in a governor and inited by the function devfreq_add_device(). This patch add an element named governor_data in the devfreq structure which can be used by a governor(E.g userspace) who want to assign a private data to do some private things. Acked-by: MyungJoo Ham Signed-off-by: Kant Fan --- drivers/devfreq/governor_userspace.c | 12 ++++++------ include/linux/devfreq.h | 7 ++++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/drivers/devfreq/governor_userspace.c b/drivers/devfreq/governor_userspace.c index ab9db7adb3ad..d69672ccacc4 100644 --- a/drivers/devfreq/governor_userspace.c +++ b/drivers/devfreq/governor_userspace.c @@ -21,7 +21,7 @@ struct userspace_data { static int devfreq_userspace_func(struct devfreq *df, unsigned long *freq) { - struct userspace_data *data = df->data; + struct userspace_data *data = df->governor_data; if (data->valid) *freq = data->user_frequency; @@ -40,7 +40,7 @@ static ssize_t set_freq_store(struct device *dev, struct device_attribute *attr, int err = 0; mutex_lock(&devfreq->lock); - data = devfreq->data; + data = devfreq->governor_data; sscanf(buf, "%lu", &wanted); data->user_frequency = wanted; @@ -60,7 +60,7 @@ static ssize_t set_freq_show(struct device *dev, int err = 0; mutex_lock(&devfreq->lock); - data = devfreq->data; + data = devfreq->governor_data; if (data->valid) err = sprintf(buf, "%lu\n", data->user_frequency); @@ -91,7 +91,7 @@ static int userspace_init(struct devfreq *devfreq) goto out; } data->valid = false; - devfreq->data = data; + devfreq->governor_data = data; err = sysfs_create_group(&devfreq->dev.kobj, &dev_attr_group); out: @@ -107,8 +107,8 @@ static void userspace_exit(struct devfreq *devfreq) if (devfreq->dev.kobj.sd) sysfs_remove_group(&devfreq->dev.kobj, &dev_attr_group); - kfree(devfreq->data); - devfreq->data = NULL; + kfree(devfreq->governor_data); + devfreq->governor_data = NULL; } static int devfreq_userspace_handler(struct devfreq *devfreq, diff --git a/include/linux/devfreq.h b/include/linux/devfreq.h index 34aab4dd336c..d265af3fb0a4 100644 --- a/include/linux/devfreq.h +++ b/include/linux/devfreq.h @@ -152,8 +152,8 @@ struct devfreq_stats { * @max_state: count of entry present in the frequency table. * @previous_freq: previously configured frequency value. * @last_status: devfreq user device info, performance statistics - * @data: Private data of the governor. The devfreq framework does not - * touch this. + * @data: devfreq core pass to governors, governor should not change it. + * @governor_data: private data for governors, devfreq core doesn't touch it. * @user_min_freq_req: PM QoS minimum frequency request from user (via sysfs) * @user_max_freq_req: PM QoS maximum frequency request from user (via sysfs) * @scaling_min_freq: Limit minimum frequency requested by OPP interface @@ -193,7 +193,8 @@ struct devfreq { unsigned long previous_freq; struct devfreq_dev_status last_status; - void *data; /* private data for governors */ + void *data; + void *governor_data; struct dev_pm_qos_request user_min_freq_req; struct dev_pm_qos_request user_max_freq_req; -- 2.29.0