summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWill Song <jinpengsong@google.com>2024-02-28 20:35:18 -0800
committerWill Song <jinpengsong@google.com>2024-03-04 19:09:06 +0000
commit388db6efa004d2fdbbcfd13958197a2641c723b0 (patch)
tree2f24d620a1e4acc7debea855b373cccd784b5ebe
parentfb508a5f8a42b2137db8ff87d91b7f5f38ff9932 (diff)
downloadgs-388db6efa004d2fdbbcfd13958197a2641c723b0.tar.gz
drivers: performance: Fix update df after init
Only access devfreq update code after devfreqs have been initialized. Needed for tick-driven latgov backup work path for synchronization. Test: Flash + Check freq on Perfetto Bug: 325274590 Bug: 327209413 Change-Id: I0b45406d25cc686798845010b27dd366348b0612 Signed-off-by: Will Song <jinpengsong@google.com>
-rw-r--r--drivers/performance/lat_governors/gs_dsulat_devfreq.c2
-rw-r--r--drivers/performance/lat_governors/gs_governor_dsulat.c55
-rw-r--r--drivers/performance/lat_governors/gs_governor_dsulat.h13
-rw-r--r--drivers/performance/lat_governors/gs_governor_memlat.c51
-rw-r--r--drivers/performance/lat_governors/gs_governor_memlat.h7
-rw-r--r--drivers/performance/lat_governors/gs_memlat_devfreq.c2
6 files changed, 89 insertions, 41 deletions
diff --git a/drivers/performance/lat_governors/gs_dsulat_devfreq.c b/drivers/performance/lat_governors/gs_dsulat_devfreq.c
index cf3e67bfe..d78d2406e 100644
--- a/drivers/performance/lat_governors/gs_dsulat_devfreq.c
+++ b/drivers/performance/lat_governors/gs_dsulat_devfreq.c
@@ -385,6 +385,8 @@ static int gs_dsulat_devfreq_probe(struct platform_device *pdev)
if (ret)
dev_warn(dev, "failed create sysfs for devfreq pm_qos_min\n");
+ gs_dsulat_governor_set_devfreq_ready();
+
return 0;
err_devfreq:
diff --git a/drivers/performance/lat_governors/gs_governor_dsulat.c b/drivers/performance/lat_governors/gs_governor_dsulat.c
index 0b1532137..a1450cc9d 100644
--- a/drivers/performance/lat_governors/gs_governor_dsulat.c
+++ b/drivers/performance/lat_governors/gs_governor_dsulat.c
@@ -33,6 +33,7 @@
*/
struct dsulat_data {
bool gov_is_on;
+ bool devfreq_initialized;
struct exynos_devfreq_data *devfreq_data;
struct attribute_group *attr_grp;
int num_cpu_clusters;
@@ -83,16 +84,19 @@ static struct attribute_group dsulat_dev_attr_group = {
*/
static void update_dsulat_gov(struct gs_cpu_perf_data *data, void* private_data)
{
- struct devfreq *df = dsulat_node.devfreq_data->devfreq;
+ struct devfreq *df;
int err;
- mutex_lock(&df->lock);
- df->governor_data = data;
- err = update_devfreq(df);
- if (err)
- dev_err(&df->dev, "dsulat update failed: %d\n", err);
- df->governor_data = NULL;
- mutex_unlock(&df->lock);
+ if (dsulat_node.devfreq_initialized) {
+ df = dsulat_node.devfreq_data->devfreq;
+ mutex_lock(&df->lock);
+ df->governor_data = data;
+ err = update_devfreq(df);
+ if (err)
+ dev_err(&df->dev, "dsulat update failed: %d\n", err);
+ df->governor_data = NULL;
+ mutex_unlock(&df->lock);
+ }
}
/**
@@ -136,9 +140,11 @@ err_start:
static int gov_suspend(struct devfreq *df)
{
dsulat_node.gov_is_on = false;
- mutex_lock(&df->lock);
- update_devfreq(df);
- mutex_unlock(&df->lock);
+ if (dsulat_node.devfreq_initialized) {
+ mutex_lock(&df->lock);
+ update_devfreq(df);
+ mutex_unlock(&df->lock);
+ }
return 0;
}
@@ -152,9 +158,11 @@ static int gov_suspend(struct devfreq *df)
static int gov_resume(struct devfreq *df)
{
dsulat_node.gov_is_on = true;
- mutex_lock(&df->lock);
- update_devfreq(df);
- mutex_unlock(&df->lock);
+ if (dsulat_node.devfreq_initialized) {
+ mutex_lock(&df->lock);
+ update_devfreq(df);
+ mutex_unlock(&df->lock);
+ }
return 0;
}
@@ -172,11 +180,13 @@ static void gov_stop(struct devfreq *df)
dsulat_node.gov_is_on = false;
gs_perf_mon_remove_client(&dsulat_perf_client);
- mutex_lock(&df->lock);
- update_devfreq(df);
- mutex_unlock(&df->lock);
+ if (dsulat_node.devfreq_initialized) {
+ mutex_lock(&df->lock);
+ update_devfreq(df);
+ mutex_unlock(&df->lock);
- sysfs_remove_group(&df->dev.kobj, dsulat_node.attr_grp);
+ sysfs_remove_group(&df->dev.kobj, dsulat_node.attr_grp);
+ }
}
/**
@@ -423,6 +433,13 @@ void gs_dsulat_governor_unregister(void)
}
EXPORT_SYMBOL(gs_dsulat_governor_unregister);
+
+
+void gs_dsulat_governor_set_devfreq_ready(void) {
+ dsulat_node.devfreq_initialized = true;
+}
+EXPORT_SYMBOL(gs_dsulat_governor_set_devfreq_ready);
+
MODULE_AUTHOR("Will Song <jinpengsong@google.com>");
MODULE_LICENSE("GPL");
-MODULE_DESCRIPTION("Google Source Dsulat Governor"); \ No newline at end of file
+MODULE_DESCRIPTION("Google Source Dsulat Governor");
diff --git a/drivers/performance/lat_governors/gs_governor_dsulat.h b/drivers/performance/lat_governors/gs_governor_dsulat.h
index 5e9c2883c..d140504e0 100644
--- a/drivers/performance/lat_governors/gs_governor_dsulat.h
+++ b/drivers/performance/lat_governors/gs_governor_dsulat.h
@@ -15,15 +15,15 @@
int gs_dsulat_governor_register(void);
/**
- * gs_memlat_governor_unregister - Removes governor from the devfreq system.
+ * gs_dsulat_governor_unregister - Removes governor from the devfreq system.
*/
void gs_dsulat_governor_unregister(void);
/**
- * gs_memlat_governor_initialize - Parse and init memlat governor data.
+ * gs_dsulat_governor_initialize - Parse and init dsulat governor data.
*
* Inputs:
- * @governor_node: DTSI node containing memlat data.
+ * @governor_node: DTSI node containing dsulat data.
* @data: Devfreq data for governor.
*
* Returns: Non-zero on error.
@@ -31,4 +31,11 @@ void gs_dsulat_governor_unregister(void);
int gs_dsulat_governor_initialize(struct device_node *governor_node,
struct exynos_devfreq_data *data);
+/**
+ * gs_dsulat_governor_set_devfreq_ready: Informs governor devfreq is initialized.
+ *
+ * TODO: Remove with devfreqs in b/327482673.
+*/
+void gs_dsulat_governor_set_devfreq_ready(void);
+
#endif /* _GS_GOVERNOR_DSULAT_H */
diff --git a/drivers/performance/lat_governors/gs_governor_memlat.c b/drivers/performance/lat_governors/gs_governor_memlat.c
index 8ccba2223..8e95a125d 100644
--- a/drivers/performance/lat_governors/gs_governor_memlat.c
+++ b/drivers/performance/lat_governors/gs_governor_memlat.c
@@ -31,6 +31,7 @@
*/
struct memlat_data {
bool gov_is_on;
+ bool devfreq_initialized;
struct exynos_devfreq_data *devfreq_data;
struct attribute_group *attr_grp;
int num_cpu_clusters;
@@ -84,14 +85,16 @@ static void update_memlat_gov(struct gs_cpu_perf_data *data, void* private_data)
struct devfreq *df;
int err;
- df = memlat_node.devfreq_data->devfreq;
- mutex_lock(&df->lock);
- df->governor_data = data;
- err = update_devfreq(df);
- if (err)
- dev_err(&df->dev, "Memlat update failed: %d\n", err);
- df->governor_data = NULL;
- mutex_unlock(&df->lock);
+ if (memlat_node.devfreq_initialized) {
+ df = memlat_node.devfreq_data->devfreq;
+ mutex_lock(&df->lock);
+ df->governor_data = data;
+ err = update_devfreq(df);
+ if (err)
+ dev_err(&df->dev, "Memlat update failed: %d\n", err);
+ df->governor_data = NULL;
+ mutex_unlock(&df->lock);
+ }
}
/**
@@ -132,9 +135,11 @@ err_start:
static int gov_suspend(struct devfreq *df)
{
memlat_node.gov_is_on = false;
- mutex_lock(&df->lock);
- update_devfreq(df);
- mutex_unlock(&df->lock);
+ if (memlat_node.devfreq_initialized) {
+ mutex_lock(&df->lock);
+ update_devfreq(df);
+ mutex_unlock(&df->lock);
+ }
return 0;
}
@@ -148,9 +153,11 @@ static int gov_suspend(struct devfreq *df)
static int gov_resume(struct devfreq *df)
{
memlat_node.gov_is_on = true;
- mutex_lock(&df->lock);
- update_devfreq(df);
- mutex_unlock(&df->lock);
+ if (memlat_node.devfreq_initialized) {
+ mutex_lock(&df->lock);
+ update_devfreq(df);
+ mutex_unlock(&df->lock);
+ }
return 0;
}
@@ -167,12 +174,13 @@ static void gov_stop(struct devfreq *df)
{
memlat_node.gov_is_on = false;
gs_perf_mon_remove_client(&memlat_perf_client);
+ if (memlat_node.devfreq_initialized) {
+ mutex_lock(&df->lock);
+ update_devfreq(df);
+ mutex_unlock(&df->lock);
- mutex_lock(&df->lock);
- update_devfreq(df);
- mutex_unlock(&df->lock);
-
- sysfs_remove_group(&df->dev.kobj, memlat_node.attr_grp);
+ sysfs_remove_group(&df->dev.kobj, memlat_node.attr_grp);
+ }
}
/**
@@ -414,6 +422,11 @@ void gs_memlat_governor_unregister(void)
}
EXPORT_SYMBOL(gs_memlat_governor_unregister);
+void gs_memlat_governor_set_devfreq_ready(void) {
+ memlat_node.devfreq_initialized = true;
+}
+EXPORT_SYMBOL(gs_memlat_governor_set_devfreq_ready);
+
MODULE_AUTHOR("Will Song <jinpengsong@google.com>");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Google Source Memlat Governor"); \ No newline at end of file
diff --git a/drivers/performance/lat_governors/gs_governor_memlat.h b/drivers/performance/lat_governors/gs_governor_memlat.h
index 2bb577988..094dff05b 100644
--- a/drivers/performance/lat_governors/gs_governor_memlat.h
+++ b/drivers/performance/lat_governors/gs_governor_memlat.h
@@ -31,4 +31,11 @@ void gs_memlat_governor_unregister(void);
int gs_memlat_governor_initialize(struct device_node *governor_node,
struct exynos_devfreq_data *data);
+/**
+ * gs_memlat_governor_set_devfreq_ready: Informs governor devfreq is initialized.
+ *
+ * TODO: Remove with devfreqs in b/327482673.
+*/
+void gs_memlat_governor_set_devfreq_ready(void);
+
#endif /* _GS_GOVERNOR_MEMLAT_H */
diff --git a/drivers/performance/lat_governors/gs_memlat_devfreq.c b/drivers/performance/lat_governors/gs_memlat_devfreq.c
index 3daa70e74..1c8765e90 100644
--- a/drivers/performance/lat_governors/gs_memlat_devfreq.c
+++ b/drivers/performance/lat_governors/gs_memlat_devfreq.c
@@ -268,6 +268,8 @@ static int gs_memlat_devfreq_probe(struct platform_device *pdev)
if (ret)
dev_warn(dev, "failed create sysfs for devfreq pm_qos_min\n");
+ gs_memlat_governor_set_devfreq_ready();
+
return 0;
err_devfreq: